Недавно в компании сменили 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
На этом все, спасибо за внимание.
Автор: ramir