Приложения диалплана 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() – приложение, также использующееся для отладки. Выводит в консоли информации о вызывающем канале, а также список всех доступных переменных канала.
В некоторых случаях требуется увеличить/уменьшить значение переменной, например, счетчик в циклах. Для этого используются 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
Пример использования 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()
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 должен быть корректен. Предположим, что пользователи смогут набирать номер, начиная набор с “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)
Остались вопросы?
Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.