Блог на Subnets.ru

Мрежи, конфигурация на оборудването, мрежови услуги.

Автоматичен

Има задачи, изпълнението на които е възможно чрез автоматично набиране. например ?

Например вие сте sys.admin, имате локална мрежа и куп оборудване в нея, но не сте на работа денонощно и ако е така, нещо може да се случи в мрежата, например събитие в системата за наблюдение, но не сте на работното място. Разбира се, можете да си изпратите SMS, ако имате такава възможност, но имате сървър Звездичка можете да се обадите и да си кажете какво се е случило 😉

И така, предполагаме, че вече имате инсталиран и конфигуриран сървър. Звездичка, който има достъп до града.

За да осъществим автоматично обаждане, са ни необходими следните неща:

  • генериране на файл за повикване
  • има в плана за набиране (план за набиране (дефиниран в /usr/local/etc/asterisk/extensions.conf)) контекст със списък с действия

Нека започнем с файл за повикване, основният му синтаксис е:

  • Канал: - Кой канал да използвате за разговора
  • CallerID: "name" - Задайте Caller ID, тук е по-лесно да кажем, че можем да зададем Caller ID (номера, от който се обаждаме).
  • MaxRetries: - Максимален брой опити за повикване, по подразбиране 0, което е един опит.
  • RetryTime: - Време в секунди между опитите за набиране, по подразбиране 300 (5 минути).
  • WaitTime: - Колко секунди да изчакате, за да се откачите, 45 по подразбиране.
  • Контекст: - Кой контекст използваме от extensions.conf
  • Разширение: - Кое разширение използваме в избрания контекст (също и в extensions.conf).
  • Приоритет:

- С какъв приоритет започваме.

Дадох непълен списък, пълният списък е достъпен тук. Лично за всяко число създавам свой собствен контекст в extensions.conf .

Съответно, познавайки синтаксиса, вече можем да генерираме файл за повикване, като използваме примера за повикване през SIP канала:

За тези, които са в резервоара, нека анализираме файла за обаждания ред по ред:

  • обадете се на SIP номер 89161112233 чрез sip-доставчика (име от /usr/local/etc/asterisk/sip.conf, за да отидете в града)
  • използвайте идентификатор на повикващия 9998877
  • Максимален брой опити за набиране 2
  • Пауза между опитите 20 секунди
  • Изчакайте 60 секунди, за да се откачите
  • Използвайте контекст с име outgoing_to_89161112233
  • Започнете с разширение (ext) s
  • И започнете с приоритет 1 в разширението s

След като формира файл за повикване, той трябва да бъде поставен в папката:/var/spool/asterisk/outgoing/server Звездичка намирането на файл в тази папка веднага ще се опита да го обработи.

Трябва веднага да кажа, че можете да забавите обработката на файла, т.е. задържат реф. обадете се и го отложете за определено време.

Сървър Звездичка гледа датата на създаване на файла с повикванията и ако промените датата на създаване на дата в бъдеще, тогава Звездичка няма да обработи файла с повикванията, докато не дойде точно тази дата.

Как да го направя ? Много просто, за това използваме командата за докосване, която е достъпна във всички системи Unix.

След като създадем самия файл с повиквания, вземаме и променяме датата на неговото създаване, шаблонът за дата е както следва:

ГОДИНА МЕСЕЦ ДЕН ЧАСИ МИНУТИ . СЕКУНДИ (внимание: пред секундите има точка, това е, което ви трябва, а не печатна грешка).

/ usr/bin/touch -t 1007091918.55 /path/to/call/file.call

Датата на създаване на файла за повикване ще се промени и ако преместите файла в/var/spool/asterisk/outgoing /, съответно Звездичка няма да бъде обработен, докато не дойде зададената дата.

Съвет: по-добре е да генерирате файл за повикване в някаква tmp директория, да извършите всички необходими действия върху тях и след това да преместите (прехвърлите) в/var/spool/asterisk/outgoing/.

Сега нека разгледаме самия контекст, за една система за наблюдение може да бъде така:

Въз основа на този контекст Звездичка набирането на 89161112233 (лицето, вдигнало телефона) ще направи следното:

  • вдига телефона от неговата страна
  • чакай малко
  • ще възпроизвежда записани от вас звукови файлове (посочени са пълните пътеки до файловете)
  • затварям телефона

Как да записвате гласови файлове (какво ще възпроизвеждате) можете да разберете от тази статия.

След като Asterisk завърши файла с повикванията, той го изтрива от директорията/var/spool/asterisk/outgoing/.

Специално разширение 'се провали
Ако на повикването не се отговори и има стандартно разширение с име неуспешно и команда с приоритет 1 в посочения (в .call файла) контекст, контролът ще бъде прехвърлен към тази команда.

Може да се появи друга задача, а именно: ако телефонът не е бил вдигнат по време на автоматично набиране, веднага наберете друг номер. Пример за такава конструкция:

  • първо набираме вътрешния SIP номер (6003) на човека
  • ако вътрешният SIP номер не отговаря/зает/недостъпен - наберете мобилния номер

