Как не терять звонок, когда звонящий набирает недоступный внутренний номер в IVR FreePBX
В модуле FreePBX IVR есть защита от набора несуществующего номера, но нет защиты от неответа или недоступности существующего номера. В данной статье будет описан сценарий обработки входящих вызовов, который позволит в этих случаях обрабатывать вызов так же, как если бы звонящий ввёл несуществующий номер. Приведённый сценарий рассчитан также на Follow Me и на донабор внутренних номеров, расположенных не на текущем сервере телефонии.
Настройки, приведённые в статье, рассчитаны на FreePBX 13.
Настройки в web-интерфейсе FreePBX
В FreePBX нужно создать 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. Настройка завершена, можно проверять.
Остались вопросы?
Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.