Получение состояния устройства в Asterisk 11 с помощью DEVICE_STATE
Sep 24, 2015 16:26 · 315 words · 2 minute read
Если используется Call Waiting
(режим ожидания для второго входящего звонка при занятой линии) в Asterisk, то при звонке уже разговаривающему абоненту мы услышим в трубке обычные гудки дозвона.
В такой ситуации трудно понять, разговаривает ли сотрудник по второй линии или его просто нет на рабочем месте. Давайте разберемся с вариантами решения этой проблемы!
Самое очевидное решение — отключить поддержку второй линии, но тогда абонент не узнает кто еще пытался ему дозвониться. В Asterisk 11 данную проблему хорошо решает получение состояния устройства с помощью DEVICE_STATE().
Примечание. Функция DEVICE_STATE()
используется для получения или установки состояний устройства. Также функция может использоваться для установки особенных состояний устройства из плана набора (в этом случае для указания имени состояния должен использоваться префикс «Custom:»)
В нашем случае используются телефонные аппараты Cisco 504G и Linksys SPA942, которые поддерживают четыре телефонные линии. В случае «занятости» аппарат Cisco 504G возвращает статус BUSY, а аппарат Linksys SPA942 возвращает статус INUSE.
Примечание. На самом деле существует девять возможных значений состояния устройства — UNKNOWN
, NOT_INUSE
, INUSE
, BUSY
, INVALID
, UNAVAILABLE
, RINGING
, RINGINUSE
и ONHOLD
, но мы будем обрабатывать только два из них.
Для получения состояния устройства с помощью DEVICE_STATE()
делаем следующее:
- открываем на редактирование конфиг
/etc/asterisk/sip.conf
:
nano /etc/asterisk/sip.conf
- в созданном ранее шаблоне
[template-office]
добавим строку:
...
callcounter=yes
...
- открываем конфиг
/etc/asterisk/extensions.conf
:
nano /etc/asterisk/extensions.conf
- и добавляем в контекст
[office-in]
(перед вызовомDial
) следующие строки:
...
exten => s,n,Log(NOTICE, "101 has DEVICE STATE ${DEVICE_STATE(SIP/101)}")
exten => s,n,GotoIf($["${DEVICE_STATE(SIP/101)}" = "BUSY"]?s-BUSY,1)
exten => s,n,GotoIf($["${DEVICE_STATE(SIP/101)}" = "INUSE"]?s-BUSY,1)
...
Теперь при звонке на номер 101 будет проверяться состояние телефонного аппарата, и если функция DEVICE_STATE()
вернет состояние устройства BUSY
или INUSE
, то будет осуществлен условный переход на метку s-BUSY,1
для дальнейшей обработки звонка. Далее звонок будем обрабатывать с помощью голосового меню, организацию которого рассмотрим в следующей статье.
Выполнять обработку можно и без условного перехода, в этой же строке, например так:
exten => s,n,ExecIf($["${DEVICE_STATE(SIP/101)}" = "INUSE"]?Playback(abonent_zanyat))
Для применения изменений в конфигах Asterisk не забываем выполнить:
/etc/init.d/asterisk reload