Реализация задержки ответа на вызов в Asterisk
Расскажем немного технических моментов связанных с внедрением iqAntibot в колл-центры.При тестировании у одного из клиентов потребовалось минимизировать получение вызовов операторами колл-центра, а также в случае если вызов отбит антиботом - не передавать ответ вызова на сервер колл-центра, инициализировавшего вызов и отклонить вызов с конкретным SIP ответом, который будет зафиксирован в статистике КЦ. При этом расширить логику и обработать заголовок Reason в BYE на стороне КЦ нельзя.
Изначально решение казалось простым:
- Добавляем промежуточный Asterisk между КЦ и Antibot
- Проигрываем анонс набранному клиенту с помощью опции A(), пр том Asterisk "задержит" ответ вызывающему до момента окончания анонса
- Если во время проигрывания анонса вызов разорвался, в зависимости от причины, используем нужный параметр в Hangup(), продолжив выполнение после Dial() с помощью опции g()
Изначальный наборосок диалплана выглядел так (но как мы ошибались):
exten => _X!,1,Dial(PJSIP/${EXTEN}@termination,,gA(announce))
same => n,Hangup(21)
Всё оказалось не совсем так просто (итоговый диалплан зафиксирован в нашей базе знаний), вот те проблемы которые мы решили в процессе выработки решения для клиента:
- PJSIP не поддерживает Reason с SIP кодом в модуле res_pjsip_rfc3326 (реализован патч)Добавлено получение SIP кода и конвертация его Q.850 код, который в итоге и доступен в переменной HANGUPCAUSEВнимание нужно обратить на то что переменная устанавливается для вызываемого канала, в диплане непосредственно после команды Dial переменная не доступнаДанные модуль ещё можно улучшить передав непосредственно код и описание через функцию HANGUPCAUSE(), возможно сделаем это в будущем.
- Обнаружили баг, заключающийся в том, что опция g не срабатывает при разрыве соединения во время проигрывания анонса (багрепорт), реализовано обходное решение:Хук на завершение вызываемого канала (также в нём происходит получение HANGUPCAUSE)Хук устанавливается в помощью вызова процедуры при инициализации канала (опция b() в Dial())Используется приложение ChannelRedirect() для переадресации вызывающего канала
Рабочий момент, который показывает, как благодаря гибкости и доступности модификаций мы используем Asterisk для решения задач клиентов.