Сергей Маликов
04.08.2020
6592

Кастомизация входящей маршрутизации

Иногда входящие вызовы, поступающие с внешних номеров (городских и мобильных) необходимо направлять на общую очередь (группу номеров) только при условии выполнения/невыполнения соответствующих условий. Например, если на номер звонящего ранее были совершены вызовы с какого-либо добавочного (101), то входящий вызов должен поступить на добавочный 101, и, если этот добавочный не ответил/занят/недоступен – то на общую очередь. […]

Кастомизация входящей маршрутизации

Иногда входящие вызовы, поступающие с внешних номеров (городских и мобильных) необходимо направлять на общую очередь (группу номеров) только при условии выполнения/невыполнения соответствующих условий. Например, если на номер звонящего ранее были совершены вызовы с какого-либо добавочного (101), то входящий вызов должен поступить на добавочный 101, и, если этот добавочный не ответил/занят/недоступен – то на общую очередь.

Для этого необходимо будет изменить назначение для входящих маршрутов, указав в нем диалплан, в котором будет осуществляться вызов скрипта, проверяющего вызовы совершенные ранее, добавить очередь (в которую будет добавляться агент(добавочный), если он не занят и если он ранее совершал исходящие на этот номер), скрипт, в котором далее будет удаляться добавленный агент и указать дальнейшим назначением общую очередь (куда будут далее попадать вызовы в случае отсутствия зафиксированных ранее попыток дозвона со стороны внутренних абонентов на атс или занятости соответствующего добавочного).

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

Имеющиеся транки

Во входящих маршрутах для каждого из имеющихся номеров определим назначение для входящих вызовов (в примере — контекст custom-inbound)

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

Также, во входящих маршрутах указываем параметры записи разговоров.

Параметры записи разговоров

В панели управления перейти Admin (Администрирование) -> Custom destinations (Пользовательский диалплан)

Добавление custom destination

Модуль Custom destinations позволяет указать в админ-панели диалплан, добавленный в файле /etc/asterisk/extensions_custom.conf

Предупреждение: во FreePBX пользовательский диалплан добавляется в файл /etc/asterisk/extensions_custom.conf, диалплан в файле /etc/asterisk/extensions_additional.conf генерируется автоматически на основании конфигурации, имеющейся в базе данных, при изменении настроек в веб-интерфейсе — нажатии Apply Config (Применить).

Указываем пользовательский диалплан (контекст,экстеншен,приоритет) куда будут попадать входящие вызовы.

Пользовательский диалплан custom inbound

Добавляем две очереди напр. 500 (очередь с добавляемым скриптом агентом, который совершал исходящий звонок последним) и 600 (общая очередь).

Очереди (общая и для кастомизации входящих вызовов)

Изменяем параметры очереди 500 – для пропуска агента если он занят или разговаривает устанавливаем опцию Skip Busy Agents (Пропускать занятых) в Yes + (ringinuse=no). Стратегия очереди в данном случае может быть любая т.к. в ней подразумевается максимум 1 агент. Если необходимо вызывать агентов очереди без учета переадресаций или настроек follow me -установить опцию Agent Restrictions в No Follow-Me or Call Forward.

Параметры очереди 500

Также, на вкладке Timing and Agent options, где настраиваются параметры пребывания вызова в очереди (Max Wait Time) и Agent Timeout (Таймаут агента) указываем время ожидания и таймаут агента (например 30 сек/30 сек).

Тайминги очереди 500

На вкладке Capacity Options (Емкость очереди) указываем параметры Join Empty (Присоединяться к пустой) Leave empty (покидать пустую) в Ultra Strict (Очень строгий), чтобы во всех случаях, когда агент (ранее совершавший исходящие на номер звонящего) будет недоступен или не сможет принять вызов сразу вызов проходил далее (на общую очередь).

Параметры емкости очереди для кастомизации входящих

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

Агенты очереди

Про более подробный обзор функционала очередей см. статью «Обзор функционала очередей FreePBX 13».

В очереди необходимо указать Fail Over Destination (назначение по неответу или истечению срока пребывания в очереди) пользовательский диалплан custom-inbound-failover, который также необходимо добавить в модуле Custom Destinations

Пользовательский диалплан custom-inbound-failover

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

Параметры общей очереди

Указываем ее агентов (все внутренние)

Агенты очереди

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

Тайминги общей очереди

Настраиваем параметры емкости (параметры присоединяться к пустой/покидать пустую в примере указаны для попадания в нее вызовов во всех случаях, и когда оператор не сможет принять вызов сразу).

Параметры емкости общей очереди

В файл /etc/asterisk/extensions_custom.conf добавляем контексты custom-inbound и custom-inbound-failover. Если необходимо еще проигрывать приветствие и донабирать добавочных можно совершать предварительно переход в IVR – в примере ivr-1 Goto(ivr-1,s,1)

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

