Включение и выключение DND делаем по набору номера *5:
exten => *5,1,Answer exten => *5,n,GotoIf($["${DB(DND/${CALLERID(number)})}" = ""]?activate:deactivate); включён ли уже режим DND? exten => *5,n(activate),Set(STATE=BUSY) ; если DND выключен — ВКЛЮЧАЕМ exten => *5,n,Set(DEVICE_STATE(Custom:${CALLERID(number)})=${STATE}) ; устанавливаем статус "занят" exten => *5,n,Set(DB(DND/${CALLERID(number)})=1) ; делаем запись в БД о включении DND ;Если у вас используются в Астериск очереди(например для колцентра), то можно добавить следующую строку. ;Она позволит ставить на паузу агентов очереди при включении DND ;exten => *5,n,PauseQueueMember(,PJSIP/${CALLERID(number)}) exten => *5,n,Playback(agent-loggedoff&vm-goodbye) ;воспроизводим сообщение включения DND exten => *5,n,Hangup() exten => *5,n(deactivate),Set(STATE=NOT_INUSE) ; если DND включён — ВЫКЛЮЧАЕМ exten => *5,n,Set(DEVICE_STATE(Custom:${CALLERID(number)})=${STATE}) ; устанавливаем статус "доступен" exten => *5,n,NoOp(${DB_DELETE(DND/${CALLERID(number)})}) ; удаляем запись в БД о включении DND ;Если у вас используются в Астериск очереди(например для колцентра), то можно добавить следующую строку. ;Она позволит снимать с паузы агентов очереди при выключении DND ;exten => *5,n,UnpauseQueueMember(,PJSIP/${CALLERID(number)}) exten => *5,n,Playback(agent-loginok&auth-thankyou&silence/1) ;воспроизводим сообщение отключения DND exten => *5,n,Hangup()
Очень важно для местных номеров сделать правильный Hint. Поскольку у нас устройства подключаются по PJSIP, то нужен хинт PJSIP/${EXTEN}. Однако для того, чтоб режим DND правильно отображался в BLF, нужен хинт Custom:${EXTEN}. Поэтому чтоб в BLF нормально был виден статус абонента необходимо указать в хинте и то и другое (через &):
exten => _XXX,hint,PJSIP/${EXTEN}&Custom:${EXTEN}
Раздел, отвечающий за обработку входящих звонков:
exten => _XXX,1,NoOp(New call from ${CALLERID(num)} to ${EXTEN}) exten => _XXX,n,GotoIf($["${DB(DND/${EXTEN})}" = "1"]?dndon) ;Проверка включен ли ДНД, если включен, то пропускаем команду Dial exten => _XXX,n,Dial(PJSIP/${EXTEN}) exten => _XXX,n(dndon),Voicemail(${EXTEN}@voicemail,${IF($["{DIALSTATUS}" = "BUSY"]?b:u)}) ;отправляем звонящего в голосовую почту если вызываемый абонент занят(ну или в DND) exten => _XXX,n,Hangup()
В качестве клиентских устройств мне достались Fanvil X3SP. У их братьев-близнецов SNR VP-52-CG все точно также.
На телефоне есть кнопка DND, которая при включении режима "не беспокоить" дает при входящем звонке ответ "Занято" (можно перенастроить на другие виды ответа). Однако до осуществления звонка на аппарат Астериск понятия не имеет о включенном DND на телефоне. Соответственно BLF такой DND не увидит.
У телефона есть возможность настройки "Action URL" - это адреса, на которые телефон может отправлять запросы при тех или иных событиях. В том числе можно указать URL, который будет вызываться при включении и отключении DND.
На сервере Астериск потребуется веб-сервер с поддержкой PHP (несложно и с другими веб-ориентированными языками реализовать). Еще, чтоб скрипты вебсервера смогли нормально отработать нужно для пользователя, под которым они выполняются разрешить выполнение команды "asterisk" из под пользователя под которым работает Астериск (sudo). Например так
www-data ALL=(asterisk) NOPASSWD: /usr/sbin/asterisk
Кладем в папку вебсервера скрипты:
<?php if (isset($_GET['num'])) $num=$_GET['num']; else { echo 'Parameter "num" required'; exit; } exec("sudo -u asterisk -S asterisk -rx \"devstate change Custom:$num BUSY\""); exec("sudo -u asterisk -S asterisk -rx \"database put CustomDevstate $num BUSY\""); //Если у вас используются в Астериск очереди(например для колцентра), то можно добавить следующую строку. //Она позволит ставить на паузу агентов очереди при включении DND //exec("sudo -u asterisk -S asterisk -rx \"queue pause member PJSIP/$num\""); echo "DND on $num is on"; ?>
<?php if (isset($_GET['num'])) $num=$_GET['num']; else {echo 'Parameter "num" required'; exit; } exec("sudo -u asterisk -S asterisk -rx \"devstate change Custom:$num NOT_INUSE\""); exec("sudo -u asterisk -S asterisk -rx \"database put CustomDevstate $num NOT_INUSE\""); //Если у вас используются в Астериск очереди(например для колцентра), то можно добавить следующую строку. //Она позволит ставить снимать с паузы агентов очереди при выключении DND //exec("sudo -u asterisk -S asterisk -rx \"queue unpause member PJSIP/$num\""); echo "DND on $num is off"; ?>
Указываем в настройках телефона на включение и отключение DND следующие адреса:
http://asterisk.domain/dndon.php?num=$active_user http://asterisk.domain/dndoff.php?num=$active_user
Вызов вышеуказанных скриптов будет спамить в консоль Астериска сообщениями при каждом запуске команды asterisk -rx …
. Если это мешает, то отключить такое поведение можно выставив параметр hideconnect = yes
в файле asterisk.conf