Использование переменных в плане набора 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
Только переменные свои надо подставить