Настройка подключения Asterisk 13 к MySQL через драйвер ODBC.

Рассмотрим как подключить Asterisk 13 к MySQL посредством ODBC (Open Database Connectivity) для ведения записей CDR (Call Detail Records) и CEL (Channel Event Logging).

 

До версии Asterisk 13, для хранения CDR и CEL в MySQL использовал драйвер cdr_mysql.so и cel_mysql.so. Начиная с Asterisk 13 эти модули Deprecated (Устарели) и не рекомендованы к использованию. Разработчики рекомендуют использовать технологию ODBC.

 

Исходные данные:

  • Debian 8 Jessie
  • Asterisk 13 (13.22.0) — развернутый по данной статье
  • MySQL (5.5.60)

 

Подготовка системы

Перед началом установки обновляем систему до актуального состояния:

apt-get update && sudo apt-get upgrade -y

Устанавливаем необходимые зависимости:

sudo apt-get install unixodbc unixodbc-dev libmyodbc

 

Настройка драйвера ODBC

Приводим файл конфигурации (/etc/odbcinst.ini) к виду:

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package

[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1

 

Проверим связность ODBC и MySQL:

odbcinst -q -d

Результат должен быть следующим:

[MySQL]

 

Редактируем файл(/etc/odbc.ini), приводим в соответствие:

[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asterisk' database
Driver=MySQL
Server=localhost
User=asteriskuser
Password=asterpass
Database=asteriskcdrdb
Port=3306
Charset=utf8
Socket=/var/run/mysqld/mysqld.sock
Option=3
Этот файл служит для создания идентификатора для Asterisk 13. Asterisk будет ссылаться на название, указанное в этом файле.

 

Проверим использование утилиты ISQL

echo "select 1" | isql -v MySQL-asteriskcdrdb

Вывод:

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select 1
+---------------------+
| 1                   |
+---------------------+
| 1                   |
+---------------------+
SQLRowCount returns 1
1 rows fetched

 

Настройка MySQL

Для корректного отображения «Кириллицы» в таблицах, необходимо выполнить настройку MySQL на использование кодировки UTF-8 из данной статьи.

 

Создадим базу данных и пользователя:

mysql -urootuser -p

CREATE DATABASE asteriskcdrdb default charset utf8;
GRANT ALL PRIVILEGES ON asteriskcdrdb.* to asteriskuser@localhost IDENTIFIED BY 'asterpass';
FLUSH PRIVILEGES;

 

Подключаемся к созданной базе данных и создаем необходимые таблицы (CDR и CEL):

use asteriskcdrdb;
CREATE TABLE IF NOT EXISTS `cdr` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL DEFAULT '',
`src` varchar(80) NOT NULL DEFAULT '',
`dst` varchar(80) NOT NULL DEFAULT '',
`dcontext` varchar(80) NOT NULL DEFAULT '',
`channel` varchar(80) NOT NULL DEFAULT '',
`dstchannel` varchar(80) NOT NULL DEFAULT '',
`lastapp` varchar(80) NOT NULL DEFAULT '',
`lastdata` varchar(80) NOT NULL DEFAULT '',
`start` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`answer` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`duration` int(11) NOT NULL DEFAULT '0',
`billsec` int(11) NOT NULL DEFAULT '0',
`disposition` varchar(45) NOT NULL DEFAULT '',
`amaflags` int(11) NOT NULL DEFAULT '0',
`accountcode` varchar(20) NOT NULL DEFAULT '',
`userfield` varchar(255) NOT NULL DEFAULT '',
`uniqueid` varchar(32) NOT NULL DEFAULT '',
`linkedid` varchar(32) NOT NULL DEFAULT '',
`sequence` int(11) NOT NULL DEFAULT '0',
`truedst` varchar(80) NOT NULL DEFAULT '',
`did` varchar(50) NOT NULL DEFAULT '',
`didanswer` varchar(60) NOT NULL DEFAULT '',
`recordingfile` varchar(255) DEFAULT 'none',
PRIMARY KEY (`id`),
KEY `calldate` (`calldate`),
KEY `clid` (`clid`),
KEY `src` (`src`),
KEY `dst` (`dst`),
KEY `disposition` (`disposition`),
KEY `uniqueid` (`uniqueid`),
KEY `dcontext` (`dcontext`),
KEY `didanswer` (`didanswer`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE `cel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`eventtype` varchar(30) NOT NULL,
`eventtime` datetime NOT NULL,
`cid_name` varchar(80) NOT NULL,
`cid_num` varchar(80) NOT NULL,
`cid_ani` varchar(80) NOT NULL,
`cid_rdnis` varchar(80) NOT NULL,
`cid_dnid` varchar(80) NOT NULL,
`exten` varchar(80) NOT NULL,
`context` varchar(80) NOT NULL,
`channame` varchar(80) NOT NULL,
`src` varchar(80) NOT NULL,
`dst` varchar(80) NOT NULL,
`channel` varchar(80) NOT NULL,
`dstchannel` varchar(80) NOT NULL,
`appname` varchar(80) NOT NULL,
`appdata` varchar(80) NOT NULL,
`amaflags` int(11) NOT NULL,
`accountcode` varchar(20) NOT NULL,
`uniqueid` varchar(32) NOT NULL,
`linkedid` varchar(32) NOT NULL,
`peer` varchar(80) NOT NULL,
`userdeftype` varchar(255) NOT NULL,
`eventextra` varchar(255) NOT NULL,
`userfield` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `uniqueid_index` (`uniqueid`),
KEY `linkedid_index` (`linkedid`)
);

 

Если планируется использовать доработанный (Asterisk CDR Viewer Mod), то необходимо так же добавить триггер, для корректного отображения вызываемого номера (вводить последовательно):

DROP TRIGGER IF EXISTS `t_cdr`;
DELIMITER //
CREATE TRIGGER `t_cdr` BEFORE INSERT ON `cdr`
FOR EACH ROW BEGIN
IF ((NEW.dst = 's' OR NEW.dst = '~~s~~') AND NEW.truedst != '') THEN
SET NEW.dst = NEW.truedst;
END IF;
END
//
DELIMITER ;

exit;

 

Настройка Asterisk 13

Для работы связки с ODBC драйвером, необходимо наличие установленного в Asterisk модуля res_config_mysql.so. Если Asterisk был собран без данного модуля, то необходимо его пересобрать с модулем и выполнить установку.

 

Переходим в каталог с дистрибутивом Asterisk, вызываем меню, отмечаем необходимый модуль и нажимаем Save & Exit:

make menuselect

 

Выполняем установку:

make install

 

Редактируем файл (/etc/asterisk/res_odbc.conf), вписываем в конец файла:

[asteriskcdrdb]
enabled=yes
dsn=MySQL-asteriskcdrdb
pre-connect=yes
username=asteriskuser
password=asterpass
Параметр DSN отвечает за подключение Asterisk к БД, указанной в файле /etc/odbc.ini. Этот параметр говорит Asterisk, что необходимо открыть и поддерживать соединение с базой данных при загрузке модуля res_odbc.so.

 

Настройка сбора логов CDR

Редактируем файл (/etc/asterisk/cdr_adaptive_odbc.conf), вписываем в конец файла:

[first]
connection=asteriskcdrdb
table=cdr
loguniqueid=yes
usegmtime = no
alias start => calldate
alias truedst => truedst
alias didanswer => didanswer
Использование мной файла конфигурации cdr_adaptive_odbc.conf, вместо cdr_odbc.conf, обусловлено тем что мне необходимо использование custom полей, для занесения каких то своих данных в таблицу CDR

 

Настройка сбора логов CEL

Включаем генерацию CEL данных в Asterisk.

В файле конфигурации (/etc/asterisk/cel.conf), в секции [general] приписываем:

[general]
enable=yes
apps=all
events=ALL
dateformat = %F %T

 

Редактируем файл (/etc/asterisk/cel_odbc.conf), вписываем в конец файла:

[cel]
connection=asteriskcdrdb
loguniqueid=yes
table=cel
Где cel – название таблицы в MySQL, asteriskcdrdb – название соединения ODBC из файла /etc/asterisk/res_odbc.conf

 

Перезапускаем Asterisk:

service asterisk restart

 

Через CLI Asterisk проверим подключение к БД через драйвер ODBC:

*CLI> odbc show
ODBC DSN Settings
-----------------

Name: asteriskcdrdb
DSN: MySQL-asteriskcdrdb
Last connection attempt: 1970-01-01 03:00:00
Number of active connections: 1 (out of 1)

 

Связь с базой данных MySQL настроена. Теперь данные CDR и CEL будут записываться в соответствующие таблицы. Для удобного просмотра информации из базы данных, рекомендую использовать  Asterisk CDR Viewer Mod. На данный момент как мне кажется это лучший просмотрщик CDR из бесплатных. Установка его очень очень подробно изложена в README файле, находящегося в дистрибутиве.

 

Понравилась или оказалась полезной статья, поблагодари автора

 

БесполезноСлабоватоПриемлемоОтличноПревосходно (Еще нет оценок)
Загрузка...

Оставить ответ

18 + четыре =