artem
14.05.2018
677

Включение и выключение DND через внешние вызовы.

Часто бывает так, что переадресация на мобильный настроена по недоступности или не ответу, в таком случаем при включенном DND вызов будет уходить на мобильный сразу же, но если забыли включить режим DND и ушли домой, то данный способ может помочь.

Следует помнить что открывать внешний номер для всех звонков можно только если вы уверены что его никто не знает, ведь даже с защитой по паролю люди все равно будут звонить, к тому же номер может быть использован для других нужд, в таком случае нужно создавать маршрут по приоритету CID, для мобильных сотрудников.

Для начала создадим голосовое меню, в котором будет предложено ввести внутренний номер для включения/выключения режима DND.

Голосовое меню

Голосовое меню

Далее создаем входящий маршрут по приоритету CID:

Входящий маршрут

Для нескольких номеров можно использовать маску как в обычном диалплане.

Пример с макской

Пример с маской

После настройки входящей маршрутизации переходим к настройке ИВР. Можно использовать override, либо использовать custom destination.

В данном примере я пойду по первому пути и буду использовать override.

Открываем файл extensions_override_freepbx.conf и вписываем туда:

[ivr-8]
exten => _XXX,1,Set(pass=${DB(DNDPASS/${EXTEN})})
same => n,Authenticate(${pass})
same => n,Set(num=${EXTEN})
same => n,Read(toggle,ru/custom/hello-test,1)
same => n,GotoIf($[«${toggle}»=»1»]?dnd-on-x,${EXTEN},1)
same => n,GotoIf($[«${toggle}»=»2»]?dnd-off-x,${EXTEN},1)
same => n,Playback(beep)
same => n,Macro(hangupcall,)
//Все голосовые записи внесены для примера.

Примечание! Номер ИВР можно узнать через веб-интерфейс, он будет подписан как id в адресной строке при открытии нужного голосового меню.

Как видно из диалплана пароль для внутреннего мы получаем из базы данных Asterisk. Установить их можно вручную, соответственно если пароля нет, то вызов прервется, поскольку приложение Authenticate требует какой либо параметр.

Можно установить дефолтный пароль для всех устройств, но лучше такого не делать в целях безопасности и чтобы не породить путаницу.
Далее необходимо прописать контексты включения/выключения DND. Можно в том же extensions_override_freepbx.conf

[dnd-on-x]
exten => _XXX,1,Answer
same => n,Wait(1)
same => n,Macro(user-callerid,)
same => n,Set(DB(DND/${EXTEN})=YES)
same => n,Set(STATE=BUSY)
same => n,Gosub(dnd-on-x,sstate,1())
same => n(hook_1),Playback(do-not-disturb&activated)
same => n,Macro(hangupcall,)
 
exten => sstate,1,Set(DEVICE_STATE(Custom:DND${EXTEN})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${EXTEN}/device)})
exten => sstate,n,GotoIf($[«${DEVICES}» = «» ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
 
[dnd-off-x]
exten => _XXX,1,Answer
same => n,Wait(1)
same => n,Macro(user-callerid,)
same => n,Noop(Deleting: DND/${EXTEN} ${DB_DELETE(DND/${EXTEN})})
same => n,Set(STATE=NOT_INUSE)
same => n,Gosub(dnd-off-x,sstate,1())
same => n(hook_1),Playback(do-not-disturb&de-activated)
same => n,Macro(hangupcall,)
 
exten => sstate,1,Set(DEVICE_STATE(Custom:DND${EXTEN})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${EXTEN}/device)})
exten => sstate,n,GotoIf($[«${DEVICES}» = «» ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()

В контексты мы отправляем номер, для которого необходимо включение режима DND.

Применяем изменения диалплана:

Asterisk –rx ‘dialplan reload’

И можем тестировать.

Пример включения в диалплане

Для простоты установки паролей создадим простую веб-форму.

Для основы используем форму управления DND из прошлой статьи (Управление DND через web).

Оттуда возьмем вывод всех операторов и их текущие пароли:

<?php
include(‘connectdb.php’);
$dnddb = new SQLite3(‘/var/lib/asterisk/astdb.sqlite3’);
$result = bd_bridge(‘asterisk’,’SELECT extension, name FROM users ORDER BY extension ASC;’);
echo «<form action=’dndpass.php’ method=’POST’><table border=1><tr><td>Номер</td><td>Имя</td><td>Статус</td></tr>»;
 
while ($row = mysql_fetch_array($result))
{
$CellName = $row[‘name’];
$CellPhone = $row[‘extension’];
 
$dndpass = $dnddb->query(«SELECT value FROM astdb WHERE key like ‘/DNDPASS/$CellPhone’ AND key not like ‘%only’  ORDER BY key»);
$astdb = $dndpass->fetchArray();
$DNDpwd = $astdb[‘value’];
 
    echo «<tr><td>».$row[0].»</td><td>».$row[1].»</td><td><input type=’text’ name='».$row[0].»‘ pattern='[0-9]{4}’ value='».$DNDpwd.»‘></td></tr>»;//Выводим поля для ввода пароля с необходимым паттерном и индексом.
    echo «</td></tr>»;
}
echo «</table>
<input type=submit name=set>//кнопка обработчик
    </form>»;

Вывод всех текущих паролей для DND

Соответственно теперь необходимо внесенные в формы пароли внести в базу, а удаленные – удалить:

if (isset ($_POST[‘set’])) {
                foreach ($_POST as $key => $pass) {
                              
if ($pass != «») {$dnd = `asterisk -rx «database put DNDPASS $key $pass»`;}
                else {$dnd = `asterisk -rx «database del DNDPASS $key»`;}
               
}
 
echo «<meta http-equiv=’refresh’ content=’1′>»;
}
?>

Данный скрипт помещаем как обычно в веб-директорию и даем ему пользователя asterisk.

БД Asterisk пример

 

 

 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices