Сергей Маликов
25.08.2019
779

Приложения диалплана Asterisk

В данной статье рассматриваются использование некоторых приложений диалплана в Asterisk (Freepbx). Примеры: распределение вызовов на номера с заданным соотношением, переходы по условию и выполнение математических операций, корректировка набранного абонентом номера и корректировка номера вызывающего абонента для прохождения вызовов через провайдера. Goto() – осуществляет переход на указанные контекст, экстеншен, приоритет. Возможны следующие варианты применения: Goto(контекст,экстеншен,приоритет) Goto(экстеншен,приоритет) […]

В данной статье рассматриваются использование некоторых приложений диалплана в Asterisk (Freepbx). Примеры: распределение вызовов на номера с заданным соотношением, переходы по условию и выполнение математических операций, корректировка набранного абонентом номера и корректировка номера вызывающего абонента для прохождения вызовов через провайдера.

Goto() – осуществляет переход на указанные контекст, экстеншен, приоритет.

Возможны следующие варианты применения:

Goto(контекст,экстеншен,приоритет)
Goto(экстеншен,приоритет)
Goto(приоритет)
IF() — оператор условия, если условие истинно возвращает данные, заданные после символа ‘?’, иначе возвращает данные, заданные после ‘:’.

Также есть приложение GotoIf() — переход по условию. Синтаксис GotoIf(условие?[ назначение1]:назначение2)

exten => s,n,GotoIf($["${Count}" = "3"]?context1:context2)

Переход к context1, если условие (переменная Count равна 3) выполнено, или, если определено, переход в context2, если условие ложно.

RAND(min,max) — выбирает случайное число из заданного диапазона.

NoOp() — используется для вывода информации в консоли. Используется для отладки.

DumpChan() – приложение, также использующееся для отладки. Выводит в консоли информации о вызывающем канале, а также список всех доступных переменных канала.

Вывод приложения DumpChan()
Вывод приложения DumpChan()

В некоторых случаях требуется увеличить/уменьшить значение переменной, например, счетчик в циклах. Для этого используются INC() и DEC() .

INC(VAR) — Увеличивает значение переменной VAR на 1, выводя новое значение.

DEC(VAR) — Уменьшает значение переменной VAR на 1, выводя новое значение.

INC(${VAR}) — неверно, поскольку INC() и DEC() нужно передавать имя переменной, а не ее значение.

MATH(выражение, тип данных возвращаемого результата) – выполняет математические и логические операции(аналогичны операторам в С), второй параметр необязателен.

Set() — Присваивает переменной заданное значение. Необходимо передавать имя переменной

Пример. Распределение вызовов с определенным соотношением. Допустим, необходимо установить, чтобы на оператора 101 попадали в 2 раза чаще, чем на оператора 102.

[ext-local]
exten => 100,1,Goto(ratio,s,1)
[ratio]

;Сгенерируем рандомное число от 1 до 3

exten => s,1,Set(RATIO=${RAND(1,3)})
same => n,DumpChan()
same => n,NoOp(Текущее значение RATIO : ${RATIO})

;Переход в приоритет prefer1 и вызов 101 оператора произойдет в два раза чаще

same => n,GotoIf($[${RATIO}<=2]?prefer1:prefer2)
same => n(prefer1),Dial(SIP/101,120,Tt)
same => n,Hangup()
same => n(prefer2),Dial(SIP/102,120,Tt)
same => n,Hangup()

После всех изменений необходимо войти в консоль астериска и применить изменения.

asterisk –rvvv 
CLI> dialplan reload
Вывод в консоли ratio распределение вызовов с определенным соотношением.

Вывод в консоли ratio распределение вызовов с определенным соотношением.

Пример использования INC и DEC.

В extensions.conf (во freepbx  — extensions_override_freepbx.conf) добавляем

[math]

exten => s,1,NoOp(Инкрементирование)

; Начальное значение переменной

same => n,Set(IncVar=1)

same => n,NoOp(Текущее значение IncVar : ${IncVar})

; Присвоение случайного значения переменной в диапазоне 0 или 1

same => n,Set(RVar=${RAND(0,1)})

;Если значение RVar=1 увеличить IncVar

same => n,Set(IncVar=${IF($[${RVar} = 1]?${INC(IncVar)}:${IncVar})})

; Увеличить значение переменной IncVar на 1

same => n,Set(IncVar=${INC(IncVar)})

same => n,NoOp(Инкрементирование. Текущее значение IncVar is: ${IncVar})

; Уменьшить значение переменной IncVar на 1

same => n,Set(IncVar=${DEC(IncVar)})

same => n,NoOp(Декремент. Текущее значение IncVar is: ${IncVar})

; Из переменной IncVar вычесть 3, результат записать в переменную Res

same => n,Set(Res=${MATH(${IncVar}-3,int)})

same => n,NoOp(${IncVar}-3=${Res})

; Сравнить IncVar с 2, результат записать в переменную Res, тип данных char

same => n,Set(Res=${MATH(${IncVar}==2,char)})

same => n,NoOp(${IncVar}==2 результат ${Res})

same => n,Hangup()

Вывод в консоли Goto, IF, инкремент, декремент, math.
Вывод в консоли Goto, IF, инкремент, декремент, math.

CallerID() используется для получения или установки полей для вызывающего абонента.

Пример. Для корректного прохождения внешних вызовов, требуется изменять CallerID: обрезать ‘+’, если ‘+’ первый символ, установить CallerID, начинающееся c 8.

[from-trunk]

exten => _X,1,Goto(modify-callerid,s,1)

[modify-callerid]

exten => s,1,NoOp(CALLERID(num) = ${CALLERID(num)})

; отрезаем плюс если CallerID в был c плюсом, например  +79009999999

same => n,ExecIf($[«${CALLERID(num):0:1}»=»+»]?Set(CALLERID(num)=${CALLERID(num):1})) 

; устанавливаем CallerID, начинающееся c 8

same => n,Set(CALLERID(num)=8${CALLERID(num):1}))

Вывод в консоли - изменение номера звонящего (callerid).
Вывод в консоли — изменение номера звонящего (callerid).

Пример. Для совершения внешних исходящих вызовов, набранный пользователем номер должен быть передан в корректном (требуемом оператором) формате, и передаваемый CallerID должен быть корректен. Предположим, что пользователи смогут набирать номер, начиная набор с “7”, с “8”, с “+7”. Оператор принимает номера, начинающиеся строго с «8», также, предположим, что для прохождения вызовов через оператора требуется установить свой исходящий CallerID в формате 8ХХХХХХХХХХ, а исходящие внешние вызовы попадают в контекст from-trunk, заданный для транка от этого оператора. Для этого подобно вышеприведенному скрипту (необходимо изменять не ${CALLERID(num)} а ${EXTEN}) нужно модифицировать вызываемый номер и установить CallerID с помощью приложения Set().

[from-trunk]

; модифицируем вызываемый номер, если он был набран с плюсом – отрезаем плюс

exten => _X.,1,ExecIf($[«${EXTEN:0:1}»=»+»]?Set(EXTEN=${EXTEN:1}))

same => n,NoOp(CALLERID абонента = ${CALLERID(num)})

same => n,NoOp(Набран номер = ${EXTEN})

;предположим, что оператором выдан номер 74959999999

same => n,NoOp(Устанавливаем CallerID для исходящих вызовов через оператора в формате 8ХХХХХХХХХХ)

same => n,Set(CALLERID(num)=84959999999)

same => n,NoOp(Модифицируем вызываемый номер, чтобы он начинался c 8)

same => n,Dial(SIP/provider-trunk/8${EXTEN:1},60)

Изменение callerid и корректировка набранного номера для совершения исходящих через транк провайдера
Изменение callerid и корректировка набранного номера для совершения исходящих через транк провайдера
Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.