DND CF по таймеру
В данной статье рассмотрим реализацию включении/выключения режима «не беспокоить» и переадресаций по таймеру, который будем задавать вызовом на выделенный сервисный номер. Установку режима DND будем осуществлять через добавления значений в базу, по аналогии с действующей установкой по сервисному коду FreePBX. Для примера ниже контекст установки/снятия режима «не беспокоить»: Для указания времени установки и снятия используем […]
В данной статье рассмотрим реализацию включении/выключения режима «не беспокоить» и переадресаций по таймеру, который будем задавать вызовом на выделенный сервисный номер.
Установку режима DND будем осуществлять через добавления значений в базу, по аналогии с действующей установкой по сервисному коду FreePBX.
Для примера ниже контекст установки/снятия режима «не беспокоить»:
[app-dnd-toggle]
include => app-dnd-toggle-custom
exten => *76,1,Answer
exten => *76,n,Wait(1)
exten => *76,n,Macro(user-callerid,)
exten => *76,n,GotoIf($["${DB(DND/${AMPUSER})}" = ""]?activate:deactivate)
exten => *76,n(activate),Set(DB(DND/${AMPUSER})=YES)
exten => *76,n,Set(STATE=BUSY)
exten => *76,n,Gosub(app-dnd-toggle,sstate,1())
exten => *76,n(hook_on),Playback(do-not-disturb&activated)
exten => *76,n,Macro(hangupcall,)
exten => *76,n(deactivate),Noop(Deleting: DND/${AMPUSER} ${DB_DELETE(DND/${AMPUSER})})
exten => *76,n,Set(STATE=NOT_INUSE)
exten => *76,n,Gosub(app-dnd-toggle,sstate,1())
exten => *76,n(hook_off),Playback(do-not-disturb&de-activated)
exten => *76,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:DND${AMPUSER})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/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()
Для указания времени установки и снятия используем запись в базу, с помощью модуля ODBC.
Соответственно таблицу нужно создать:
create table customdnd (cidnum varchar(20) NOT NULL, mark varchar(2) NOT NULL, dateset varchar(20), dateunset varchar(20), PRIMARY KEY (cidnum));
В нее будем заносить значения: номер оператора, установить/снять режим, время установки, время снятия.
Номер для добавления записи в базу:
exten => *700,1,Set(cidnum=${CALLERID(num)})
same => n,Read(mark,ru/custom/mark,10)
same => n,Read(dateset,ru/custom/dateset,10)
same => n,Read(dateunset,ru/custom/dateunset,10)
same => n,Set(ODBC_DNDCHG(${cidnum})=1)
Для установки в определенное время, используем скрипт, который поместим на выполнение в крон, раз в минуту.
Функция для работы с базой:
function bd_bridge($db,$q){
$link = @mysqli_connect('localhost','freepbxuser','freepbxpasswd',$db) or die("Error: ".@mysqli_connect_error($link));
$rs = @mysqli_query($link, $q) or die("Error: ".@mysqli_error($link));
if($rs){
return $rs;
@mysqli_free_result($rs);
}
else{
echo "Qwerty failure: $q <br />";
}
mysqli_close($link);
}
Далее получаем текущее время в формате Часы*минуты, обязательно в начале скрипта.
$nowdate=date("H*i");
Запрашиваем из базы данные и открываем цикл на обработку, в котором приводим время из базы к нужному виду (если оператор ввел время одной цифрой или без первого 0) и настраиваем обработку добавления/удаления записей в AstDB и изменение статусов пира.
$result = bd_bridge('asteriskcdrdb',"select cidnum, mark, dateset, dateunset from customdnd;");
while ($row = mysqli_fetch_array($result))
{
$cidnum=$row['cidnum'];
$mark=$row['mark'];
$dateset=$row['dateset'];
$dateunset=$row['dateunset'];
$dndstate=`/usr/sbin/asterisk -rx "database show DND/$cidnum" | grep -v "0 results"`;
//Приведение даты к нужному виду
if (strlen($dateset) == 2) {
$dateset.="*00";
} elseif (strlen($dateset) == 1) { $dateset="0".$dateset."*00"; }
if (strlen($dateunset) == 2) {
$dateunset.="*00";
} elseif (strlen($dateunset) == 1) { $dateunset="0".$dateunset."*00"; }
//Проверка и установка/снятие
if (("$dateset" == "$dateunset") and ($mark == 1) and ("$dndstate" != "")) {
echo "DNDNOTSET\n";
} elseif (("$nowdate" == "$dateset") and ($mark == 1)) {
echo "DNDSET\n";
$astdbput=`/usr/sbin/asterisk -rx "database put DND $cidnum YES"`;
$devstate=`/usr/sbin/asterisk -rx "devstate change Custom:DND$cidnum BUSY"`;
$devstate=`/usr/sbin/asterisk -rx "devstate change Custom:DEVDND$cidnum BUSY"`;
} elseif (("$nowdate" == "$dateunset") and ($mark == 1) and ("$dndstate" != "")) {
echo "DNDUNSET\n";
$astdbput=`/usr/sbin/asterisk -rx "database del DND $cidnum"`;
$devstate=`/usr/sbin/asterisk -rx "devstate change Custom:DND$cidnum NOT_INUSE"`;
$devstate=`/usr/sbin/asterisk -rx "devstate change Custom:DEVDND$cidnum NOT_INUSE"`;
}
}
Затем добавляем скрипт на выполнение в крон каждую минуту:
*/1 * * * * /opt/dndchg.php
Если поставить mark=0 (выбор в голосовом меню), то переключатель для этого оператора срабатывать не будет.
Переадресации
Настраиваются аналогично DND, за исключением того, что нужно указывать номер для переадресации, то есть в таблицу CF добавляем еще одно поле:
create table customcf (cidnum varchar(20) NOT NULL, mark varchar(2) NOT NULL, dateset varchar(20), dateunset varchar(20), numcf varchar(20) NOT NULL, PRIMARY KEY (cidnum));
В базе AstDB соответственно CF/<номер> присваивается номер для переадресации, devastate: Custom:CF<номер> и Custom:DEVCF<номер> назначаются BUSY.
Номер для назначения интервалов переадресации аналогичен, за исключением указания мобильного номера, укажем его в самом exten:
exten => _*700.,1,Set(cidnum=${CALLERID(num)})
same => n,NoOp(Оператор:${numr})
same => n,Read(mark,ru/custom/mark,10)
same => n,Read(dateset,ru/custom/dateset,10)
same => n,Read(dateunset,ru/custom/dateunset,10)
same => n,Set(numcf=${EXTEN:4})
same => n,Set(ODBC_CFCHG(${cidnum})=1)
Функция ODBC:
[CFCHG]
dsn=asteriskcdrdb
writesql=replace into customcf values ('${ARG1}', '${mark}', '${dateset}', '${dateunset}', '${numcf}');
В скрипте изменяем запросы на CF, а также добавляем нужное поле:
$result = bd_bridge('asteriskcdrdb',"select cidnum, mark, dateset, dateunset, numcf from customcf;");
while ($row = mysqli_fetch_array($result))
{
$cidnum=$row['cidnum'];
$mark=$row['mark'];
$dateset=$row['dateset'];
$dateunset=$row['dateunset'];
$numcf=$row['numcf'];
$cfstate=`/usr/sbin/asterisk -rx "database show CF/$cidnum" | grep -v "0 results"`;
//Приведение даты к нужному виду
if (strlen($dateset) == 2) {
$dateset.="*00";
} elseif (strlen($dateset) == 1) { $dateset="0".$dateset."*00"; }
if (strlen($dateunset) == 2) {
$dateunset.="*00";
} elseif (strlen($dateunset) == 1) { $dateunset="0".$dateunset."*00"; }
//Проверка и установка/снятие
if (("$dateset" == "$dateunset") and ($mark == 1) and ("$cfstate" != "")) {
echo "CFNOTSET\n";
} elseif (("$nowdate" == "$dateset") and ($mark == 1)) {
echo "CFSET\n";
$astdbput=`/usr/sbin/asterisk -rx "database put CF $cidnum $numcf"`;
$devstate=`/usr/sbin/asterisk -rx "devstate change Custom:CF$cidnum BUSY"`;
$devstate=`/usr/sbin/asterisk -rx "devstate change Custom:DEVCF$cidnum BUSY"`;
} elseif (("$nowdate" == "$dateunset") and ($mark == 1) and ("$cfstate" != "")) {
echo "CFUNSET\n";
$astdbput=`/usr/sbin/asterisk -rx "database del CF $cidnum"`;
$devstate=`/usr/sbin/asterisk -rx "devstate change Custom:CF$cidnum NOT_INUSE"`;
$devstate=`/usr/sbin/asterisk -rx "devstate change Custom:DEVCF$cidnum NOT_INUSE"`;
}
}
Этот скрипт также добавляем в крон на выполнение раз в минуту.
*/1 * * * * /opt/cfchg.php
Остались вопросы?
Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.