Использование переменных в плане набора Asterisk

В Asterisk могут использоваться как глобальные переменные, так и переменные специфичные для каждого канала, которые могут быть использованы как аргументы для команд в плане набора. Для переменных, используемых в плане набора (extensions.conf) используется следующий синтаксис:

${foo}

где foo — имя переменной. Именем переменной может быть цифробуквенная строка, которая должна начинаться с буквы. Переменные, определенные пользователями, не являются регистрозависимыми — ${FOO} и ${Foo} ссылаются на одну и ту же переменную. Но переменные, которые определяются самим Asterisk, являются регистрозависимыми — переменная ${EXTEN} будет работать, но ${exten} — не будет.

Существует три типа переменных: глобальные, переменные специфичные для каждого канала и переменные окружения.

  • Глобальные переменные могут быть определены или в секции [globals] файла конфигурации extensions.conf или используя команду SetGlobalVar в плане набора. Если переменная однажды определена, тогда она может быть использована для любого канала в любое время.
  • Переменные специфичные для каждого канала задаются с помощью команды Set (команда SetVar устарела). Каждый канал использует изолированное пространство для имен переменных, следовательно, для различных вызовов не будет коллизий в значениях переменной с одним и тем же именем и переменная будет автоматически очищена, когда вызов по какому-либо каналу будет завершен.
  • Переменные окружения обеспечивают доступ из Asterisk к переменным окружения unix. Их список можно найти ниже в данной странце.

Если Вы зададите переменную для какого-либо канала с аналогичным именем, как у существующей глобальной переменной (запомните: определенные пользователем переменные регистронезависимые) то, ссылаясь на это имя переменной в команде, Вы получите значение, которое Вы определили для этой «канальной» переменной (а не значение глобальной переменной). Например, посмотрите сами, что получится, если мы в контексте «FooTest» с одним экстеншеном 100, проделаем следующие действия:

[FooTest]
exten => 100,1,SetGlobalVar(FOO=5)
exten => 100,2,NoOp(${FOO})
exten => 100,3,NoOp(${foo})
exten => 100,4,Set(foo=8)
exten => 100,5,NoOp(${FOO})
exten => 100,6,NoOp(${foo})

(Замечание: использование команды NoOp поможет нам отследить наши действия и значения переменных.) Если вы произведете вызов на экстеншен 100 в контексте FooTest, и перед вами консоль Asterisk, которая отображает подробную информацию о происходящем, то Вы увидите приблизительно следующую информацию:

— Executing SetGlobalVar(«Zap/1-1», «FOO=5») in new stack
— Setting global variable ‘FOO’ to ‘5’
— Executing NoOp(«Zap/1-1», «5») in new stack
— Executing NoOp(«Zap/1-1», «5») in new stack
— Executing Set(«Zap/1-1», «foo=8») in new stack
— Executing NoOp(«Zap/1-1», «8») in new stack
— Executing NoOp(«Zap/1-1», «8») in new stack

Мы видим, что после выполнения команды SetGlobalVar, переменные ${FOO} и ${foo} возвращают значение глобальной переменной с присвоенным значением 5. После выполнения команды Set, глобальная переменная «foo» перекрывается канальной переменной «foo»; Обе переменные ${FOO} и ${foo} (на самом деле это одна и та же переменная) имеют значение 8. Тем не менее, значение глобальной переменной остается неизменным и равным 5, и при использовании ее в других каналах будет получено значение глобальной переменной ${foo}, которое по прежнему равно пяти.

Наследование переменных специфичных для каналов

Если мы в команде Set присоединим спереди к имени переменной одиночный символ _ , то в этом случае эта переменная будет унаследована каналом, который будет создан основным каналом, например, при использовании команды Dial(Local/…); . Однажды будучи наследована, эта переменная не будет далее унаследована. В случае, если мы присоединим спереди к имени переменной два символа _, переменная будет наследоваться неограниченное число раз. (Работает только для CVS HEAD, не поддерживается в Asterisk 1.0.9.)

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

[TestInherit]
exten => 100,1,Set( __ FOO=5)
exten => 100,2,Dial(Local/test@CheckInherit)
exten => test,1,NoOp(${FOO})

Как результат, переменная FOO будет унаследована. Без символов подчеркивания, в новом канале типа local эта переменная будет не определена.

Пример

exten => 104,1,Set(FEE=${fee})
exten => 104,2,Set(_FIE=${fie})
exten => 104,3,Set(__FUM=${fum})
exten => 104,4,Dial(Local/105)

exten => 105,1,NoOp(${FEE})
exten => 105,2,NoOp(${FIE})
exten => 105,3,NoOp(${FUM})
exten => 105,4,Dial(Local/106)

exten => 106,1,NoOp(${FEE})
exten => 106,2,NoOp(${FIE})
exten => 106,3,NoOp(${FUM})

как результат получим:

— Executing Set(«SIP/oberon-365e», «FEE=fee») in new stack
— Executing Set(«SIP/oberon-365e», «_FIE=fie») in new stack
— Executing Set(«SIP/oberon-365e», «__FUM=fum») in new stack
— Executing Dial(«SIP/oberon-365e», «Local/105») in new stack
— Called 105
— Executing NoOp(«Local/105@default-7263,2», «») in new stack
— Executing NoOp(«Local/105@default-7263,2», «») in new stack
— Executing NoOp(«Local/105@default-7263,2», «fum») in new stack
— Executing Dial(«Local/105@default-7263,2», «Local/106») in new stack
— Called 106
— Executing NoOp(«Local/106@default-49be,2», «») in new stack
— Executing NoOp(«Local/106@default-49be,2», «») in new stack
— Executing NoOp(«Local/106@default-49be,2», «fum») in new stack

(Этот пример не будет правильно работать в версиях до релиза Asterisk 1.2.)

Предопределенные переменные специфичные для каналов

Ниже приведен список специфичных для каналов переменных устанавливаемых самим Asterisk, значения которых Вы можете использовать в плане набора. В отличии от переменных определенных пользователем, переменные определяемые самим Asterisk- регистрозависимые.

  • ${ACCOUNTCODE}: Код аккаунта, если назначен — см. Asterisk billing. (объявлена устаревшей, начиная с версии 1.2.0 и удалена в версии 1.4.0. Используйте ${CDR(accountcode)} .
  • ${ANSWEREDTIME}: Время, когда на вызов ответили.
  • ${BLINDTRANSFER}: Активный канал SIP, который совершает вызов. Тут будет определено имя SIP канала, который совершает вызов при трансфере вызова типа blind — см. BLINDTRANSFER
  • ${CALLERID(all)} : Текущее значение имени и номера из CallerID — Смотри раздел Установка Callerid, посвященный работе с CallerID в Asterisk версии 1.4
  • ${CALLERID(name)} : Текущее значение имени из CallerID — Переменная ${CALLERIDNAME} использовалась в Asterisk до версии 1.2.0, она объявлена УСТАРЕВШЕЙ, начиная с версии 1.2.0 и удалена в версии 1.4.
  • ${CALLERID(num)} : Текущее значение номера из CallerID — Переменная :${CALLERIDNUM} использовалась в Asterisk до версии 1.2.0, она объявлена УСТАРЕВШЕЙ, начиная с версии 1.2.0 и удалена в версии 1.4.
    (Обратите внимание: значения этой переменной не обязательно должно быть цифровым, как это может показаться из названия, и вполне законно ее значением может быть символ пробела. Для команд, которые оперируют значением этой переменной, (Например, ‘GotoIf’) должен учитываться этот момент).
  • ${CALLINGPRES}: Переменная, содержащая PRI Call ID Presentation, для входящих вызовов (См. callingpres )
  • ${CHANNEL}: Текущее имя канала
  • ${CONTEXT}: Текущее имя контекста
  • ${DATETIME}: Текущее время и дата в формате: DDMMYYYY-HH:MM:SS Эта переменная объявлена устаревшей в версии Asterisk 1.2, вместо нее используйте конструкцию: ${STRFTIME(${EPOCH},,%d%mNaVH:NaVS)})
  • ${DIALEDPEERNAME}: Имя вызываемого абонента. В данный момент не работает, см DIALEDPEERNAME
  • ${DIALEDPEERNUMBER}: Номер вызываемого абонента. В данный момент не работает, см DIALEDPEERNUMBER
  • ${DIALEDTIME}: Время, когда был набран номер. (Работает, только, если вызываемый абонент ответил на вызов?!)
  • ${DIALSTATUS}: Статус вызова. См. DIALSTATUS
  • ${DNID}: Dialed Number Identifier. Для поддержки ограничений на исходящие вызовы, см. DNID
  • ${EPOCH}: Текущее время в UNIX формате (количество секунд прошедшее с 1 января 1970 года)
  • ${EXTEN}: Текущий екстеншен
  • ${HANGUPCAUSE}: Последний код возврата, возвращенный по окончании соединения для Zap канала, соединенного с интерфейсом PRI
  • ${INVALID_EXTEN}: Запрашиваемый екстеншен, для случаев, когда он переадресуется на обработку i (неправильного) екстеншена
  • ${LANGUAGE}: Текущий язык сообщений. См. Asterisk multi-language
  • ${MEETMESECS}: Количество секунд, в течении которых пользователь участвовал в конференции MeetMe.
  • ${PRIORITY}: Текущее значение приоритета.
  • ${RDNIS}: Caller ID, для абонента совершающего переадресацию DNIS. Для поддержки ограничений на исходящие вызовы, см. RDNIS
  • ${SIPDOMAIN}: Домен назначения для исходящего SIP вызова (если присутствует)
  • ${SIP_CODEC}: Используется для установки кодека, для вызова через SIP канал (предположительно не работает в версии 1.0.1, ok в 1.0.3 & 1.0.4, нет уверенности насчет 1.0.2)
  • ${SIPCALLID}: Значение заголовочного поля Call-ID: в сообщениях SIP диалога.
  • ${SIPUSERAGENT}: Значение заголовочного поля «user agent» в сообщениях SIP диалога.
  • ${TIMESTAMP}: Текущая дата и время в формате: YYYYMMDD-HHMMSS Эта переменная объявлена устаревшей в версии Asterisk 1.2, вместо нее используйте конструкцию: ${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)})
  • ${TRANSFERCAPABILITY}: Тип канала.
  • ${TXTCIDNAME}: Результат работы приложения TXTCIDName (см. ниже)
  • ${UNIQUEID}: Текущий уникальный идентификатор вызова
  • ${TOUCH_MONITOR}: используется для «записи одним нажатием» (см. features.conf, и флаги wW для команды dial). Если установлена на обоих концах связи, тогда эта переменная содержит app_args (аргументы) для приложения app_monitor, иначе для нее будут использоваться аргументы по умолчанию: WAV||m

 

Переменные, используемые различными приложениями

Команды некоторых приложений используют значения «канальных» переменных или возвращают в них результат своей работы.

  • Команда AgentCallbackLogin возвращает в ${AGENTBYCALLERID_${CALLERID}}: ID успешно авторизированного агента.
  • Команда ChanIsAvail возвращает в ${AVAILCHAN}: первый доступный канал
  • Команда Dial использует значение переменной ${VXML_URL}: для отправки XML Url в телефон Cisco 7960.
  • Команда Dial использует значение переменной ${ALERT_INFO}: для передачи информации о типе звонка в телефоны Cisco.
  • Команда Dial возвращает в ${CAUSECODE}: Код ошибки, если вызов не удался.
  • Команда Dial возвращает в ${DIALSTATUS}: текстовый код результата последней попытки вызова абонента.
  • Команда Dial использует значение переменной ${TRANSFER_CONTEXT}: Если установлена эта переменная, при выполнении процедуры перевода вызова (#transfer), то будет использоваться для выполнения команд экстеншен из указанного контекста.
  • Команда EnumLookup возвращает в переменной ${ENUM}: результат поиска.
  • Команда Hangup использует значение переменной ${PRI_CAUSE} для установки кодов возврата PRI интерфейса.
  • Команда MeetMe использует значение переменной {MEETME_AGI_BACKGROUND}: для определения AGI скрипта, который необходимо выполнить.
  • Команда MeetMe возвращает в переменной ${MEETMESECS}: количество секунд, которое пользователь провел в конференции.
  • Команда Playback возвращает в переменной ${PLAYBACKSTATUS}: Результат выполнения команды (FAILED|SUCCESS).
  • Команда Queue возвращает в переменной ${QUEUESTATUS}: Причину, по которой, помещенный в очередь, вызов, покинул ее.
  • Команда TXTLookup возвращает в переменной ${TXTCIDNAME}: результат поиска в DNS.
  • Команда VoiceMail возвращает в переменной ${VMSTATUS}: результат выполнения приложения VoiceMail. Возможные значения: SUCCESS | USEREXIT | FAILED .

 

Переменные, специфичные для макросов

При использовании контекстов в качестве макросов, доступны дополнительные специфичные для макросов «канальные» переменные.

  • ${ARG1}: первый аргумент, переданный макросу
  • ${ARG2}: второй аргумент, переданный макросу (и так далее …)
  • ${MACRO_CONTEXT}: Имя контекста екстеншена, вызвавшего данный макрос
  • ${MACRO_EXTEN}: Екстеншен, вызвавший данный макрос
  • ${MACRO_OFFSET}: Устанавливается макросом, для определения приоритета, с которого продолжится выполнение команд, после завершения работы макроса
  • ${MACRO_PRIORITY}: Приоритет екстеншена, на момент вызова данного макроса

 

Переменные окружения

Вы можете получить доступ к переменным окружения unix, используя следующий синтакс:

${ENV(»foo»)}

  • ${ENV(ASTERISK_PROMPT)} : текущий CLI prompt для Asterisk .
  • ${ENV(RECORDED_FILE)} : имя файла, под которым была сохранена последняя запись, сделанная командой Record (доступна в CVS > 2004-03-21)

 

Функции для работы со строками

Размер строки

${LEN(foo)}

возвращает размер строки foo. Например,

exten => 100,1,Set(Fruit=pear)
exten => 100,2,NoOp(${LEN(Fruit)})
exten => 100,3,NoOp(${LEN(${Fruit})})

первая команда NoOp должна показать значение 5 (размер строки «fruit»). Вторая команда NoOp должна показать значение 4 (размер строки «pear»).

Этот метод позволяет производить прекрасную проверку на пустые строки и на переменные содержащие NULL.

Подстроки

${foo:offset:length}

возвращает подстроку строки foo, начиная со смещения offset и ограничивая возвращаемую строку размером в length символов.

  • Если значение offset отрицательное, то смещение будет отсчитываться не от начала строки, а от ее конца.
  • Если значение length пропущено или отрицательное, то размер возвращаемой строки не ограничивается и будет возвращена вся строка, начиная со смещения offset.

Примеры:

${123456789:1} — возвращает строку 23456789
${123456789:-4} — возвращает строку 6789
${123456789:0:3} — возвращает строку 123
${123456789:2:3} — возвращает строку 345
${123456789:-4:3} — возвращает строку 678

Пример использования:

exten => _NXX.,1,Set(areacode=${EXTEN:0:3}) — получаем первые 3 цифры из переменной ${EXTEN}
exten => _516XXXXXXX,1,Dial(${EXTEN:3}) — получаем значение переменной ${EXTEN} после 3 цифры
exten => 100,1,Set(whichVowel=4)
exten => 100,2,Set(foo=AEIOU:${whichVowel}:1) — переменная ${foo} будет иметь значение ‘U’

Соединение строк

Для соединения двух строк, просто напишите директиву, как показано ниже:

${foo}${bar}
555${theNumber}
${longDistancePrefix}555${theNumber}

Математические операции с переменными

Для математических действий с переменными, например, инкремент, умножение, сложение. Просто напишите:

exten => s,1,Set(SOMEVAR=$[${SOMEVAR} + 1]) ; инкремент
exten => s,2,Set(SOMEVAR=$[2 * ${SOMEVAR}]) ; умножение и т.д.
Вы должны использовать пробелы в выражениях, как показано выше.

Начиная с релиза Asterisks 1.2, так же доступна функция MATH…

exten => s,1,Set(SOMEVAR=${MATH(${SOMEVAR}+1)}) ; инкремент
exten => s,2,Set(SOMEVAR=${MATH(2*${SOMEVAR})}) ; умножение и т.д.

Замечания по различным версиям

  • Переменная CALLINGPRES добавлена в CVS HEAD 2004-09-10, включена в релиз Asterisk 1.2
  • Переменная TOUCH_MONITOR добавлена в CVS HEAD 2005-01-05, включена в релиз Asterisk 1.2

Источник: http://asterisk.ru/knowledgebase/Asterisk+variables