Инструменты пользователя

Инструменты сайта


asterisk:pravilnyj_dnd

Реализация DND на Астериск

Настройка диалплана

Включение и выключение 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()

DND на телефонах Fanvil X3SP

В качестве клиентских устройств мне достались Fanvil X3SP. У их братьев-близнецов SNR VP-52-CG все точно также.

На телефоне есть кнопка DND, которая при включении режима "не беспокоить" дает при входящем звонке ответ "Занято" (можно перенастроить на другие виды ответа). Однако до осуществления звонка на аппарат Астериск понятия не имеет о включенном DND на телефоне. Соответственно BLF такой DND не увидит.

У телефона есть возможность настройки "Action URL" - это адреса, на которые телефон может отправлять запросы при тех или иных событиях. В том числе можно указать URL, который будет вызываться при включении и отключении DND.

На сервере Астериск потребуется веб-сервер с поддержкой PHP (несложно и с другими веб-ориентированными языками реализовать). Еще, чтоб скрипты вебсервера смогли нормально отработать нужно для пользователя, под которым они выполняются разрешить выполнение команды "asterisk" из под пользователя под которым работает Астериск (sudo). Например так

sudoers
www-data ALL=(asterisk) NOPASSWD: /usr/sbin/asterisk

Кладем в папку вебсервера скрипты:

dndon.php
<?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";
?>
dndoff.php
<?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

asterisk/pravilnyj_dnd.txt · Последнее изменение: 2022/04/08 13:01 — san

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki