Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (2)

Лучшие ответы пользователя

Все ответы (2)
  • Как в реалтайме получить статус дозвона из Астериска?

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


    Только переменные свои надо подставить
    Ответ написан
    Комментировать