artem
14.03.2018
7497

Как не терять звонок, когда звонящий набирает недоступный внутренний номер в IVR FreePBX

В модуле FreePBX IVR есть защита от набора несуществующего номера, но нет защиты от неответа или недоступности существующего номера. В данной статье будет описан сценарий обработки входящих вызовов, который позволит в этих случаях обрабатывать вызов так же, как если бы звонящий ввёл несуществующий номер. Приведённый сценарий рассчитан также на Follow Me и на донабор внутренних номеров, расположенных не на текущем сервере телефонии.
Настройки, приведённые в статье, рассчитаны на FreePBX 13.

Сохранение звонков

Настройки в web-интерфейсе FreePBX

В FreePBX нужно создать IVR с произвольными параметрами, но обязательно с выключенным донабором внутренних номеров — его мы напишем в диалплане сами.

Inbound IVR

Все остальные настройки относятся к правке диалплана Asterisk.

Изменения в диалплане

Добавление обработки переменной RETURN_AT_ONCE в контексты FreePBX

Первое, что требуется сделать — получить в диалплане, сгенерированном FreePBX, универсальный механизм, позволяющий возвращаться из вызова внутреннего номера (включая Follow Me) и вызова номера через транк, до выполнения стандартных обработчиков завершения этих вызовов. Для этого в диалплане будет устанавливаться флаг RETURN_AT_ONCE=true, а в контекстах, вызываемых через Macro и Gosub, будет выполняться соответственно MacroExit и Return сразу после завершения приложения Dial, если флаг установлен. Такой механизм нам нужен в следующих контекстах:
macro-dial-one — для вызова внутренних номеров
macro-dialout-trunk и контексты outrt-*, относящиеся к интересующим нас маршрутам — для вызова внутренних номеров, расположенных не на текущем сервере телефонии
followme-check и followme-sub — для Follow Me

macro-dial-one, macro-dialout-trunk, followme-check и followme-sub

Эти контексты нужно скопировать из файла /etc/asterisk/extensions_additional.conf в файл /etc/asterisk/extensions_override_freepbx.conf и внести в них проверки флага RETURN_AT_ONCE. В архиве. в файле extensions_override_freepbx.conf есть все указанные контексты, изменения выделены комментариями (диалплан может немного отличаться между подверсиями FreePBX, поэтому желательно скопировать свои версии контекстов из файла /etc/asterisk/extensions_additional.conf и внести в них изменения по приложенному файлу).

outrt-*

В эти контексты в каждый экстеншен нужно добавить строку

same  => n,ExecIf($[«${RETURN_AT_ONCE}» = «true»]?Return())

после всех вызовов macro-dialout-trunk. Для этого можно внести правки в файл FreePBX /var/www/html/admin/modules/core/functions.inc.php — нужно добавить строку

$ext->add($context, $exten, », new ext_execif(‘$[«${RETURN_AT_ONCE}» = «true»]’,’Return’,»));

сразу после цикла

foreach ($trunks as $trunk_id) {
        if (isset($trunk_table[$trunk_id])) switch(strtolower($trunk_table[$trunk_id][‘tech’])) {
                case ‘dundi’:
                $trunk_macro = ‘dialout-dundi’;
                break;
                case ‘enum’:
                $trunk_macro = ‘dialout-enum’;
                break;
                default:
                $trunk_macro = ‘dialout-trunk’;
                break;
        }
        $ext->add($context, $exten, », new ext_macro(
        $trunk_macro, $trunk_id . ‘,’ . $pattern[‘prepend_digits’] . ‘${EXTEN’ . $offset . ‘},’ . $password . ‘,’ . $trunk_table[$trunk_id][‘continue’]));
        $password = »;
        $trunk_type_needed[‘macro-‘ . $trunk_macro] = true;
}

Затем применить настройки FreePBX.

Добавление контекстов для реализации описываемого сценария

Для реализации описываемого сценария приведённые ниже контексты нужно добавить в файл /etc/asterisk/extensions_custom.conf.

