четверг, 7 июля 2016 г.

Исходящий звонок через AJAM c сервера Asterisk

Эта вторая статья из цикла статей "1С и Asterisk без использования внешних компонент". В ней будет рассмотрена возможность осуществления исходящего телефонного звонка по средствам AJAM из 1С.

Итак, в первой статей уже был рассмотрен способ подключения к AMI aka AJAM. Теперь рассмотрим одно из его практических применений. Для этого понадобится еще немного настроить Asterisk и клиентское рабочее место.

Создадим расширение осуществления исходящего телефонного звонка в Asterisk. В конец конфига /etc/asterisk/extensions.conf добавим свою секцию:

[call2back]
exten => _.,1,Answer
exten => _.,1,Wait(1)
exten => _.,n,Dial(Local/${EXTEN}@from-internal,300,Tt)
exten => _.,n,Hangup()

Рассмотрим что она (секция) описывает. call2back - имя секции (контекст команды дозвона) и последовательность действий: ответить на звонок, подождать 1 секунду, начать дозвон к абоненту ${EXTEN} (параметр команды дозвона) и завершить звонок.

На клиентском рабочем месте устанавливаем SIP-клиент и настаиваем автоматический ответ с собственного внутреннего телефонного номера. Например, внутренний номер 0319, следовательно в SIP-клиенте должен быть настроен автоответ на номер 0319.

Теперь для осуществления исходящего звонка через AJAM достаточно выполнить следующую последовательность команд:

1. Авторизация

http://asterisk_ipadress:8088/asterisk/mxml?action=login&username=1cajam&secret=myajamuserpass

параметры username и secret соответственно подставить из своих настроек AMI

2. Дозвон

http://asterisk_ipadress:8088/asterisk/mxml?action=originate&channel=SIP/0319&callerid=0319&timeout=15000&context=call2back&exten=subscriber&priority=1&async=yes

где 0319 - это внутренний номер, call2back - созданное ранее расширение, subscriber - номер телефона того, кому звоним.




В 1С это все можно осуществить через несложный код:

Организация соединения:

Соединение = Новый HTTPСоединение(IP,Port,,,,Таймаут,);

Отправка и чтение запроса:

ТекстКоманды="/asterisk/mxml?action=login&username=1cajam&secret=myajamuserpass";

Куки = "";

Запрос=Новый HTTPЗапрос();
Запрос.АдресРесурса=ТекстКоманды;
Запрос.Заголовки.Вставить("Connection", "keep-alive");
Запрос.Заголовки.Вставить("Cookie", Куки);

Ответ=Соединение.Получить(Запрос);

Куки=Ответ.Заголовки.Получить("Set-Cookie");
Куки=?(Куки=Неопределено,"",Куки);

ТекстКоманды="/asterisk/mxml?action=originate&channel=SIP/0319&callerid=0319&timeout=15000&context=call2back&exten=subscriber&priority=1&async=yes";

Запрос.АдресРесурса=ТекстКоманды;
Запрос.Заголовки.Вставить("Connection", "keep-alive");
Запрос.Заголовки.Вставить("Cookie", Куки);

Ответ=Соединение.Получить(Запрос);

ВАЖНО!!! При последовательном выполнении команд из 1С НЕ ЗАБЫВАТЬ про Cookie и пердкаждой следующей командой их перечитывать.

Ответ возвращается в виде XML и его, конечно, тоже неплохо бы парсить на предмет ошибок, но это уже другая история.


2 комментария:

  1. Спасибо, вот этой стоки мне не хватало) Запрос.Заголовки.Вставить("Connection", "keep-alive");

    ОтветитьУдалить
  2. а как правильно установить Variable? Мне например, надо установить VAR1=1 и VAR2=2. Вот так не получается &Variavle=VAR1=1,VAR2=2

    ОтветитьУдалить