Техническая база знаний
extensions.ael
Ошибочный синтаксис в конфигурационном файле с расширением ael ведёт к отказу всей маршрутизации на сервере телефонии.
Неверная логика маршрутизации, переадресации вызовов (типа jump), вложенности контекстов может привести к зацикливаниям или создать уязвимости для телефонного «фрикинга». Поэтому работа с номерным планом должно быть крайне внимательной и осознанной.
Управление маршрутизацией на сервере телефонии FBX с помощью файлов конфигурации
Маршрутизация вызовов на сервере телефонии FBX осуществляется по правилам, описанным в конфигурационном файле /etc/asterisk/extensions.conf, файлах с расширением «ael» в директории /etc/asterisk/ и вложенных директориях. Для редактирования файлов конфигурации можно использовать любой доступный текстовый редактор. Для успешного внесения изменений необходимы права администратора системы (root).
Большинство этих файлов содержит описание глобальных правил обработки звонков, необходимые макросы и служебные функции, внесение изменений в которые как правило не требуется.
Основным файлом, в котором описаны правила обработки набранных номеров является extensions.ael
Все правила маршрутизации вызовов с которыми работает сервер телефонии сгруппированы в так называемые «контексты номерного плана». Контекст номерного плана - набор правил обработки вызовов, телефонные номера назначений которых, соответствуют маскам телефонных номеров, указанным в данном контекмте. Также, контексты могут быть включены в иные контексты, описанные в номерном плане. По умолчанию, иерархия контекстов номерного плана построена по принципу матрёшки - более широкий контекст включает в себя правила предыдущего, узкого контекста. Данное разделение введено для возможности ограничения направлений звонков, доступных абонентам сервера телефонии. Контекст номерного плана назначается абоненту в административном web-интерфейсе. Вложенность контекстов описана в файле extensions-tree.ael. Данный файл описывает только иерархию контекстов и не содержит никакой логики маршрутизации вызовов.
Контексты номерного плана в web-интерфейсе
Базовый контекст — default. Предоставляет право вызывать номера внутренних абонентов и использовать некоторые функции сервера телефонии с помощью сервисных кодов (ДВО — дополнительные виды обслуживания). Следующие контексты предоставляют возможность совершать вызовы на городские номера, межгород, международные вызовы. Названия контекстов сформулированы таким образом, чтобы из него было понятно, какие направления вызовов данный контекст содержит.
Работа с файлом extensions.ael
Файл extensions.ael содержи описание следующих основных контекстов:
internal — вызовы внутренних абонентов
misc — сервисные коды и функции (ДВО)
outgoing_moscow — вызовы на городские номера. (Менять название не рекомендуется).
outgoing_mobile — мобильные номера
outgoing_country — межгород
outgoing_international — международная связь
outgoing_emergency — экстренные службы
Маска номера, доступного для обработки в контексте, описывается выражением вида:
_X
где X - любая цифра
Количество X равняется количеству цифр в телефонном номере. Для внутренней нумерации обычно это количество от 3 до 5, для номеров РФ — 11 знаков.
Маску номера можно сократить до вида
_X. (Икс с точкой)
Точка в данном случае означает любое количество символов. Но при использовании такого выражения маска получается максимально не точной.
При обработке звонка в первую очередь обрабатываются наиболее точно описанные маски. Очередность строк при этом не учитывается, то есть маски номера в рамках одного контекста можно размещать на любой строке. Очередность строк будет иметь место, если описаны 2 одинаковые маски. Обработается первое совпадение, следующие строки будут проигнорированы.
Пример
Контекст outgoing_country содержит маски телефонных номеров:
_98XXXXXXXXXX _98800XXXXXXX
При попытке набрать 988007000700, несмотря на то, что маска _98XXXXXXXXXX стоит выше и набранный номер под неё попадает, звонок будет обработан по правилам второй строки, так как маска указана более точно и набранный номер этой маске соответствует.
Маску номера можно добавить в любой контекст, но желательно соблюдать иерархию контекстов для облегчения понимания правил маршрутизации.
Добавление маршрута исходящего звонка
Полностью маршрут исходящего звонка описывается строкой вида
_8XXXXXXXXXX => &dialout(${TRUNK_NAME},${EXTEN},1,);
В данной строке указана маска российского телефонного номера. Далее дается команда запустить макрос dialout и передать в макрос переменные TRUNK_NAME, EXTEN и другие параметры вызова. В данном случае 1 = записать вызов. Обратите внимание, переменные обозначаются знаком $ и заключены в фигурные скобки.
Макрос dialout содержит алгоритм обработки вызова по-умолчанию. Редактировать макрос не рекомендуется, это может привести к ошибкам в обработке звонков в системе.
Переменная TRUNK_NAME содержит имя канала, который необходимо использовать для совершения вызова. Имя переменной может быть любым, но в сервере телефонии FBX принят шаблон TRUNK_NAME. Объявление переменной производится добавлением соответствующей записи в секции globals файла extensions.conf.
Пример
TRUNK_ZADARMA=SIP/zadarma TRUNK_RT=SIP/rostelecom TRUNK_NAME=SIP/system_trunk_name
Сам канал проще всего добавить используя административный web-интерфейс сервера телефонии FBX. System_trunk_name — то имя, которое установлено каналу при добавлении.
Переменная EXTEN - это набранный абонентом сервера телефонии телефонный номер, т. е. Вызываемый номер. В процессе обработки вызова номер можно изменить, убрав из него или добавив к нему цифры. Действия над номером производятся с первой цифры номера. Запись вида
K${EXTEN:Y}
cначала отрежет от номера Y цифр, начиная с первой,
K означат цифру (префикс), которая будет добавлена к номеру.
Пример
Предположим, что абонент набрал номер _98XXXXXXXXXX, а в строке обработки вызова указано 7${EXTEN:2}, т.е. отрезать 2 цифры и добавить цифру 7 как префикс.
После проведения данного преобразования, будет получен номер 7XXXXXXXXXX
В целом, добавить маршрут очень просто. Если канал связи уже подключен к системе ранее, достаточно просто скопировать строку, изменив при этом маску. Либо изменить канал связи, подставив нужный TRUNK_NAME.
Добавление альтернативного маршрута
Один и тот же вызываемый номер может быть вызвана по нескольким каналам связи с учетом его правил вызова по данному каналу. Т.е .в случае недоступности канала связи А, звонок может быть передан каналу связи B, а в случае его недоступности, каналу связи C, и так далее.
Пример
запись правила маршрутизации с использованием 3 каналов связи:
_8XXXXXXXXXX => { &dialout(${EXTEN},${TRUNK_1},${EXTEN},1,1); &dialout(${EXTEN},${TRUNK_2},7${EXTEN:1},1,1); &dialout(${EXTEN},${TRUNK_3},${EXTEN},1,); }
В данном случае строки вида
&dialout(${EXTEN},${TRUNK_NAME},${EXTEN},1,1);
повторяются необходимое количество раз, меняется переменная TRUNK_NAME, производятся преобразования переменной EXTEN, и на первой и второй строке после второй запятой ставится цифра 1, означающая, что будет переход на следующее правило. При обработке звонка в макросе dialout 1 будет равняться next, то есть команде перейти на следующее правило. Порядок строк в данном случае будет иметь значение. Обратите внимание, вся обработка заключена в фигурные скобки.
Другие возможности маршрутизации
Маршрут обработки звонка может не выходить за пределы одного сервера телефонии. Обратите внимание на контекст internal, в котором описаны внутренние вызовы или на контекст misc.
В строках, приведенных там производится передача звонка для обработки в другой контекст с помощью функции jump. Если целевой контекст содержит правило для обработки переданного вызова, то вызов будет обработан по правилам целевого контекста.
Синтаксис файла extensions.ael
При работе с конфигурационными файлами плана маршрутизации большое значение имеет синтаксис выражений.
Не рекомендуется менять синтаксис строк
&dialout(${EXTEN},${TRUNK_NAME},${EXTEN},,);
Допускается только изменение переменных и значений после запятых. Первое значение сделать ли запись разговора, второе значение перейти ли на следующий маршрут. Оба могут быть пустыми либо принять значение 1.
Каждая строка плана маршрутизации должна заканчиваться знаком точка с запятой ;
Контекст должен открываться и закрываться фигурной скобкой.
Группа условий внутри контекста также заключается в фигурные скобки.
И круглые и фигурные скобки должны быть парными (открыли — закрыли)
Применение правил маршрутизации
Для применения правил маршрутизации, требуется войти в CLI asterisk и дать команды перезагрузки плана набора
# asterisk -r CLI> dialplan reload CLI> ael reload
Порядок команд важен.
После выполнения команды ael reload обязательно проверить вывод сообщений на наличие строк, содержащих слова error или fail!