@LayneBuchyn

Как в реалтайме получить статус дозвона из Астериска?

Доброго времени суток.
Я пишу приложение, интегрированное с Астериском, но пока не имел времени, чтобы хорошо разобраться в API Астериска.
Я хотел бы иметь возможность ловить статус дозвона (ANSWERED, BUSY etc.) в реалтайме, во время звонка.
Кто-нибудь может меня направить в правильное русло? Буду благодарен за любую информацию.
Звонки совершаются из приложения путем вызова Action Originate через TCP-сокет.
Заранее спасибо.

UPD: Я узнал об Originate с параметром Async и о том, что можно ловить такой event, как OriginateResponse. Теперь вопрос сводится к такому: как словить этот event?
  • Вопрос задан
  • 4305 просмотров
Пригласить эксперта
Ответы на вопрос 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


Только переменные свои надо подставить
Ответ написан
Комментировать
Veshij
@Veshij
>Я пишу приложение, интегрированное с Астериском, но пока не имел времени, чтобы хорошо разобраться в API Астериска.
Какое-то это пипец какое абсурдное приложение, если вдуматься.
«я тут пишу на Си, но не было времени разобраться, покажите как написать 'hello world'»
«Я пишу приложение под API Яндекс.директа, но у меня не было времени с ним разобраться»
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы