Кастомизация входящей маршрутизации
Иногда входящие вызовы, поступающие с внешних номеров (городских и мобильных) необходимо направлять на общую очередь (группу номеров) только при условии выполнения/невыполнения соответствующих условий. Например, если на номер звонящего ранее были совершены вызовы с какого-либо добавочного (101), то входящий вызов должен поступить на добавочный 101, и, если этот добавочный не ответил/занят/недоступен – то на общую очередь. […]
![Кастомизация входящей маршрутизации](https://voxlink.ru/wp-content/uploads/2020/08/Kastomizaciya-vhodyaschei-marshrutizacii.jpg)
Иногда входящие вызовы, поступающие с внешних номеров (городских и мобильных) необходимо направлять на общую очередь (группу номеров) только при условии выполнения/невыполнения соответствующих условий. Например, если на номер звонящего ранее были совершены вызовы с какого-либо добавочного (101), то входящий вызов должен поступить на добавочный 101, и, если этот добавочный не ответил/занят/недоступен – то на общую очередь.
Для этого необходимо будет изменить назначение для входящих маршрутов, указав в нем диалплан, в котором будет осуществляться вызов скрипта, проверяющего вызовы совершенные ранее, добавить очередь (в которую будет добавляться агент(добавочный), если он не занят и если он ранее совершал исходящие на этот номер), скрипт, в котором далее будет удаляться добавленный агент и указать дальнейшим назначением общую очередь (куда будут далее попадать вызовы в случае отсутствия зафиксированных ранее попыток дозвона со стороны внутренних абонентов на атс или занятости соответствующего добавочного).
Предположим, имеется 8 транков, через которые будут проходить внешние вызовы.
![](https://voxlink.ru/wp-content/uploads/2020/08/1-trunks.jpg)
Во входящих маршрутах для каждого из имеющихся номеров определим назначение для входящих вызовов (в примере — контекст custom-inbound)
![](https://voxlink.ru/wp-content/uploads/2020/08/2-inbound-routes.jpg)
Также, во входящих маршрутах указываем параметры записи разговоров.
![](https://voxlink.ru/wp-content/uploads/2020/08/3-recording-options.jpg)
В панели управления перейти Admin (Администрирование) -> Custom destinations (Пользовательский диалплан)
![](https://voxlink.ru/wp-content/uploads/2020/08/4-custom-destinations.jpg)
Модуль Custom destinations позволяет указать в админ-панели диалплан, добавленный в файле /etc/asterisk/extensions_custom.conf
Указываем пользовательский диалплан (контекст,экстеншен,приоритет) куда будут попадать входящие вызовы.
![](https://voxlink.ru/wp-content/uploads/2020/08/5-custom-dest-custom-inbound.jpg)
Добавляем две очереди напр. 500 (очередь с добавляемым скриптом агентом, который совершал исходящий звонок последним) и 600 (общая очередь).
![](https://voxlink.ru/wp-content/uploads/2020/08/6-queues.jpg)
Изменяем параметры очереди 500 – для пропуска агента если он занят или разговаривает устанавливаем опцию Skip Busy Agents (Пропускать занятых) в Yes + (ringinuse=no). Стратегия очереди в данном случае может быть любая т.к. в ней подразумевается максимум 1 агент. Если необходимо вызывать агентов очереди без учета переадресаций или настроек follow me -установить опцию Agent Restrictions в No Follow-Me or Call Forward.
![](https://voxlink.ru/wp-content/uploads/2020/08/7-custom-queue.jpg)
Также, на вкладке Timing and Agent options, где настраиваются параметры пребывания вызова в очереди (Max Wait Time) и Agent Timeout (Таймаут агента) указываем время ожидания и таймаут агента (например 30 сек/30 сек).
![](https://voxlink.ru/wp-content/uploads/2020/08/8-custom-queue-timings.jpg)
На вкладке Capacity Options (Емкость очереди) указываем параметры Join Empty (Присоединяться к пустой) Leave empty (покидать пустую) в Ultra Strict (Очень строгий), чтобы во всех случаях, когда агент (ранее совершавший исходящие на номер звонящего) будет недоступен или не сможет принять вызов сразу вызов проходил далее (на общую очередь).
![](https://voxlink.ru/wp-content/uploads/2020/08/9-custom-queue-capacity.jpg)
Агенты очереди должны добавляться скриптом, поэтому в настройках их не указываем.
![](https://voxlink.ru/wp-content/uploads/2020/08/10-custom-queue-agents.jpg)
Про более подробный обзор функционала очередей см. статью «Обзор функционала очередей FreePBX 13».
В очереди необходимо указать Fail Over Destination (назначение по неответу или истечению срока пребывания в очереди) пользовательский диалплан custom-inbound-failover, который также необходимо добавить в модуле Custom Destinations
![](https://voxlink.ru/wp-content/uploads/2020/08/11-custom-dest-custom-inbound-failover.jpg)
Добавляем общую очередь и указываем ее параметры.
![](https://voxlink.ru/wp-content/uploads/2020/08/12-common-queue.jpg)
Указываем ее агентов (все внутренние)
![](https://voxlink.ru/wp-content/uploads/2020/08/13-common-queue-agents.jpg)
Для избежания зависания каналов ограничиваем максимальное время пребывания в общей очереди. Указываем тайминги общей очереди и таймаут агентов.
![](https://voxlink.ru/wp-content/uploads/2020/08/14-common-queue-timings.jpg)
Настраиваем параметры емкости (параметры присоединяться к пустой/покидать пустую в примере указаны для попадания в нее вызовов во всех случаях, и когда оператор не сможет принять вызов сразу).
![](https://voxlink.ru/wp-content/uploads/2020/08/15-common-queue-capacity.jpg)
В файл /etc/asterisk/extensions_custom.conf добавляем контексты custom-inbound и custom-inbound-failover. Если необходимо еще проигрывать приветствие и донабирать добавочных можно совершать предварительно переход в IVR – в примере ivr-1 Goto(ivr-1,s,1)
![](https://voxlink.ru/wp-content/uploads/2020/08/16-ivr.jpg)
При переходе с помощью 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.
![](https://voxlink.ru/wp-content/uploads/2020/08/17-bd-queue-test.jpg)
Скрипт 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 в консоли Asterisk необходимо набрать.
CLI>agi set debug on
![](https://voxlink.ru/wp-content/uploads/2020/08/18-test1.jpg)
Если в базе будет запись, о том, что какой-либо добавочный совершал исходящие на номер звонящего – вызов пойдет на очередь 500 с этим динамическим агентом, а по неответу – на общую очередь.
![](https://voxlink.ru/wp-content/uploads/2020/08/19-test2.jpg)
Для проверки удаления из очереди для кастомизации входящих вызовов (500), еще раз позвоним и сбросим.
![](https://voxlink.ru/wp-content/uploads/2020/08/20-test3.jpg)
Агентов очереди можно посмотреть командой
asterisk -rx ‘queue show 500’
Очередь должна быть пуста т.к. агенты этой очереди удаляются из нее скриптом, вызываемым по выходу из нее.
![](https://voxlink.ru/wp-content/uploads/2020/08/21-show-queue-agents.jpg)
![](/wp-content/uploads/2019/05/MG_1241.png)
Остались вопросы?
Я - Компаниец Никита, менеджер компании 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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.