Asterisk + Cisco SPA5XX, SPA3XX — DND с уведомлением сервера

Недавно в компании сменили IP-телефоны. На замену gigaset'ам пришли cisco SPA504G и cisco SPA303. В телефонии я не специалист, поэтому режим dnd (Do not Disturb) был для меня новинкой. Новинка быстро прижилась в компании. Но вот незадача: телефон при переключении режимов никоим образом не уведомляет сервер. Звонок на недоступный телефон заканчивался статусом «занято». Звонящему оставалось гадать — разговаривает абонент сейчас по телефону или его нет на месте. Вот эту проблему я решил исправить.

На хабре уже есть похожий пост, но в нем не учтены особенности телефона cisco. Для того, чтобы на сервере была возможность проверять активность dnd на телефоне я воспользовался наработками пользователя muon. Добавляем в диалплан следующий контент (не забываем включить этот контент куда нужно):

[dnd_on-off]
exten => *75,1,Answer
exten => *75,n,Set(STATE=RINGING)
exten => *75,n,Set(DEVICE_STATE(Custom:DND${CALLERID(number)})=${STATE})
exten => *75,n,Hangup

exten => *76,1,Answer
exten => *76,n,Set(STATE=NOT_INUSE)
exten => *76,n,Set(DEVICE_STATE(Custom:DND${CALLERID(number)})=${STATE})
exten => *76,n,Hangup

Для установки телефона (на сервере) в режим dnd необходимо набрать *76, чтобы его снять *75. Таким образом, проверяя на сервере значение переменной ${DEVICE_STATE(Custom:DND<Номер абонента>)} мы будем знать в каком состоянии находится телефон.

На данном этапе это очень не удобно, т.к. никакой индикации на телефоне мы не имеем (проблема 1). А также недоумение пользователя: «Я раньше ставил и снимал режим dnd нажатием одной кнопки, а теперь нужно набирать какие-то непонятные комбинации.» (Проблема 2). Действуем дальше.

Решение проблемы 1:
В веб-админке телефона, в режиме Admin login, Advanced на вкладке Regional есть раздел Vertical Service Activation Codes. Находим параметры DND Act Code и DND Deact Code, устанавливаем значения *76 и *75 соответственно. Теперь при наборе на телефоне этих сервисных кодов, будет включаться и отключаться (на телефоне) режим dnd. Но вот незадача, телефон снова не уведомляет сервер.

Чтобы решить эту проблему необходимо заставить телефон набирать эти коды. Ищем раздел Vertical Service Announcement Codes. Находим параметр Service Annc Base Number, пишем туда *7 (это префикс номера который телефон вызовет, при наборе любого сервисного кода), параметр Service Annc Extension Codes: DDT:6;DDF:5 (это суффикс номера, в зависимости от операции, DDT — установка dnd, DDF — снятие dnd). Далее переходим на вкладку Phone и в разделе Supplementary Services устанавливаем параметр Service Annc Serv значение yes. Благодаря этому параметру телефон теперь будет набирать номер по суффиксу и префиксу как мы указали. Ура, проблема 1 решена.

Решение проблемы 2:
В телефоне есть возможность переназначать кнопки, воспользуемся этим. Тут пришлось немного усложнить процесс снятия и постановки dnd. Раньше это делалось нажатием одной кнопки, теперь за установку будет отвечать одна кнопка, за снятие другая. Эту проблему я решить так и не смог, хотя вот здесь (последний пост) пишут, что есть возможность назначать одной программируемой клавише два действия попеременно, но у меня не заработало. Кто знает как это можно сделать пишите в комментариях, буду благодарен.

На вкладке Phone, в разделе Programmable Softkeys создаем две программируемые кнопки.
PKS1: fnc=sd;ext=*75;nme=dnd
PKS2: fnc=sd;ext=*76;nme=-dnd
Бывшей кнопке dnd я назначил PKS2 (снятие dnd), а той что слева от нее (уже не помню что за функция на ней была, все равно ей никто не пользовался) PKS1. Для этого нужно в параметре Idle Key List написать psk1|7;psk2|8; в соответствующее место. Не забудьте включить программируемые клавиши, параметр Programmable Softkey Enable, значение yes. Жмём Submit All Changes, ждём пока телефон перезагрузится и можно пользоваться.

Проверку на dnd при входящем звонке в диалплане я не писал — пока руки не дошли. В вышеуказанном посте с хабры это уже реализовано. Для индикации статусов телефонов у нас используется софт на компьютере, основанный на AMI запросах.

