Уведомление о занятости при настройке Call Waiting в Asterisk

Уведомление о занятости при настройке Call Waiting в Asterisk

Функция Call Waiting при настройке в Asterisk или через FreePBX позволяет внутреннему номера принимать второй параллельный вызов, во время текущего разговора. Основной проблемой Call Waiting является то, что звонящий занятому абоненту слышит стандартный КПВ (Контроль посылки вызова, или просто гудок) в телефонной трубке, что создает ложное ощущение игнорирования.
Звонящий думает, что вызываемый абонент не взял трубку по причине обеда, перекура, невнимательности или похищения пришельцами.
Нас такой вариант не устраивает и мы предлагаем решение: звуковое уведомление звонящего о том, что вызываемый абонент сейчас разговаривает и не может принять вызов. Предложим звонящему подождать или позвонить попозже. Приступаем к реализации.

Содержание

Настройка Extensions_custom.conf

Как можно понять по названию заголовка, настройку мы будем производить в одноименном файле extensions_custom.conf, который находится в директории /etc/asterisk/:. Открываем для редактирования:
vim /etc/asterisk/extensions_custom.conf
После чего, добавляем в файл следующую конфигурацию:
[from-internal-custom]
include => macro-dialout-one-predial-hook

[macro-dialout-one-predial-hook]
exten => s,1,Noop(HINT STATUS - ${EXTENSION_STATE(${DEXTEN})})
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "INUSE"]?Playback(/var/lib/asterisk/sounds/ru/custom/busytest))
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "INUSE"]?Set(D_OPTIONS=Ttm))
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "RINGINUSE"]?Playback(/var/lib/asterisk/sounds/ru/custom/busytest))
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "RINGINUSE"]?Set(D_OPTIONS=Ttm))
Уведомление о занятости при настройке Call Waiting в Asterisk
Разберемся с каждой строчкой контекста macro-dialout-one-predial-hook:
  • exten => s,1,Noop(HINT STATUS – ${EXTENSION_STATE(${DEXTEN})}) – выводим в консоль сервера состояние хинта. Здесь может быть : UNKNOWN, NOT_INUSE, INUSE, BUSY, UNAVAILABLE, RINGING, RINGINUSE, HOLDINUSE, ONHOLD
  • exten => s,n,ExecIf($[“${EXTENSION_STATE(${DEXTEN})}” = “INUSE”]?Playback(/var/lib/asterisk/sounds/ru/custom/busytest)) – проверяем статус хинта: если он равен INUSE (находится в разговоре), то проигрываем для него заранее записанный файл (/var/lib/asterisk/sounds/ru/custom/busytest, где сообщаем звонящему о занятости и просим подождать;
  • exten => s,n,ExecIf($[“${EXTENSION_STATE(${DEXTEN})}” = “INUSE”]?Set(D_OPTIONS=Ttm)) – сразу после озвучивания нашего аудио, играем MoH (Music On Hold) звонящему;
Аналогичным способом, как показано выше, мы проводим проверку для состояния хинта равному RINGINUSE. Готово. Перегружаем диалплан командой:
asterisk -rx "dialplan reload"