Как вы, вероятно, уже заметили, необходимо быть очень внимательным с открывающими и закрывающими скобками. В примере выше парные открывающие и закрывающие круглые и фигурные скобки обозначены одинаковыми числами.
Примеры функций диалплана
Часто функции используются в сочетании с приложением Set() для получения или задания значения переменной. В качестве простого примера рассмотрим функцию LEN(). Эта функция вычисляет длину строки, заданной в качестве ее аргумента. Вычислим длину строки переменной и воспроизведем это значение для абонента: exten => 123,1,Set(TEST=example) exten => 123,n,SayNumber(${LEN(${TEST})})
Приведенный пример определит, что строка example содержит семь символов, задаст это значение как длину переменной и воспроизведет это число пользователю с помощью приложения SayNumber().
Рассмотрим еще один простой пример. Если бы мы захотели задать время ожидания для одного из каналов, то могли бы использовать функцию TIMEOUT(). Функция TIMEOUT() принимает один из трех аргументов: absolute (абсолютное), digit (между цифрами) и response (ответ). Чтобы задать максимальный промежуток времени между вводом цифр с помощью функции TIMEOUT(), можно воспользоваться приложением Set():
exten => s,1,Set(TIMEOUT(digit)=30) Обратите внимание на то, что функция не заключена в символы ${ }. Как и присвоение значения переменной, присвоение значения функции выполняется без использования символов ${ }.
Полный список доступных функций можно получить, введя команду core show functions в интерфейсе командной строки Asterisk. Также они представлены в приложении F.
Выполнение переходов по условию
После краткого ознакомления с выражениями и функциями пришло время использовать их на практике. Применение выражений и функций позволяет усложнить логику диалплана. Возможность принятия решений в диалплане обеспечивается выполнением
Приложение GotoIf()
Ключ к выполнению переходов по условию - приложение GotoIf(). GotoIf() вычисляет выражение и отправляет абонента в соответствующее место назначения в зависимости от истинности или ложности выражения.
GotoIf() использует особый синтаксис, который часто называют условным:
GotoIf(
• Метка приоритета в рамках того же добавочного номера, например weasels.
• Добавочный номер и метка приоритета в рамках того же контекста, например 123,weasels.
• Контекст, добавочный номер и метка приоритета, например incoming,123,weasels.
Любое из мест назначения может быть опущено, но не оба одновременно. Если согласно вычислениям переход должен осуществляться по месту назначения, которое не задано, Asterisk просто переходит к следующему приоритету текущего добавочного номера.
Применим GotoIf() в примере:
exten => 345,1,Set(TEST=1)
exten => 345,n,GotoIf($[${TEST} =
exten => 345,n(weasels),Playback(weasels-eaten-phonesys)
exten => 345,n,Hangup()
exten => 345,n(lguanas),Playback(office-iguanas)
exten => 345,n,Hangup()
Вы заметите, что за каждым приложением Playback() следует приложение Hangup(). Это делается для того, чтобы при переходе на метку weasels вызов заканчивался до того, как начинается воспроизведение звукового файла office-ig'uanas. Все чаще можно увидеть добавочные номера, разбитые на несколько компонентов (разделенных между собой командой Hangup()), каждый из которых представляет собой этапы, выполняемые следом за GotoIf().
Обычно при такой схеме, когда требуется оградить Asterisk от выполнения следующего приоритета после выполнения перехода, вероятно, лучше в качестве места назначения использовать другие добавочные номера, а не метки приоритетов. Во всяком случае, это делает диал- план несколько понятнее. Предыдущий фрагмент диалплана можно было бы переписать следующим образом: exten => 345,1,Set(TEST=1)
exten => 345,n,GotoIf($[${TEST} = 1]?weasels,1:iguanas,1); теперь переход
; выполняется к
exten => weasels,1,Playback(weasels-eaten-phonesys); это НЕ метка.
Предоставление условного перехода только на случай ложности выражения
Предыдущий пример можно было бы записать следующим образом:
exten => 345,1,Set(TEST=1)
exten => 345,n,GotoIf($[${TEST} = 1]?:iguanas) ; здесь больше нет ; метки weasels, но это будет по-прежнему работать exten => 345,n,Playback(weasels-eaten-phonesys) exten => 345,n,Hangup()