пятница, 18 марта 2016 г.

Передача номера звонящего другому хосту в Asterisk

Возникла необходимость передавать по HTTP информацию о входящих звонках: на этапе входящего звонка (incoming), трубка поднята (answered), трубка положена (hangup).



Этапы incoming и hangup трудностей не вызывают. Просто воспользуемся функцией CURL:
/etc/asterisk/extensions.conf:
[incoming]
exten => s,1,NoOp(${CURL(http://mypage/phone_handler.php,phone=${CALLERID(num)}&action=incoming)})
same => n,Set(CHANNEL(hangup_handler_push)=incoming_hangup_handler,s,1)
same => n,Queue(incoming,rt)

[incoming_hangup_handler]
exten => s,1,NoOp(${CURL(http://mypage/phone_handler.php,phone=${CALLERID(num)}&action=hangup)})

same => n,Return()


Довольно несложно:
Первым делом при приёме звонка вызываем application NoOp (ничего не делать, но выполнить выражение в скобках), в котором совершаем POST-запрос на сервер, передавая CALLERID(num) и состояние звонка.

Оказалось что с 11й версии Asterisk поддерживает Hangup-хэндлеры - экстеншн, действия которого будут выполнены после завершения звонка. В этом экстеншне выполняем такой же трюк с NoOp и CURL.

Но вот как быть передачей состояния "агент очереди поднял трубку".
Здесь нам поможет возможность очереди выполнять заданный макрос при поднятии трубки:
/etc/asterisk/queues.conf:
[incoming]
# остальные настройки очереди
membermacro = incoming_answered_handler


/etc/asterisk/extensions.conf:
[macro-incoming_answered_handler]
exten => s,1,NoOp(${CURL(http://mypage/phone_handler.php,phone=${CALLERID(num)}&action=answered)})


Отлично, макрос выполняется в момент поднятия трубки, но стоп: вместо Caller ID передаётся добавочный номер агента. Это давняя странность Asterisk, я такое встречал еще 6 лет назад. Обнаружилось что есть другая канальная переменная, которая содержит в себе правильное значение: CONNECTEDLINE(num). Заменив ею CALLERID(num), всё заработало.

Итоговые конфиги:
/etc/asterisk/extensions.conf:
[incoming]
exten => s,1,NoOp(${CURL(http://mypage/phone_handler.php,phone=${CALLERID(num)}&action=incoming)})
same => n,Set(CHANNEL(hangup_handler_push)=incoming_hangup_handler,s,1)
same => n,Queue(incoming,rt)

[incoming_hangup_handler]
exten => s,1,NoOp(${CURL(http://mypage/phone_handler.php,phone=${CALLERID(num)}&action=hangup)})

same => n,Return()

[macro-incoming_answered_handler]
exten => s,1,NoOp(${CURL(http://mypage/phone_handler.php,phone=${CONNECTEDLINE(num)}&action=answered)})

/etc/asterisk/queues.conf:
[incoming]
# остальные настройки очереди
membermacro = incoming_answered_handler

Комментариев нет: