Asterisk

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

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


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

${foo}

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

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

Если Вы зададите переменную для какого-либо канала с аналогичным именем, как у существующей глобальной переменной (запомните: определенные пользователем переменные регистронезависимые) то, ссылаясь на это имя переменной в команде, Вы получите значение, которое Вы определили для этой "канальной" переменной (а не значение глобальной переменной). Например, посмотрите сами, что получится, если мы в контексте "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- регистрозависимые.

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

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

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

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

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

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

${ENV(''foo'')}


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

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


${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 символов.

Примеры:

${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})}) ; умножение и т.д.

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


Ссылки по теме:



Источник: http://www.voip-info.org/tiki-index.php?page=Asterisk+Variables



© 2008 — 2012 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH