Настройка CEL в Asterisk

Asterisk CEL

Alexcr
В настроящее время Asterisk всё больше и больше набирает популярность, им пользуются не только организации, но и обычные люди и для её пользователей встает вопрос тарификации разговоров. Например в относительно простой системе, где точность нестоль существена можно обойтись с помощью стандартного модуля CDR (Call Detail Record), который имеет три события: «Начало», «Ответ», «Конец» звонка и вести учет времени как разницу между окончанием разговора и ответом на звонок, но как быть, если у нас звонок с ненулевой вероятность может быть переадресован или поставлен на удержание? Для этого этих целей в Asterisk существует модуль CEL (Channel Event Logging) и под катом я опишу его концепцию и пример конфигурации.

Итак, основным объектом в Asterisk является «Канал», на нем основывается связь между двумя коммуникационными портами. Есть смысл иметь систему событий, записывающую важные события, каждое событие присоединяется к каналу, например ANSWER или HANGUP. CEL генерирует события, которые могут быть собраны в одном месте и в последствие использованы для подсчета статистики.

Основные события в CEL:
Событие Описание
CHAN_START время создания канала
CHAN_END время завершения канала
ANSWER время ответа
HANGUP время когда абонент «положил трубку»
CONF_ENTER время включения канала в конференцию
CONF_EXIT время удаления канала из конференции
CONF_START время входа первого абонента в конференцию
CONF_END время выхода последнего абонента из конференции
APP_START время запуска приложения
APP_END время завершения приложения
PARK_START время начала приостановки звонка
PARK_END время завершения приостановки звонка
BRIDGE_START время запуска моста
BRIDGE_END время завершения моста
BRIDGE_UPDATE подмена канала()
3WAY_START генерируется когда начата конференция с 3 участниками, обычно используется при условной переадресации звонка
3WAY_END
BLINDTRANSFER данное событие возникает при безусловной переадресации звонка
ATTENDEDTRANSFER возникает при условной переадресации звонка
FORWARD событие возникает когда канал перенаправлен
HOOKFLASH событие создаваемое при сигнале отбоя DAHDI интерфейса
USER_DEFINED зависит от диалплана и имеет имя данное пользователем


После рассмотрения концепции CEL можно приступить к его конфигурации. Целью является запись всех событий в БД MySql, вся работа с базой данных будет осуществляться с помощью ODBC. 
Перед конфигурации ODBC в Asterisk, необходимо установить необходимые пакеты в систему:
apt-get install unixODBC unixODBC-dev libmyodbc 
(если Вы используете отличную от Debian систему, то следует воспользоваться другим пакетным менеджером)
Конфигурация для MySQL ODBC драйвера выполняется в файле /etc/odbcinst.ini
Пример конфигурации:
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
FileUsage = 1

Если указанных каталогов по указанным путям нет, то они могут находиться в другом каталоге, их можно легко найти, достаточно выполнить следующие команды:
:~# updatedb
:~# locate libmyodbc.so
:~# locate libodbcmyS.so
Последние две команды покажут на экране местонахождение библиотек, пропигем соответствующий путь, например: /usr/lib/i386-linux-gnu/odbc/libmyodbc.so

Следующим шагом будет конфигурация файла /etc/odbc.ini, который используется для создания идентификатора, который Asterisk будет использовать для ссылки на эту конфигурацию, если в будущем решите сменить БД, то следует переконфигурировать это файл.
Вот пример конфигурации:
[asterisk-connector]
Description = MySQL connection to 'asterisk' database
Driver = MySQL
Database = asterisk
Server = localhost
UserName = user
Password = 123456
Port = 3306

Теперь сконфигурируем Asterisk для работы с БД через ODBC, для этого служит файл /etc/asterisk/res_odbc.conf 
Пример конфигурации данного файла:
[asterisk]
enabled => yes
dsn => asterisk-connector
username => asterisk
password => 123456
pooling => no
pre-connect => yes
Опция dsn указывает соединение, которое сконфигурировано в /etc/odbc.ini, а опция pre-connect говорит Asterisk’у поднимать соединение с базой когда загружается модуль res_odbc.so 

Важное замечание, Asterisk должен быть собран с поддержкой ODBC!
Для проверки можно выполнить из CLI команду odbc show.

И теперь самое главное, приступаем к конфигурации CEL. Откроем конфигурационный файл Откроем конфиг /etc/asterisk/cel.conf и внесем в него следующие изменения:
[general]
enable=yes
apps=all
events=all
dateformat = %F %T

apps — данная опция указывает какие приложения следует отслеживать.
events — с помощью этой опции указываем какие события(из таблицы выше) следует заносить в БД.
Далее необходимо отредактировать файл /etc/asterisk/cel_custom.conf в нем раскомментируем секцию [mappings].

И последний файл, который следует отредактировать /etc/asterisk/cel_odbc.conf, внесем в него следующие изменения:
[first]
connection=asterisk 
table=cel
loguniqueid=yes
Опция connection задает имя коннектора из файла res_odbc.conf, а опция table указывает имя таблицы БД для сохранения данных.

Завещающим шагом настройки является создание БД и таблицы.
:~# mysql –uroot –p
mysql> CREATE DATABASE asterisk;
mysql> use asterisk;
mysql> CREATE TABLE IF NOT EXISTS `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.

Проверка работы осуществляется с помощью команд из CLI Asterisk:
cel show status
odbc show

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