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

Приложения диалплана 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 и корректировка набранного номера для совершения исходящих через транк провайдера
 
avatar
  Подписаться  
Уведомление о

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

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

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

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

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

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices