8(499)-709-97-83
Работаем с 8:00 до 19:00

Подключение Asterisk к MySQL через драйвер ODBC

  • 01 сентября 2015

В первых версиях Asterisk для сбора и хранения данных CDR и CEL в MySQL использовался драйвер cdr_mysql.so и cel_mysql.so, соответственно. В настоящий момент эти драйверы устарели и разработчики рекомендуют использовать технологию ODBC.

ODBC (Open Database Connectivity) — это программный интерфейс (API) доступа к базам данных, разработанный фирмой Microsoft, в сотрудничестве с Simba Technologies на основе спецификаций Call Level Interface (CLI), который разрабатывался организациями SQL Access Group, X/Open и Microsoft. Впоследствии CLI был стандартизован ISO. Стандарт CLI призван унифицировать программное взаимодействие с СУБД, сделать его независимым от поставщика СУБД и программно-аппаратной платформы. Спасибо Википедии.

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

В этой статье мы рассмотрим, как подключить Asterisk к MySQL для записи CDR на сторонний сервер.

Что мы имеем:

- Сервер с Asterisk 13, на ОС Centos 6.5 (x86_64) / Ubuntu Server 14.10 (x86_64)

- Сервер с MySQL 5.5, на какой ОС нам в принципе не важно.

Для установки драйвера на Red Hat подобных ОС, необходимо ввести следующую команду:

yum install unixodbc unixodbc-devel libtool-ltdl libtool-ltdl-devel mysql-connector-odbc

Для Debian подобных ОС, необходимо выполнить следующую команду:

sudo apt-get install unixodbc unixodbc-dev libmyodbc

Далее необходим отредактировать файл /etc/odbcinst.ini. В Centos он уже существует, в Ubuntu он существует, но файл пустой.

nano /etc/odbcinst.ini

Проверьте правильно ли указаны пути к драйверам ODBC.

1) Для Centos x86_x64:

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc5.so
Setup = /usr/lib/libodbcmyS.so
FileUsage = 1

Для Centos x64:

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib64/libmyodbc5.so
Setup = /usr/lib64/libodbcmyS.so
FileUsage = 1

2) Для Ubuntu:

# 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

и должны увидеть следующее:

odbcinst -q -d
[MySQL]

После этого отредактируем файл /etc/odbc.ini, это файл используется для создания идентификатора для Asterisk. Т.е. Asterisk, в своей конфигурации, будет ссылается на название, указанное в этом файле.

nano /etc/odbc.ini

1) Для Centos:

[MySQL-asteriskcdrdb]Description=MySQL connection to 'asterisk' database
driver=MySQL
server=localhost
database=asteriskcdrdb
Port=3306
Socket=/var/lib/mysql/mysql.sock
option=3

2) Для Ubuntu:

[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asterisk' database
driver=MySQL
server=localhost
database=asteriskcdrdb
Port=3306
Socket=/var/run/mysqld/mysqld.sock
option=3

Т.е. в нашем примере, Asterisk в своих конфигурационных файлах будет использовать идентификатор [MySQL-asteriskcdrdb].

Если мы хотим подключиться к сторонней базе данных, т.е. установленной на другом сервере, нежели Asterisk, то в файле /etc/odbc.ini необходимо просто изменить строчку server=localhost на server=IPадресБД (в нашем примере 192.168.7.17)

1) Для Centos:

[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asterisk' database
driver=MySQL
server=192.168.7.17
database=asteriskcdrdb
Port=3306
Socket=/var/lib/mysql/mysql.sock
option=3

2) Для Ubuntu:

[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asterisk' database
driver=MySQL
server=192.168.7.17
database=asteriskcdrdb
Port=3306
Socket=/var/run/mysqld/mysqld.sock
option=3

Далее необходимо проверить сможем ли мы подключиться к базе данных, используя утилитку 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
SQL> [root@asterisk mysql]#

Теперь перейдем к настройкам MySQL.

1) Подключаемся к MySQL

mysql -urootuser -prootpassword

2) Создадим базу данных asteriskcdrdb

mysql> CREATE DATABASE asteriskcdrdb default charset utf8;

3) Переходим в базу данных

mysql> use asteriskcdrdb;

4) Создадим две таблицы CDR и CEL.

CREATE TABLE `cdr` (
`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 '',
`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 '',
`uniqueid` varchar(32) NOT NULL DEFAULT '',
`userfield` varchar(255) NOT NULL DEFAULT '',
`did` varchar(50) NOT NULL DEFAULT '',
`recordingfile` varchar(255) NOT NULL DEFAULT '',
`cnum` varchar(40) NOT NULL DEFAULT '',
`cnam` varchar(40) NOT NULL DEFAULT '',
`outbound_cnum` varchar(40) NOT NULL DEFAULT '',
`outbound_cnam` varchar(40) NOT NULL DEFAULT '',
`dst_cnam` varchar(40) NOT NULL DEFAULT '',
KEY `calldate` (`calldate`),
KEY `dst` (`dst`),
KEY `accountcode` (`accountcode`),
KEY `uniqueid` (`uniqueid`),
KEY `did` (`did`)
)
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`)
)

5) Дадим права пользователю asterisk на работы с БД asteriskadcdb

GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO 'asteriskuser'@'localhost';

Если сервер с БД и Asterisk разные машины, то необходимо внести такую запись.

GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO 'asteriskuser'@'IP адрес сервера Asterisk' identified by 'Your-Password';

Обновляем привилегии.

FLUSH PRIVILEGES;
 

Далее необходимо пересобрать Asterisk, выбрав модули связанные с odbc.

$ cd /usr/src/asterisk-13.4.0/
$ ./configure
$ make menuselect
$ make install

В файл /etc/asterisk/res_odbc.conf добавляем следующие строчки.

[asteriskcdrdb]
enabled=>yes
dsn=>MySQL-asteriskcdrdb
pooling=>no
limit=>1
pre-connect=>yes
username=>asteriskuser
password=>your_password_from_database

Параметр DSN отвечает за подключение Asterisk к базе данных, указанной в файле /etc/odbc.ini. Этот параметр говорит Asterisk, что необходимо открыть и поддерживать соединение с базой данных при загрузке модуля res_odbc.so.

Перезапустим сервис 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
Pooled: No
Connected: Yes

Далее отредактируем файлы, связанные с CDR и CEL.

1) В файл /etc/asterisk/cdr_odbc.conf добавляем следующие строчки.

[asteriskcdrdb]
connection=asteriskcdrdb
loguniqueid=yes
table=cdr
alias start => calldate

2) В файл /etc/asterisk/cel_odbc.conf добавляем следующие строчки.

[cel]
connection=asteriskcdrdb
loguniqueid=yes
table=cel
 
 
Powered by SEO CMS ver.: 23.1 TOP 2 (opencartadmin.com)