Чтение онлайн

на главную - закладки

Жанры

Asterisk™: будущее телефонии Второе издание
Шрифт:

$ {ИМЯ_ФУНКЦИИ( аргумент)} Также функции могут инкапсулировать (содержать в себе) другие функции:

${ ИМЯ_ФУНКЦИИ(${ ИМЯ_ФУНКЦИИ( аргумент)})}

2 3 4 4321

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

Примеры функций диалплана

Часто функции используются в сочетании с приложением 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(выражение?местоназначения1:местоназначения2) Если выражение истинно (возвращает значение true), абонент направляется на местоназначения1. Если выражение ложно (возвращает значение false), абонент направляется по второму адресу. Итак, что обеспечивает возвращение значения true или false? Пустая строка и номер 0 обеспечивают false, все остальное - true. В качестве места назначения может быть задано следующее:

• Метка приоритета в рамках того же добавочного номера, например weasels.

• Добавочный номер и метка приоритета в рамках того же контекста, например 123,weasels.

• Контекст, добавочный номер и метка приоритета, например incoming,123,weasels.

Любое из мест назначения может быть опущено, но не оба одновременно. Если согласно вычислениям

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

Применим GotoIf в примере:

exten => 345,1,Set(TEST=1)

exten => 345,n,GotoIf($[${TEST} = 1]?weasels:iguanas)

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

exten => 345,n(iguanas),Playback(office-iguanas) exten => 345,n,Hangup

Между символами ? и : ничего не указано, таким образом, если выражение оказывается истинным, выполнение диалплана перейдет на следующую строку. Поскольку это именно то, что требуется, указывать метку необязательно.

На самом деле мы не рекомендуем этого делать, потому что такая запись сложна для понимания. Но подобные диалпланы встречаются, поэтому надо просто знать, что данный синтаксис тоже является абсолютно правильным.

; Это другой добавочный номер

exten => weasels,n,Hangup

exten => iguanas,1,Playback(office-iguanas)

exten => iguanas,n,Hangup

При изменении значения, присваиваемого TEST в первой строке, сервер Asterisk должен воспроизводить разные приветствия. Рассмотрим другой пример выполнения переходов по условию. На этот раз будем использовать оба приложения, и Goto, и GotoIf. Выполним счет в обратном направлении от 10 и повесим трубку: exten => 123,1,Set(COUNT=10)

Поделиться:
Популярные книги

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит

Восход. Солнцев. Книга X

Скабер Артемий
10. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга X

Неудержимый. Книга XVIII

Боярский Андрей
18. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVIII

Уязвимость

Рам Янка
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Уязвимость

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Дело Чести

Щукин Иван
5. Жизни Архимага
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Дело Чести

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Попаданка для Дракона, или Жена любой ценой

Герр Ольга
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Попаданка для Дракона, или Жена любой ценой

Неудержимый. Книга XII

Боярский Андрей
12. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XII

(Противо)показаны друг другу

Юнина Наталья
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
(Противо)показаны друг другу

Совок – 3

Агарев Вадим
3. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
7.92
рейтинг книги
Совок – 3