Asterisk: подключить один канал к другому с помощью AMI

У меня есть Asterisk 11.4.0, удаленный облачный сервер и сервер Node.js в качестве промежуточного программного обеспечения. Когда какая-либо учетная запись пытается позвонить, мне нужна информация с удаленного сервера, какую внешнюю линию использовать (или даже не делать этот звонок вообще!). Эти данные нельзя рассчитать напрямую в Asterisk. Только после ответа облака вызов должен быть продолжен. Моя очередь действий выглядит так:

Захватите инициацию вызова от Asterisk с помощью AMI на промежуточном сервере;

Отправка информации в облако для анализа;

Продолжить вызов с переданной в ответ внешней линией с помощью AMI (или не продолжать вообще);

Проблема в том, что я не знаю, как это сделать. Я думаю, что когда кто-то пытается позвонить, я могу использовать WaitExten в опции диалплана и перехватить событие Newchannel с промежуточным сервером, отправив всю информацию в облако. Когда он отвечает, я могу инициировать вызов, используя существующую очередь ожидания.

Подскажите, как подключить канал к операции Originate, когда я передаю его как параметр "channel", Asterisk не связывает эту линию с вызываемым exten.


person JustLogin    schedule 17.10.2013    source источник


Ответы (1)


Вам нужно использовать FastAGI или AGI (fastagi быстрее, но немного сложнее) для управления потоком вызовов вашего канала.

http://www.voip-info.org/wiki/view/Asterisk+FastAGI

В AGI вы можете получить информацию о звонке, решить, где ее разместить, после чего позвонить с помощью команды Dial. Звонки будут соединяться автоматически.

http://www.voip-info.org/wiki/view/Asterisk+cmd+Dial

Также вы можете использовать действие Bridge ami, чтобы соединить 2 канала, но это не так. Правильный способ - через Dial.

http://www.voip-info.org/wiki/view/Asterisk+cmd+Bridge

Также вы можете использовать в диалплане функцию CURL для запроса помощи через http на внешнем API. Это будет иметь ту же стоимость, что и fastagi, но может быть проще для вас, так как вам нравится node.js.

Если вы используете команду Originate ami, вы можете добавить к этой команде любые переменные через

 "Set" =>  "variablename=somethign"

PS на самом деле почти все можно рассчитать внутри звездочки, конечно, если у вас достаточно знаний об этом. У Asterisk есть полный язык (это означает, что вы можете описать любой алгоритм в диалплане), есть функция запроса информации о базе данных и т. д.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я рекомендую прочитать книгу Asterisk, например "Asterisk - будущее телефонии" ДО создания любого проекта приложения с использованием Asterisk pbx. Если вы проигнорируете это предупреждение, ваше приложение может быть нестабильным и потребовать полной перезаписи после того, как вы запустите его в производство.

person arheops    schedule 18.10.2013
comment
Большое спасибо! Идея передачи переменных великолепна, и книга лучше всего, что я читал об Asterisk. - person JustLogin; 21.10.2013