Получение состояния устройства в Asterisk 11 с помощью DEVICE_STATE

Sep 24, 2015 16:26 · 315 words · 2 minute read asterisk

Если используется 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
tweet Share