При переходе с помощью Goto в какую-либо очередь в диалплане также необходимо определить переменную __NODEST. Если такая переменная не определена будет происходить зацикливание в этой очереди (и появится избыточность записей в логах).

Содержимое /etc/asterisk/extensions_custom.conf

[custom-inbound]
exten => s,1,NoOp(If number was dialed earlier - to corresponding extension)
exten => s,n,AGI(check-inbound-call.php)
exten => s,n,NoOp(Go to IVR and queue 500)
exten => s,n,Goto(ivr-1,s,1)

[custom-inbound-failover]
exten => s,1,NoOp(No answer - remove members from queue 500 and go to common queue)
exten => s,n,AGI(remove-members-from-queue.sh,500)
exten => s,n,Set(__NODEST=600)
exten => s,n,Goto(from-queue,600,1)
;exten => s,n,Queue(600,Tt)

В директории /var/lib/asterisk/agi-bin/ создаем скрипты для проверки базы звонков и добавления оператора в очередь и для удаления агентов из кастомизированной очереди (при выходе из нее).

Скрипт check-inbound-call.php:

#!/usr/bin/php -q
<?php
set_time_limit(3);
require('phpagi.php');
//error_reporting(0);

$stdin = fopen('php://stdin', 'r');
$stdout = fopen('php://stdout', 'w');
$agi = new AGI();
$cid = $agi->request['agi_callerid'];
$link = mysqli_connect("127.0.0.1", "freepbxuser", "password", "asteriskcdrdb");
if(substr($cid,1)=='+'){
	$cid = substr($cid,3);
}
//$query = "SELECT cnum FROM `cdr` WHERE `dst` = '" . $cid . "' ORDER BY calldate DESC LIMIT 1";
$query = "SELECT cnum FROM `cdr` WHERE `dst` LIKE '%" . $cid . "' ORDER BY calldate DESC LIMIT 1";
if ($result = mysqli_query($link, $query)) {
    while ($row = mysqli_fetch_row($result)) {
	$agi->exec("NOOP", $row[0]);
	echo $row[0];
	$last_office_caller_to_cid = $row[0];
	$cmd = 'asterisk -rx \'queue add member SIP/' . $last_office_caller_to_cid  . ' to 500 penalty 0 as ' .  $last_office_caller_to_cid . '\'';
	exec($cmd);
	var_dump($cmd);
    }
    /* очищаем результирующий набор */
    mysqli_free_result($result);
}
mysqli_close($link);
fclose ($stdin);
fclose ($stdout);
exit(0);
?>

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

Для подключения к базе использовать пользователя freepbxuser (пароль к нему можно посмотреть в /etc/freepbx.conf).

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

SELECT cnum FROM `cdr` WHERE `dst` = '" . $callerid . "' ORDER BY calldate DESC LIMIT 1

Но, если callerid при входящих могут приходить с различными префиксами, или ранее набранный номер был немного в другом формате – производить поиск по подстроке, а не сравнение полей целиком.

SELECT cnum FROM `cdr` WHERE `dst` LIKE '%" . $callerid . "' ORDER BY calldate DESC LIMIT 1

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

См. статью об Adminer.

Тестирование запроса к базе

Скрипт remove-members-from-queue.sh

#!/bin/sh
if [ "$*" == "" ]; then
  echo "parameters: $0 queue1 queue2 queue3 ..."
  exit
fi
for i in  $*
do
  CNTR=`/usr/sbin/asterisk -rx "queue show ${i}" | awk 'NR>=3{print $1}'`
  for j in ${CNTR}
  do
echo `/usr/sbin/asterisk -rx "queue remove member SIP/${j} from ${i}" > /dev/null 2>&1`
  done
done
На все созданные agi скрипты также необходимо дать права на исполнение командой chmod +x /путь/к/файлу.

Для тестирования совершим исходящий на какой-л. внешний номер, а потом позвоним с него на любой из имеющихся на атс внешних номеров.

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

Для включения отладки AGI в консоли Asterisk необходимо набрать.

CLI>agi set debug on
Проверка попадания в общую очередь (в консоли)

Если в базе будет запись, о том, что какой-либо добавочный совершал исходящие на номер звонящего – вызов пойдет на очередь 500 с этим динамическим агентом, а по неответу – на общую очередь.

Проверка попадания в кастомизированную и переход в общую очередь (в консоли)

Для проверки удаления из очереди для кастомизации входящих вызовов (500), еще раз позвоним и сбросим.

Проверка удаления агентов из очереди в консоли

Агентов очереди можно посмотреть командой

asterisk -rx ‘queue show 500’

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

Просмотр агентов очереди
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

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

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

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