Уведомление о занятости или недоступности абонента в Asterisk

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

Настроим звуковое уведомление звонящего о том, что вызываемый абонент сейчас разговаривает и не может принять вызов или о том, что телефон недоступен. Предложим звонящему подождать или позвонить попозже. Приступаем к реализации.

НАСТРОЙКА EXTENSIONS_CUSTOM.CONF

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

Открываем для редактирования:

mcedit /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/Abonent-razgovarivaet))
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/Abonent-razgovarivaet))
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "RINGINUSE"]?Set(D_OPTIONS=Ttm))
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "UNAVAILABLE"]?Playback(/var/lib/asterisk/sounds/ru/custom/Abonent-nedostupen))
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "UNAVAILABLE"]?Hangup())

Разберемся с каждой строчкой контекста 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/Abonent-razgovarivaet)) — проверяем статус хинта: если он равен 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 и UNAVAILABLE (но в UNAVAILABLE мы проигрываем аудиофайл и кладем трубку). Готово!

Перегружаем диалплан командой:

asterisk -rx "dialplan reload"