- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Asterisk™: будущее телефонии Второе издание - Джим Меггелен
Шрифт:
Интервал:
Закладка:
1. Asterisk подставляет в выражении вместо ${COUNT} число 3. Выражение, в сущности, превращается в следующее:
exten => 321,n,Set(NEWCOUNT=$[3 + 1])
2. Asterisk вычисляет выражение, суммируя 1 и 3, и заменяет его вычисленным значением, 4:
exten => 321,n,Set(NEWCOUNT=4)
3. Приложение Set() присваивает значение 4 переменной NEWCOUNT. Третий приоритет просто вызывает приложение SayNumber(), которое воспроизводит текущее значение переменной ${NEWCOUNT} (ей было присвоено значение 4 во втором приоритете).
Попробуйте это в своем диалплане.
Операторы
Код диалплана Asterisk записывается на специальном языке сценариев. Это означает, что язык диалплана Asterisk, как любой язык программирования, распознает символы, называемые операторами, которые позволяют оперировать переменными. Рассмотрим типы операторов, используемые в Asterisk: Логические (булевы) операторы
Эти операторы оценивают истинность выражения. С точки зрения вычислений это, по сути, означает, является ли выражение чем-то или оно является ничем (отличный от нуля или нуль, истина или ложь, включен или выключен и т. д.). К логическим операторам относятся:
Помните, что при ссылке на переменную используется просто ее имя, но при ссылке на значение переменной ее имя должно быть заключено в квадратные скобки и перед ними должен стоять знак доллара.
expr1 | expr2
Этот оператор (называемый оператором ИЛИ) в случае истинности выражения expr1 (не пустая строка и не нуль) возвращает результат его вычисления. В противном случае он возвращает результат вычисления выражения expr2.
expr1 & expr2
Это оператор (называемый оператором И) возвращает результат вычисления expr1, если оба выражения истинны (то есть если ни одно из выражений не дает в результате пустой строки или нуля). В противном случае возвращается нуль. expr1 {=, >, >=, <, <=, ! = } expr2
Эти операторы возвращают результаты сравнения целых чисел, если оба аргумента являются целыми числами; в противном случае возвращаются результаты сравнения строк. В результате сравнения получаем 1, если заданное отношение выполняется, или 0, если отношение не выполняется. (Сравнение строк выполняется соответственно текущим локальным настройкам операционной системы.)
Арифметические операторы
Хотите выполнить вычисление? Вам потребуется один из следующих операторов: expr1 {+, -} expr2
Эти операторы возвращают результаты сложения или вычитания целочисленных аргументов. expr1 {*, /, %} expr2
Эти операторы возвращают результаты умножения, целочисленного деления или остаток от деления целочисленных аргументов соответственно.
Оператор регулярного выражения
Также в Asterisk может использоваться оператор регулярного выражения:
expr1 : expr2
Этот оператор сравнивает выражение expr1 с expr2, где последнее должно быть регулярным выражением1. Регулярное выражение привязывается к началу строки посредством явного задания 2.
Больше информации о регулярных выражениях можно найти в полном справочнике Джеффри Е. Ф. Фридла (Jeffrey E. F. Friedl) «Mastering Regular Expressions» (издательство O'Reilly) или по адресу http://www.regula.r- expressions.info.
Если вы не знаете, что делает ~ с регулярными выражениями, вы просто обязаны достать экземпляр книги «Mastering Regular Expressions». Она изменит вашу жизнь!
Если соответствие установлено и шаблон содержит по крайней мере одну подстроку регулярного выражения, ( ... ), возвращается строка, соответствующая 1; в противном случае оператор сопоставления возвращает число совпавших символов. Если соответствия не выявлено и шаблон не содержит подстроку регулярного выражения, возвращается нулевая строка; в противном случае, возвращается 0. Синтаксический анализатор Asterisk версии 1.0 был довольно прост, поэтому обязательным требованием было отделение операторов от всех остальных значений как минимум одним пробелом. Соответственно, следующая запись не обеспечивала бы желаемого результата:
exten => 123,1,Set(TEST=$[2+1]) Такая запись привела бы к присвоению переменной TEST строки 2+1, а не значения 3. Чтобы исправить это, надо поставить пробелы перед оператором и после него:
exten => 234,1,Set(TEST=$[2 + 1]) В Asterisk 1.2 или 1.4 это уже не является обязательным требованием, потому что синтаксический анализатор выражений был доработан с учетом таких типов сценариев. Однако ради удобства чтения по-прежнему рекомендуется отделять операторы пробелами. Чтобы добавить текст в начало или конец переменной, просто поместите его в выражении рядом:
exten => 234,1,Set(NEWTEST=$[blah${TEST}])
Функции диалплана
Функции диалплана делают выражения более мощными; их можно рассматривать как интеллектуальные переменные. Функций диалпла- на позволяют вычислять длины строк, даты и время, контрольные суммы MD5 и т. д., и все в рамках выражения диалплана.
Синтаксис
Функции диалплана имеют следующий основной синтаксис:
ИМЯ_ФУНКЦИИ( аргумент) Как и для переменных, ссылка на имя функции выполняется, как показано выше, а чтобы использовать значение функции, необходимо поставить впереди знак доллара и заключить функцию в фигурные скобки:
$ {ИМЯ_ФУНКЦИИ( аргумент)} Также функции могут инкапсулировать (содержать в себе) другие функции:
${ ИМЯ_ФУНКЦИИ(${ ИМЯ_ФУНКЦИИ( аргумент)})}
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().

