Андрей Зезюлин
05.11.2024
1008

Создание категорий доступа и статистики звонков в 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 показаны все созданные и добавленный мной таблицы.

Созданные и добавленные таблицы в Mariadb
Рис. 1 Созданные и добавленные таблицы в Mariadb

Заполнение таблицы

Заполним таблицу сategory_list для установления категорий доступа на внешнюю связь. Добавим два номера 1002 (категория 1) и 1003 (категория 2) следующими командами:

insert into сategory_list (number, category) values (1002, 1);
insert into сategory_list (number, category) values (1003, 2);
Таблица сategory_list
Рис. 2 Таблица сategory_list

Обновление диалплана и добавление новых контекстов

В предыдущей статье я рассматривал, как осуществлять добавление таблиц с использованием OpenOffice Calc. На рисунке 3 и 4 я загрузил диалплан.

Обратите внимание, что для удобства можно разграничивать и использовать разные таблицы в БД.

Ниже будет рассмотрено, как заставить asterisk работать с разными таблицами.

Рис. 3 Таблица extensions
Рис. 4 Таблицы macro и hadler

В таблице extensions присутствуют следующие контексты:

1.From-internal:

  • _[1-2]00X — для осуществления локальных вызовов с включением макроса записи разговоров;
  •  _8XXXXXXXXXX — для осуществления внешних вызовов с включением макроса записи разговора, в этом шаблоне также происходит сравнение категории доступа и указывается место для дальнейшего перехода, если условие верно или не верно (рисунок 5);
  •  _8495XXXXXXX — для осуществления внешних вызовов с включением макроса записи разговоров, в этом шаблоне также происходит сравнение категории доступа и указывается место для дальнейшего перехода, если условие верно или не верно;

2.From-trunk:

  •   _X. — для входящих вызовов с включением макроса записи разговоров, в этом шаблоне указывается место для перехода по завершению вызова (рисунок 6);
Контекст для осуществления выхода на внешнюю связь
Рис. 5 Контекст для осуществления выхода на внешнюю связь

Рассмотрим рисунок 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).

Контекст для осуществления входящего вызова
Рис. 6 Контекст для осуществления входящего вызова
Контексты для выполнения действий по завершению вызова
Рис. 7 Контексты для выполнения действий по завершению вызова

Рассмотрим рис. 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.

Связывание идентификаторов с таблицами в базе
Рис. 8 Связывание идентификаторов с таблицами в базе

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

Обозначение контекстов в плане набора
Рис. 9 Обозначение контекстов в плане набора

На этом построение диалплана заканчивается и можно приступать к проверке работоспособности.

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

Исходящий вызов на мобильный телефон
Рис. 10 Исходящий вызов на мобильный телефон

На рисунке 10 осуществлен исходящий вызов на мобильный номер с внутреннего номера 1003, который имеет категорию доступа 2.

Как видим, что при проверке разрешения на внешнюю связь, номер 1003 соответствует требуемой категории доступа. Для 2 категории вызовы разрешены. После завершения вызовы происходит отработка hangup hadler и осуществляется занесение сведений в БД.

Исходящий вызов с номера без категории
Рис. 11 Исходящий вызов с номера без категории

На рисунке 11 мы видим, что у номера 1001 категория доступа не соответствует условиям и из-за чего внешние вызовы недоступны.

Обратите внимание, такие попытки вызовов в БД заносится не будут, так как они не попадают в контекст, где выполняются подобные действия.
Входящий вызов
Рис. 12 Входящий вызов

На рисунке 12 осуществлен входящий вызов с транка на внутренний номер 1003. После завершения вызовы мы видим, как отрабатывает hangup hadler и осуществляется занесение сведений в БД.

После тестовых вызов осуществим проверку базы данных.

Проверка базы данных

Перейдем в консоль MariaDB для подключения к базе данных asteriskrt и осуществим запрос для вывода таблицы statistics_list (рисунок 13). В таблицу занесены вызовы, совершенные на мобильные номера, также присутствуют номера вызывающих абонентов, дата и время, время разговора. В случае, если разговор не состоялся, то время отображаться не будет.

Рис. 13 Таблица статистики исходящих вызовов

Аналогичным способом просмотрим таблицу in_call_list (рисунок 14). В нее занесена информация по входящим вызовам.

Таблица статистики входящих вызовов
Рис. 14 Таблица статистики входящих вызовов

Используя в реальном времени функции REALTIME_FIELD и REALTIME_STORE можно построить механизм ограничивающий доступ на внешнюю связь, а также создать свою собственную систему статистики вызовов или даже CDR. На этом применение функций не ограничивается. Такой способ реализации мне показался довольно интересным и наглядным в рамках погружения в механизм реального времени и взаимодействия Asterisk с базой данных.

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