Изглежда, добре, какво по-лесно може да се напише:

И тогава се оказа, че не всичко е толкова просто. За такова действие ще видите подобно съобщение в конзолата (чрез задаване на подробен набор от ядра 3):

- Изпълнение [неуспешен @ dialsip: 1] Набиране ("OutgoingSpoolFailed", "SIP/6003") в нов стек
[11 февруари 16:57:44] ПРЕДУПРЕЖДЕНИЕ [94371]: channel.c: 3441 ast_request: Не съществува път на преводач за тип канал SIP (роден 65535) до 0
[11 февруари 16:57:44] ПРЕДУПРЕЖДЕНИЕ [94371]: app_dial.c: 1296 dial_exec_full: Не може да се създаде канал от тип „SIP“ (причина 58 - Възможността за носител не е налична)
== Понастоящем всички са заети/претоварени (1: 0/0/1)
== Автоматично преминаване, състоянието на канала „OutgoingSpoolFailed“ е „CHANUNAVAIL“
[11 февруари 16:57:54] ЗАБЕЛЕЖКА [94371]: pbx_spool.c: 356 try_thread: Обаждането не е преминало, причина (8) Претоварване (веригите са заети)

Мустаци ... пристигнаха .... Изкачвайки резултатите от търсене в Google, попаднах на съобщения:

Каналът се оказва OutgoingSpoolFailed и в него Dial and Playback се опитва да се обади и пусне. Как мога да се обадя до SIP и да пусна съобщение, докато не съм успял?

Всъщност аз самият си зададох абсолютно същия въпрос, но нямах отговор и на него в Интернет.

Точно като мен, хората се опитаха да приложат това чрез неуспешно с Goto, System и т.н., но резултатът беше същият - не 🙁

Оказва се, че от starndart разширението не е набрало друг номер, няма да работи ....

Вече си мислех, че не е съдба и ще трябва да хвана DIALSTATUS, да го прехвърля в AGI скрипта (който също ще трябва да бъде написан) и който вече ще реши какво да прави с него (създаване на нов файл за повикване или нещо друго ), но след това се роди още един вариант:

Създаваме файл за повикване с малко по-различно съдържание:

Когато autocaller е името на контекста, а 1 е приоритетът в този контекст. Съответно правим този контекст в extensions.conf:

По този начин ние, като че ли, вече не набираме номер, а конкретно разширяване в контекста и в него предаваме повикването на макроса, ние също създаваме макрос, който се използва в този контекст:

Всъщност този макрос ни позволява вече да контролираме къде и в какъв случай ще отиде повикването. Примерът разбира се е "груб", но основното е принципът, а след това и вашето творчество 😉

И по този начин получаваме желания резултат.

Обратно обаждане

Работи по същия начин като описаното по-горе автоматично набиране, с няколко изключения:

  • файл с повикване се генерира, когато човек се обади на номера, за който е определен обратно извикване.
  • в контекста (context) ние не просто възпроизвеждаме звук, но предлагаме на потребителя да въведе номера, който иска да повика

Какво ни трябва в този случай:

  • разпределете номер за обратно извикване и създайте контекст за него в extensions.conf .
  • "Прехвърлете" повикването към AGI скрипт, който ще провери идентификатора на повикващия, за да види дали този номер е разрешен обратно извикване
  • ако обратно извикване разрешено, тогава той ще генерира файл за повикване.

AGI - това Aстериск Gтрапезария Азnterface.
Aстериск Gтрапезария Азnterface е възможност за разширяване на функционалността Звездичка`но чрез използване на скриптове на много езици за програмиране. Например Perl, PHP, C, Pascal, Bourne Shell.

Да започнем с числото, да речем, че ще са планини. номер 84955556677. Добавете към extensions.conf в контекста, в който се получават всички входящи повиквания:

Тези. обаждане към удължаване (ext) 84955556677 ще бъде прехвърлено AGI php скрипт и след това обаждането ще бъде прекратено незабавно.

AGI скриптове за Звездичка намира се в директорията/usr/local/share/asterisk/agi-bin/.

Защо PHP скрипт? PHP беше избран за AGI, от callback е неразделна част от проект, написан на PHP + MySQL, затова решихме AGI нека е в PHP.
Самият скрипт: http://subnets.ru/files/callback.php.txt

Какво се случва със сценария ?

  • дефинирайте необходимите променливи
  • получаваме данни от Звездичка`но.
  • трупи, къде без тях. Ще сложим всичко, което сме получили в дневника AGI скрипт от Звездичка`ах, това е за отстраняване на грешки, след което можете да изключите регистрирането.
  • проверете идентификационния номер на повикващия за достъп до обратно извикване
  • вижте дали вече има файл за повикване за този номер, ако не, тогава го създайте

Е, остава малко да се направи, а именно какъв би бил контекстът за извикващия номер в extensions.conf .

Да кажем нашите обратно извикване номерът 84955556677 е набран от мобилния 89105647899 и е разрешен обратно извикване (номер 84955556677 е посочен в масива $ allow_num в скрипта), тогава неговият контекст може да изглежда така: