Александр Мисюрин
06.12.2019
1371

DND CF по таймеру

В данной статье рассмотрим реализацию включении/выключения режима «не беспокоить» и переадресаций по таймеру, который будем задавать вызовом на выделенный сервисный номер. Установку режима DND будем осуществлять через добавления значений в базу, по аналогии с действующей установкой по сервисному коду FreePBX. Для примера ниже контекст установки/снятия режима «не беспокоить»: Для указания времени установки и снятия используем […]

В данной статье рассмотрим реализацию включении/выключения режима «не беспокоить» и переадресаций по таймеру, который будем задавать вызовом на выделенный сервисный номер.

Для тестирования использовалась система: CentOS 6.9, FreePBX 13, Asterisk 13 собранный с ODBC

Установку режима 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()
Установленный режим «не беспокоить»
Установленный режим «не беспокоить»
Из вышеуказанного можно понять, что нам необходимо добавлять записи в базу AstDB – DND, помимо этого необходимо поменять статус пира «devastate» в двух местах, DND и DEVDND.

Для указания времени установки и снятия используем запись в базу, с помощью модуля 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
При совпадении времени в дате установки и снятия проверяется установлен ли режим DND уже, если нет, устанавливает, иначе пропускает эту запись.

Если поставить 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
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

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

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

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

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

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

ONLINE

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.