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

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

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

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

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

(Замечание: использование команды 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, переменные $ и $ возвращают значение глобальной переменной с присвоенным значением 5. После выполнения команды Set, глобальная переменная "foo" перекрывается канальной переменной "foo"; Обе переменные $ и $ (на самом деле это одна и та же переменная) имеют значение 8. Тем не менее, значение глобальной переменной остается неизменным и равным 5, и при использовании ее в других каналах будет получено значение глобальной переменной $, которое по прежнему равно пяти.

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

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

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

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

Пример

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

— 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 billing. (объявлена устаревшей, начиная с версии 1.2.0 и удалена в версии 1.4.0. Используйте $.
  • $ : Время, когда на вызов ответили.
  • $ : Активный канал SIP, который совершает вызов. Тут будет определено имя SIP канала, который совершает вызов при трансфере вызова типа blind - см. BLINDTRANSFER
  • $ : Текущее значение имени и номера из CallerID - Смотри раздел Установка Callerid, посвященный работе с CallerID в Asterisk версии 1.4
  • $ : Текущее значение имени из CallerID - Переменная $ использовалась в Asterisk до версии 1.2.0, она объявлена УСТАРЕВШЕЙ, начиная с версии 1.2.0 и удалена в версии 1.4.
  • $ : Текущее значение номера из CallerID - Переменная :$ использовалась в Asterisk до версии 1.2.0, она объявлена УСТАРЕВШЕЙ, начиная с версии 1.2.0 и удалена в версии 1.4. (Обратите внимание: значения этой переменной не обязательно должно быть цифровым, как это может показаться из названия, и вполне законно ее значением может быть символ пробела. Для команд, которые оперируют значением этой переменной, (Например, 'GotoIf') должен учитываться этот момент).
  • $ : Переменная, содержащая PRI Call ID Presentation, для входящих вызовов (См. callingpres )
  • $ : Текущее имя канала
  • $ : Текущее имя контекста
  • $ : Текущее время и дата в формате: DDMMYYYY-HH:MM:SS Эта переменная объявлена устаревшей в версии Asterisk 1.2, вместо нее используйте конструкцию: $)
  • $ : Имя вызываемого абонента. В данный момент не работает, см DIALEDPEERNAME
  • $ : Номер вызываемого абонента. В данный момент не работает, см DIALEDPEERNUMBER
  • $ : Время, когда был набран номер. (Работает, только, если вызываемый абонент ответил на вызов?!)
  • $ : Статус вызова. См. DIALSTATUS
  • $ : Dialed Number Identifier. Для поддержки ограничений на исходящие вызовы, см. DNID
  • $ : Текущее время в UNIX формате (количество секунд прошедшее с 1 января 1970 года)
  • $ : Текущий екстеншен
  • $: Последний код возврата, возвращенный по окончании соединения для Zap канала, соединенного с интерфейсом PRI
  • $ : Запрашиваемый екстеншен, для случаев, когда он переадресуется на обработку i (неправильного) екстеншена
  • $ : Текущий язык сообщений. См. Asterisk multi-language
  • $ : Количество секунд, в течении которых пользователь участвовал в конференции MeetMe.
  • $ : Текущее значение приоритета.
  • $ : Caller ID, для абонента совершающего переадресацию DNIS. Для поддержки ограничений на исходящие вызовы, см. RDNIS
  • $ : Домен назначения для исходящего SIP вызова (если присутствует)
  • $ : Используется для установки кодека, для вызова через SIP канал (предположительно не работает в версии 1.0.1, ok в 1.0.3 & 1.0.4, нет уверенности насчет 1.0.2)
  • $ : Значение заголовочного поля Call-ID: в сообщениях SIP диалога.
  • $ : Значение заголовочного поля "user agent" в сообщениях SIP диалога.
  • $ : Текущая дата и время в формате: YYYYMMDD-HHMMSS Эта переменная объявлена устаревшей в версии Asterisk 1.2, вместо нее используйте конструкцию: $)
  • $ : Тип канала.
  • $ : Результат работы приложения TXTCIDName (см. ниже)
  • $ : Текущий уникальный идентификатор вызова
  • $ : используется для "записи одним нажатием" (см. features.conf, и флаги wW для команды Dial). Если установлена на обоих концах связи, тогда эта переменная содержит app_args (аргументы) для приложения app_monitor, иначе для нее будут использоваться аргументы по умолчанию: WAV||m
Переменные, используемые различными приложениями
  • Команда AgentCallbackLogin возвращает в $: ID успешно авторизированного агента.
  • Команда ChanIsAvail возвращает в $ : первый доступный канал
  • Команда Dial. ()" >Dial использует значение переменной $ : для отправки XML Url в телефон Cisco 7960.
  • Команда Dial. ()" >Dial использует значение переменной $ : для передачи информации о типе звонка в телефоны Cisco.
  • Команда Dial. ()" >Dial возвращает в $ : Код ошибки, если вызов не удался.
  • Команда Dial. ()" >Dial возвращает в $: текстовый код результата последней попытки вызова абонента.
  • Команда Dial. ()" >Dial использует значение переменной $: Если установлена эта переменная, при выполнении процедуры перевода вызова (#transfer), то будет использоваться для выполнения команд экстеншен из указанного контекста.
  • Команда EnumLookup возвращает в переменной $ : результат поиска.
  • Команда Hangup использует значение переменной $ для установки кодов возврата PRI интерфейса.
  • Команда MeetMe использует значение переменной : для определения AGI скрипта, который необходимо выполнить.
  • Команда MeetMe возвращает в переменной $ : количество секунд, которое пользователь провел в конференции.
  • Команда Playback возвращает в переменной $ : Результат выполнения команды (FAILED|SUCCESS).
  • Команда Queue возвращает в переменной $ : Причину, по которой, помещенный в очередь, вызов, покинул ее.
  • Команда TXTLookup возвращает в переменной $ : результат поиска в DNS.
  • Команда VoiceMail возвращает в переменной $ : результат выполнения приложения VoiceMail. Возможные значения: SUCCESS | USEREXIT | FAILED .
Переменные, специфичные для макросов
  • $: первый аргумент, переданный макросу
  • $: второй аргумент, переданный макросу (и так далее . )
  • $: Имя контекста екстеншена, вызвавшего данный макрос
  • $: Екстеншен, вызвавший данный макрос
  • $: Устанавливается макросом, для определения приоритета, с которого продолжится выполнение команд, после завершения работы макроса
  • $: Приоритет екстеншена, на момент вызова данного макроса

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

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

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

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

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

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

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

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

Подстроки

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

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

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

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

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

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

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

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

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