[direct-dial-with-failover]
exten => _X.,1,Set(PASSED_DIRECT_DIAL=true)
same  => n,ExecIf($[«${FAILOVER_DEST}» = «»]?Set(FAILOVER_DEST=${DEFAULT_FAILOVER}))
same  => n,Set(RETURN_AT_ONCE=true)
same  => n,Set(OLD_TRUNK_RING_TIMER=${TRUNK_RING_TIMER})
same  => n,Set(__TRUNK_RING_TIMER=${IVR_DIRECT_RINGTIME})
same  => n,Set(CWIGNORE=)
same  => n,Set(DIALSTATUS=)
same  => n,Gosub(sub-record-check,s,1(exten,${EXTEN},force))
same  => n,GotoIf(${DIALPLAN_EXISTS(ext-local,${EXTEN},1)}?dial_local:dial_remote)
same  => n(dial_local),GotoIf($[«${DB(AMPUSER/${EXTEN}/cidnum)}» = «»]?virtual_exten)
same  => n,GotoIf($[«${DB(DEVICE/${EXTEN}/dial)}» = «»]?virtual_exten)
same  => n,GotoIf($[«${DIALPLAN_EXISTS(ext-findmefollow,${EXTEN},1)}» = «0»]?dial_one)
same  => n,Gosub(ext-findmefollow,${EXTEN},1)
same  => n,Goto(after_dial_local)
same  => n(dial_one),Set(CUR_CALLEE_STATE=${EXTENSION_STATE(${EXTEN}@ext-local)})
same  => n,GotoIf($[«${CUR_CALLEE_STATE}» != «NOT_INUSE»]?after_dial_local)
same  => n,Macro(dial-one,${IVR_DIRECT_RINGTIME},${D_OPTS_IVR},${EXTEN})
same  => n,Goto(after_dial_local)
same  => n(virtual_exten),Dial(Local/${EXTEN}@ext-local,${IVR_DIRECT_RINGTIME},${D_OPTS_IVR})
same  => n(after_dial_local),ExecIf($[«${DIALSTATUS}» = «ANSWER»]?Hangup)
same  => n,NoOp(Dial failed with DIALSTATUS: ${DIALSTATUS})
same  => n,Goto(failover)
same  => n(dial_remote),GotoIf($[${DIALPLAN_EXISTS(dial-remote-from-ivr,${EXTEN},1)} = 0]?after_dial_remote)
same  => n,GotoIf($[«${SIP_HEADER(X-Asterisk-Calltype)}» = «Direct_Dial»]?failover)
same  => n,SIPAddHeader(X-Asterisk-Calltype:Direct_Dial)
same  => n,Gosub(dial-remote-from-ivr,${EXTEN},1)
same  => n,SIPRemoveHeader(X-Asterisk-Calltype:)
same  => n(after_dial_remote),ExecIf($[«${DIALSTATUS}» = «ANSWER»]?Hangup)
same  => n,NoOp(Dial failed with DIALSTATUS: ${DIALSTATUS})
same  => n(failover),Set(RETURN_AT_ONCE=)
same  => n,Set(__TRUNK_RING_TIMER=${OLD_TRUNK_RING_TIMER})
same  => n,Goto(${FAILOVER_DEST})

[dial-remote-from-ivr]
include => outrt-1

В приведённых контекстах:
outrt-1 — контекст FreePBX, описывающий исходящий маршрут, который следует использовать для вызова на внутренние номера, расположенные не на текущем сервере телефонии (имена контекстов, описывающих исходящие маршруты, можно найти а файле /etc/asterisk/extensions_additional.conf, все эти контексты будут иметь названия outrt-<ID_маршрута_в_FreePBX>). В dial-remote-from-ivr можно включить несколько контекстов, если требуется.
DEFAULT_FAILOVER — глобальная переменная, указывающая на назначение по неответу по умолчанию (используется, если переменная FAILOVER_DEST не была установлена перед входом в direct-dial-with-failover)
IVR_DIRECT_RINGTIME — глобальная переменная, в которой содержится максимальное время ожидания ответа от номера, набранного в IVR
Переменные DEFAULT_FAILOVER и IVR_DIRECT_RINGTIME можно описать в файле /etc/asterisk/globals_custom.conf. Пример:

DEFAULT_FAILOVER=ext-queues,6001,1
IVR_DIRECT_RINGTIME=15

Добавление обработчика донабора внутреннего номера в контекст IVR

Всё, что осталось сделать — добавить переход в контекст direct-dial-with-failover при донаборе внутреннего номера в IVR, созданном на первом этапе настройки. Для этого нужно найти в файле /etc/asterisk/extensions_additional.conf контекст IVR, сгенерированный FreePBX (в данном примере — ivr-1), и дописать в него экстеншен _XXX (в данном примере все внутренние номера — трёхзначные). Дописывать новый экстеншен в контекст IVR можно в /etc/asterisk/extensions_override_freepbx.conf либо в /etc/asterisk/extensions_custom.conf — не имеет значения.

[ivr-1]
exten => _XXX,1,Set(FAILOVER_DEST=${CONTEXT},i,1)
same  => n,Goto(direct-dial-with-failover,${EXTEN},1)

Обратите внимание, что назначением по неответу устанавливается экстеншен i в текущем IVR. Настройка завершена, можно проверять.

Кейсы внедрения
Asterisk от VoxLink
Узнайте, какие крупные компании уже используют Asterisk в работе.
Скачать
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.