Asterisk™: будущее телефонии Второе издание - Меггелен Джим Ван
exten => 555,1,Dial(${JOHN}) В нашем диалплане Asterisk будет автоматически заменять все ссылки ${JOHN} значением, присвоенным переменной под именем JOHN.
Обратите внимание, что имена переменных чувствительны к регистру. JOHN и John - это разные переменные. Для удобства чтения все имена переменных в примерах будут записываться в верхнем регистре. Также следует помнить, что все переменные, заданные Asterisk, тоже будут записаны прописными буквами. Некоторые переменные, такие как CHANNEL или EXTEN, зарезервированы Asterisk. Не надо пытаться задавать их.
В диалплане используется три типа переменных: глобальные переменные, переменные канала и переменные среды. Кратко рассмотрим каждый из этих типов.
Глобальные переменные
Как следует из их названия, глобальные переменные применяются ко всем добавочным номерам во всех контекстах. Глобальные переменные полезны тем, что могут использоваться в любом месте диалплана, повышая читабельность и обслуживаемость кода. Предположим, имеется большой диалплан и несколько сотен ссылок на канал Zap/1. Теперь представим, что необходимо пересмотреть весь диалплан и изменить все эти ссылки на Zap/2. Это был бы, мягко выражаясь, долгий и чреватый ошибками процесс.
Но если бы в начале диалплана была определена переменная со значением Zap/1 и далее использовались лишь ссылки на нее, потребовалось бы изменить только одну строку.
Глобальные переменные объявляются в контексте [globals] в начале файла extensions.conf. Их можно также задать программно с помощью функции диалплана GLOBALQ[74]. Вот пример использования обоих методов задания переменных в диалплане. В первом варианте глобальной переменной JOHN присваивается значение Zap/1. Эта переменная задается в момент, когда Asterisk выполняет синтаксический разбор диал- плана. Второй пример представляет, как можно задать глобальную переменную в процессе выполнения диалплана. В этом случае переменной George присваивается значение SIP/George при выполнении звонка на добавочный номер 124 в контексте [employees]: [globals] JOHN=Zap/1
[employees]
exten => 124,1,Set(GLOBAL(GEORGE)=SIP/George)
Переменные канала
Переменная канала - это переменная, связанная только с конкретным вызовом. В отличие от глобальных переменных, переменные каналов определяются только на время текущего вызова и доступны лишь для каналов, участвующих в нем.
Для использования в диалплане предопределено множество переменных каналов. Они описаны в файле channelvariables.txt, находящемся в подпапке doc папки исходного кода Asterisk. Переменные каналов задаются с помощью приложения Set():
exten => 125,1,Set(MAGICNUMBER=42) Многие варианты использования переменных каналов будут рассмотрены в главе 6.
Переменные среды
Переменные среды - это средство организации доступа к переменным среды UNIX из Asterisk. Для их использования служит функция диалплана ENV(). Ее синтаксис выглядит следующим образом: ${ENV(var)}, где var - переменная среды UNIX, на которую выполняется ссылка. Переменные среды используются в диалпланах Asterisk не часто, но они доступны на случай необходимости.
Добавление переменных в диалплан
Теперь, ознакомившись с переменными, применим их в нашем диалплане. Добавим глобальные переменные для двух людей, Джона и Джейн:
[globals][globals] JOHN=Zap/1 JANE=SIP/Jane [incoming] exten => 123,1,Answer() exten => 123,n,Background(enter-ext-of-person) exten => 123,n,WaitExten() exten => 1,1,Dial(${JOHN},W) exten => 1,n,Playback(vm-nobodyavail) exten => 1,n,Hangup() exten => 2,1,Dial(${JANE},10) exten => 2,n,Playback(vm-nobodyavail) exten => 2,n,Hangup() exten => i,1,Playback(pbx-invalid) exten => i,n,Goto(incoming,123,1) exten => t,1,Playback(vm-goodbye) exten => t,n,Hangup() [employees] exten => W1,1,Dial(${JOHN}) exten => john,1,Dial(${JOHN}) exten => 102,1,Dial(${JANE}) exten => jane,1,Dial(${JANE})Сопоставление с шаблонами
Если мы хотим предоставить людям возможность осуществлять звонки через Asterisk и желаем, чтобы Asterisk обеспечивала соединение абонента с внешним ресурсом, нам необходим механизм сопоставления любого телефонного номера, который может быть набран абонентом. Можете себе представить, как утомительно было бы вручную писать диалплан с добавочными номерами для всех возможных вариантов? К счастью, у Asterisk есть как раз то, что надо для таких случаев: сопоставление с шаблонами. Благодаря возможности сопоставления с шаблонами в диалплане можно создать один добавочный номер, который будет соответствовать множеству разных номеров.
Синтаксис сопоставления с шаблонами
Используемые в шаблонах буквы и символы представляют определенные группы символов. Шаблоны всегда начинаются с символа подчеркивания (_). Он указывает Asterisk, что выполняется сопоставление с шаблоном, а не с явно заданным добавочным номером. (Безусловно, это означает, что имена добавочных номеров нельзя начинать с символа подчеркивания.)
Если не поставить символ подчеркивания в начале шаблона, Asterisk посчитает, что это просто именованный добавочный номер, и не будет выполнять сопоставления с шаблоном. Это одна из самых распространенных ошибок среди новичков в Asterisk.
После подчерка может использоваться один или более символов из перечисленных ниже.
X
Соответствует любому одиночному числу от 0 до 9.
Z
Соответствует любому одиночному числу от 1 до 9.
N
Соответствует любому одиночному числу от 2 до 9.
[15-7]
Соответствует любому однозначному числу из заданного диапазона. В данном случае шаблон соответствует одиночной цифре 1, 5, 6 или 7.
. (точка)
Универсальное соответствие; соответствует одному или более символам, любым.
1 Если не быть осторожным, сопоставления с групповым символом могут привести к тому, что диалплан будет делать совсем i не то, что предполагается (например, сопоставление с встроен- ными добавочными номерами, такими как i или h). Универсальное соответствие должно использоваться в шаблоне только после того, как сопоставлено максимально возможное количество цифр. Например, следующий шаблон, наверное, не должен применяться никогда:
На самом деле Asterisk предупредит в случае попытки его применения. Лучше по возможности используйте такой шаблон:
_X.
! (восклицательный знак)
Универсальное соответствие; соответствует нулю или более символам, любым.
Чтобы использовать сопоставление с шаблонами в своем диалплане, просто вставьте шаблон на место добавочного номера (или его имени):
exten => _NXX,1,Playback(auth-thankyou) В этом примере шаблон соответствует трехзначному добавочному номеру в диапазоне от 200 до 999 (N соответствует любой цифре от 2 до 9, а каждый X - от 0 до 9). То есть, если бы абонент набрал любой трехзначный добавочный номер в диапазоне от 200 до 999 в данном контексте, он бы услышал звуковой файл auth-thankyou.gsm. Еще одна важная деталь, которую необходимо знать о сопоставлении с шаблонами: если Asterisk находит более одного шаблона, соответствующего набранному добавочному номеру, она будет использовать наиболее точный из них (слева направо). Скажем, задано два следующих шаблона и абонент набирает 555-1212: