Asterisk™: будущее телефонии Второе издание
Шрифт:
exten => 123,n(start),GotoIf($[${COUNT} > 0]?:goodbye)
exten => 123,n,SayNumber(${COUNT})
exten => 123,n,Set(COUNT=$[${COUNT} - 1])
exten => 123,n,Goto(start)
exten => 123,n(goodbye),Hangup
Проанализируем этот пример. В первом приоритете переменной COUNT присваивается значение 10. Далее COUNT сравнивается с 0. Если ее значение больше нуля, мы переходим к следующему приоритету. (Не забываем, что, если место назначения в приложении GotoIf опущено, управление передается вниз следующему приоритету.) С этого момента воспроизводится номер, из COUNT вычитается 1
Классический пример выполнения переходов по условию с нежностью называют «логикой для защиты от любимой девушки». Если номер Caller ID (ID звонящего) входящего вызова совпадает с номером телефона бывшей девушки абонента, Asterisk выдает сообщение, отличающееся от того, которым он обычно встречает звонки от других абонентов. Несмотря на простоту и примитивность, это хороший пример для изучения переходов по условию в диалплане Asterisk. В этом примере используется функция CALLERID, которая позволяет извлекать информацию о Caller ID (ID звонящего) входящего вызова. Пусть для данного случая номер телефона жертвы будет 888-555-1212: exten => 123,1,GotoIf($[${CALLERID(num)} = 8885551212]?reject:allow) exten => 123,n(allow),Dial(Zap/4) exten => 123,n,Hangup
exten => 123,n(reject),Playback(abandon-all-hope) exten => 123,n,Hangup
В приоритете 1 вызывается приложение GotoIf. Оно указывает Asterisk перейти к метке приоритета reject (отклонить), если номер Caller ID (ID звонящего) соответствует 8885551212, а в противном случае перейти к метке приоритета allow (можно было бы опустить имя метки, позволяя GotoIf просто передать управление далее). Если номер Caller ID (ID звонящего) совпадает с указанным, управление вызовом передается приоритету reject, который воспроизводит нежелательному абоненту неприветливое сообщение. В противном случае делается попытка вызова получателя по каналу Zap/4.
Переходы по условию с временным критерием с помощью GotoIfTime
Другой вариант использования переходов по условию в диалплане - приложение GotoIfTime. GotoIf для принятия решения производит вычисление выражения, тогда как GotoIfTime выбирает, в какую ветвь диалплана выполнить переход, на основании текущего системного времени.
Самое очевидное применение этого приложения - предоставление абонентам разных приветствий до начала рабочего времени и после его окончания.
Приложение GotoIfTime имеет следующий синтаксис:
GotoIfTime( tlmes,days_of_week,days_of_month,months? label)
Одним словом, GotoIfTime передает вызов в заданную метку label, если текущие дата и время соответствуют критерию, заданному параметрами times (время), days_of_week (дни недели), days_of_month (дни месяца) и months (месяцы). Рассмотрим каждый аргумент более подробно:
times
Это список из одного или более временных диапазонов, записанных в 24-часовом формате. Например, период с 9:00
будет задан так: 09:00-17:00. День начинается с 0:00 и заканчивается в 23:59.
Следует отметить, что times прекрасно выполняет циклические переходы. Поэтому, если требуется задать период, когда офис закрыт, в параметре times можно указать 18:00-9:00 - и все будет работать, как ожидается. Обратите внимание, что данная техника применима и для других компонентов GotoIfTime. Например, описать выходные дни можно, задав sat-sun (суббота- воскресенье).
days_of_week
Это список из одного или более дней недели. Дни должны быть заданы как mon, tue, wed, thu, fri, sat и/или sun. Период с понедельника по пятницу можно задать как mon-fri. Вторник и четверг были бы представлены как tue&thu.
Обратите внимание, что можно задавать сочетание диапазонов и отдельных дней, например sun-mon&wed&fri-sat или проще,
wed&fri-mon.
days_of_month
Это список дней месяца. Дни задаются числами от 1 до 31. Период с 7-го до 12-го числа будет представлен как 7-12, а 15-е и 30-е числа месяца будут записаны как 15&30.
months
Это список из одного или более месяцев года. Диапазон месяцев должен быть записан как jan-apr, а если требуется указать месяцы, идущие не по порядку, они записываются через амперсанд, например jan&mar&jun. Также можно комбинировать диапазоны и отдельные месяцы: jan-apr&jun&oct-dec. Если необходимо выбрать все возможные значения для любого из этих аргументов, просто задайте * для него.
В качестве аргумента label может быть задано любое из следующих значений:
• Метка приоритета в рамках того же добавочного номера, например
time_has_passed (время прошло).
• Добавочный номер и приоритет в рамках того же контекста, например 123,time_has_passed.
• Контекст, добавочный номер и приоритет, например incoming,123, time_has_passed.
Теперь, после того как мы ознакомились с синтаксисом, рассмотрим несколько примеров. Следующий пример соответствует промежутку времени с 9:00 утра до 5:59 вечера, с понедельника по пятницу, любого дня месяца, в любой месяц года:
exten => s,1,GotoIfTime(09:00-17:59,mon-fri,*,*?open,s,1)
Если абонент звонит в данные часы, вызов будет направлен в первый приоритет добавочного номера s контекста open. Если вызов поступает в другое время, вне заданного промежутка, он будет направлен в следующий приоритет текущего добавочного номера. Это позволяет выполнять переходы по условию с несколькими временными критериями, как показано в примере ниже (обратите внимание, что более конкретизированные временные диапазоны всегда должны быть указаны перед менее конкретными):