P.S.
Сразу стало интересно кто сколько раз в день ставит этот режим, на какое время и т.п. Может кому-то будет интересно. В MySQL для этих целей я создал таблицу:

CREATE TABLE `dnd` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` varchar(3) NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `action` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
)

и изменил контент

[dnd_on-off]
exten => *75,1,Answer
exten => *75,n,Set(STATE=RINGING)
exten => *75,n,Set(DEVICE_STATE(Custom:DND${CALLERID(number)})=${STATE})
exten => *75,n,MYSQL(Connect connid localhost user password database)
exten => *75,n,MYSQL(Query resultid ${connid} INSERT INTO dnd (number, action) VALUES ("${CALLERID(number)}", false))
exten => *75,n,MYSQL(Disconnect ${connid})
exten => *75,n,Hangup

exten => *76,1,Answer
exten => *76,n,Set(STATE=NOT_INUSE)
exten => *76,n,Set(DEVICE_STATE(Custom:DND${CALLERID(number)})=${STATE})
exten => *76,n,MYSQL(Connect connid localhost user password database)
exten => *76,n,MYSQL(Query resultid ${connid} INSERT INTO dnd (number, action) VALUES ("${CALLERID(number)}", true))
exten => *76,n,MYSQL(Disconnect ${connid})
exten => *76,n,Hangup


На этом все, спасибо за внимание.

UPD

Получилось сделать все на одной кнопке, для этого нужно было обновить прошивку до версии 7.5.5.
PKS1: fnc=sd;ext=*75;nme=dnd;ext2=*76;nme2=-dnd

Правда есть досадная мелочь. Если поставить телефон на dnd и перезагрузить, то кнопка находится в состоянии 1 (поставить dnd), хотя dnd уже включен.
  • +4
  • 11,5k
  • 3
Поделиться публикацией

Похожие публикации

Комментарии 3

    0
    Эту проблему я решить так и не смог, хотя вот здесь (последний пост) пишут, что есть возможность назначать одной программируемой клавише два действия попеременно, но у меня не заработало. Кто знает как это можно сделать пишите в комментариях, буду благодарен.

    Я эту проблему победил. Достаточно было обновить прошивку телефона до самой последней версии (7.5.5).
    После этого все стало прекраснейшим образом работать на одной кнопке.
      0
      Спасибо, добавил в пост.
        0
        Еще, кстати, неплохо было бы добавить такие вещи:
        1. Фрагмент конфига для CFG телефона, если кто использует provisioning
        <!-- Software DND button --> <DND_Act_Code group="Regional/Vertical_Service_Activation_Codes">*75</DND_Act_Code> <DND_Deact_Code group="Regional/Vertical_Service_Activation_Codes">*76</DND_Deact_Code> <Service_Annc_Base_Number group="Regional/Vertical_Service_Announcement_Codes">*7</Service_Annc_Base_Number> <Service_Annc_Extension_Codes group="Regional/Vertical_Service_Announcement_Codes">DDT:5;DDF:6</Service_Annc_Extension_Codes> <PSK_1 group="Phone/Programmable_Softkeys">fnc=sd;ext=*75;nme=DND;ext2=*76;nme2=-DND</PSK_1> <Idle_Key_List group="Phone/Programmable_Softkeys">em_login|1;acd_login|1;acd_logout|1;avail|3;unavail|3;redial|5;dir|6;cfwd|7;psk1|8;lcr|9;pickup|10;gpickup|11;unpark|12;em_logout</Idle_Key_List> <Programmable_Softkey_Enable group="Phone/Programmable_Softkeys">Yes</Programmable_Softkey_Enable>

        2. Включение DND для тех, кто использует AEL вместо стандартного диалплана:
        // new DND function *75 => { Answer(); Set(STATE=NOT_INUSE); Set(DEVICE_STATE(Custom:DND${CALLERID(number)})=${STATE}); NoOp(Device state is ${DEVICE_STATE(Custom:DND${CALLERID(number)})}. Toggled); HangUp(); }; *76 => { Answer(); Set(STATE=RINGING); Set(DEVICE_STATE(Custom:DND${CALLERID(number)})=${STATE}); NoOp(Device state is ${DEVICE_STATE(Custom:DND${CALLERID(number)})}. Toggled); HangUp(); };

        3. Проверка в AEL на включенность DND:
        _XXXX => { if("${DEVICE_STATE(Custom:DND${EXTEN})}"="NOT_INUSE") { BackGround(custom/DND); //подставить запись, какую нужно HangUp(); } else { Dial(SIP/$EXTEN); HangUp(); };

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое