Создание категорий доступа и статистики звонков в RealTime для IP-PBX
В статье подробно описывается процесс расширения IP-PBX на базе Asterisk с использованием механизма RealTime и PJSIP. Рассматривается добавление новых таблиц в базу данных MariaDB для управления категориями доступа к внешним вызовам, а также для ведения статистики исходящих и входящих звонков. Предоставляются пошаговые инструкции по настройке диалплана в Asterisk 20 на CentOS 7, интеграции с коннектором ODBC и использованию функций REALTIME_FIELD и REALTIME_STORE для эффективного контроля доступа и анализа звонков. Кроме того, в статье приведены примеры конфигурации, заполнения таблиц и проверки работоспособности системы, что делает её полезным руководством для системных администраторов и разработчиков, стремящихся улучшить управление телефонными коммуникациями в организации.
Данная статья является продолжением и развитием темы по созданию IP-PBX используя механизм RealTime с применением PJSIP.
В предыдущей статье было рассмотрено, как создать в режиме реального времени добавочные номера, транк, а также диалплан для входящих и исходящих вызовов используя базу данных.
Используемое программное обеспечение:
- предустановленный CentOS 7;
- предустановленный Asterisk 20.0.0;
- база данных MariaDB;
- коннектор ODBC.
Для начала расширим ранее созданную базу данных и добавим следующие таблицы:
1. Category_list – эта таблица будет содержать информацию по категориям доступа для осуществления внешних вызовов:
- 1 категория – выход разрешен для номеров 8-495-ХХХ-ХХ-ХХ;
- 2 категория – выход разрешен на все номера соответствующие шаблону 8-ХХХ-ХХХ-ХХ-ХХ;
- без категории – выход на внешнюю связь не разрешен, такие номера в таблицу заноситься не будут.
В консоли MariaDB перейдем в базу данных asteriskrt и добавим таблицу:
CREATE TABLE `category_list` (
`number` varchar(40) DEFAULT NULL,
`category` varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. Statistics_list – для ведения статистики по исходящим вызовам со 2 категорией с целью ведения информации о том, кто звонил, куда звонил и сколько времени разговаривал.
В консоли MariaDB перейдем в базу данных asteriskrt и добавим таблицу:
CREATE TABLE `statistics_list` (
`date` varchar(40) DEFAULT NULL,
`exten` varchar(40) DEFAULT NULL,
`callerid` varchar(40) DEFAULT NULL,
`billsec` varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3. In_call_list – для ведения статистики по входящим вызовам с целью ведения информации о том, кто звонил, куда звонил и сколько времени разговаривал.
В консоли MariaDB перейдем в базу данных asteriskrt и добавим таблицу:
CREATE TABLE ` in_call_list ` (
`date` varchar(40) DEFAULT NULL,
`exten` varchar(40) DEFAULT NULL,
`callerid` varchar(40) DEFAULT NULL,
`billsec` varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4. Hadler – контекст из диалплана перенесенный в отдельную таблицу, в которой будет выполняться функция REALTIME_STORE.
В консоли MariaDB перейдем в базу данных asteriskrt и добавим таблицу:
CREATE TABLE ` hadler ` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`context` varchar(40) NOT NULL,
`exten` varchar(40) NOT NULL,
`priority` int(11) NOT NULL,
`app` varchar(40) NOT NULL,
`appdata` varchar(256) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `context` (`context`,`exten`,`priority`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
5. Macro — контекст из диалплана перенесенный в отдельную таблицу, в которой будет выполняться макрос для включения записи разговоров.
В консоли MariaDB перейдем в базу данных asteriskrt и добавим таблицу:
CREATE TABLE ` macro` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`context` varchar(40) NOT NULL,
`exten` varchar(40) NOT NULL,
`priority` int(11) NOT NULL,
`app` varchar(40) NOT NULL,
`appdata` varchar(256) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `context` (`context`,`exten`,`priority`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
Все вышеуказанные таблицы добавлены в базу данных asteriskrt. На рисунке 1 показаны все созданные и добавленный мной таблицы.
Заполнение таблицы
Заполним таблицу сategory_list для установления категорий доступа на внешнюю связь. Добавим два номера 1002 (категория 1) и 1003 (категория 2) следующими командами:
insert into сategory_list (number, category) values (1002, 1);
insert into сategory_list (number, category) values (1003, 2);
Обновление диалплана и добавление новых контекстов
В предыдущей статье я рассматривал, как осуществлять добавление таблиц с использованием OpenOffice Calc. На рисунке 3 и 4 я загрузил диалплан.
Ниже будет рассмотрено, как заставить asterisk работать с разными таблицами.
В таблице extensions присутствуют следующие контексты:
1.From-internal:
- _[1-2]00X — для осуществления локальных вызовов с включением макроса записи разговоров;
- _8XXXXXXXXXX — для осуществления внешних вызовов с включением макроса записи разговора, в этом шаблоне также происходит сравнение категории доступа и указывается место для дальнейшего перехода, если условие верно или не верно (рисунок 5);
- _8495XXXXXXX — для осуществления внешних вызовов с включением макроса записи разговоров, в этом шаблоне также происходит сравнение категории доступа и указывается место для дальнейшего перехода, если условие верно или не верно;
2.From-trunk:
- _X. — для входящих вызовов с включением макроса записи разговоров, в этом шаблоне указывается место для перехода по завершению вызова (рисунок 6);
Рассмотрим рисунок 5 подробнее:
1. Приложением set установим значение переменной диалплана, в которой укажем функцию запроса реального времени REALTIME_FIELD для обращения к таблице category_list с целью извлечения категории доступа:
COUNT=$[${REALTIME_FIELD(category_list,number,${CALLERID(num)},category)}]
REALTIME_FIELD – это функция для извлечения одного элемента.
Имеет следующий формат:
REALTIME_FIELD(family,fieldmatch,matchvalue,fieldname)
где,
family – имя для обращения к таблице БД, указанное в extconfig.conf (category_list),
fieldname – выводимый элемент, для нас это будет категория доступа,
fieldmatch — содержит значение matchvalue, то есть в нашем случае, если CallerID, вызывающего абонента, содержится в таблице БД и он равен значению из колонки number – будет извлечено значение из колонки category.
2. Приложением GotoIf осуществляем переход по условию, если заданная переменная равна 2 и выражение истина, то выполняем переход по контексту на приоритет 5, если ложно, то на приоритет 13 и завершаем вызов.
3. Следующим приоритетом будет включение Macro для осуществления записи разговора.
4. Приложением set включаем подпрограмму, которая будет выполняться, когда на канале повесят трубку. Подробнее о механизме hangup hadler вы можете почитать в статье https://voxlink.ru/kb/asterisk-configuration/mehanizm-hangup-handler-v-asterisk/ .
После того, как на канале повесят трубку, то осуществляется переход на контекст диалплана hangup-hadler, в котором описана функция для занесения информации в БД (рис. 7).
Такой подход позволяет исключить проблему с занесением информации в БД, которая возникает, если по завершению вызова продолжить выполнять диалплан. Проблема возникает, если вызываемый абонент завершает вызов и канал не закрывается, из-за чего мы не можем получить сведения ою окончании вызова.
5. В приоритете 11 задаем переменную с номером вызывающего абонента – это нужно для указания полученного значения при формировании информации для БД, так как hangup hadler используется c exten s. В случае, если не задать переменную, то в БД вызывающий номер будет занесен, как s.
Аналогичным способом создается контекст для входящей связи from-trunk, только переход будет осуществляться в контекст hangup-hadler-in (рис. 6).
Рассмотрим рис. 7 подробнее:
1. Приложением set запустим функцию REALTIME_STORE и перечислим требуемые переменные:
REALTIME_STORE(statistics_list,date,exten,callerid,billsec)=${STRFTIME(${EPOCH},,%d-%m-%Y_%H:%M:%S)},${COUNT1},${CALLERID(num)},${ANSWEREDTIME}
REALTIME_STORE(in_call_list,date,exten,callerid,billsec)=${STRFTIME(${EPOCH},,%d-%m-%Y_%H:%M:%S)},${COUNT1},${CALLERID(num)},${ANSWEREDTIME}
REALTIME_STORE – это функция, которая осуществляет запись множества полей в реалтайм хранилище (максимум 30 пар).
Имеет следующий формат:
REALTIME_STORE(family,field1,fieldN[,…],field30=val1,val2,valN[,…],val30)
где,
family – имя для обращения к таблице БД, указанное в extconfig.conf (statistics_list и in_call_list),
fieldN – аргумент (задаем название требуемых колонок из таблиц),
valN – значение переменной.
Следует обратить внимание на переменную ${ANSWEREDTIME} – это время от ответа до отбоя, то есть время самого разговора. Указанная переменная показывает время в секундах. Для отображения времени в миллисекундах можно использовать переменную ${ANSWEREDTIME_MS}.
Для того, чтобы созданные таблицы в БД заработали требуется:
1.Связать созданные идентификаторы с таблицами в БД (рис. 8). Обратите внимание, все созданные таблицы описываются в файле extconfig.conf.
2. Указать в диалплане, куда обращаться к контекстам и какой механизм использовать (рис. 9).
На этом построение диалплана заканчивается и можно приступать к проверке работоспособности.
Проверка работоспособности
На рисунке 10 осуществлен исходящий вызов на мобильный номер с внутреннего номера 1003, который имеет категорию доступа 2.
Как видим, что при проверке разрешения на внешнюю связь, номер 1003 соответствует требуемой категории доступа. Для 2 категории вызовы разрешены. После завершения вызовы происходит отработка hangup hadler и осуществляется занесение сведений в БД.
На рисунке 11 мы видим, что у номера 1001 категория доступа не соответствует условиям и из-за чего внешние вызовы недоступны.
На рисунке 12 осуществлен входящий вызов с транка на внутренний номер 1003. После завершения вызовы мы видим, как отрабатывает hangup hadler и осуществляется занесение сведений в БД.
После тестовых вызов осуществим проверку базы данных.
Проверка базы данных
Перейдем в консоль MariaDB для подключения к базе данных asteriskrt и осуществим запрос для вывода таблицы statistics_list (рисунок 13). В таблицу занесены вызовы, совершенные на мобильные номера, также присутствуют номера вызывающих абонентов, дата и время, время разговора. В случае, если разговор не состоялся, то время отображаться не будет.
Аналогичным способом просмотрим таблицу in_call_list (рисунок 14). В нее занесена информация по входящим вызовам.
Используя в реальном времени функции REALTIME_FIELD и REALTIME_STORE можно построить механизм ограничивающий доступ на внешнюю связь, а также создать свою собственную систему статистики вызовов или даже CDR. На этом применение функций не ограничивается. Такой способ реализации мне показался довольно интересным и наглядным в рамках погружения в механизм реального времени и взаимодействия Asterisk с базой данных.
Остались вопросы?
Я - Першин Артём, менеджер компании 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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.