LANBilling получает от АТС информацию о звонках в виде CDR-файлов. Разные модели АТС сохраняют записи о звонках в разных форматах. Чтобы биллинг мог обработать эти файлы, их необходимо преобразовать — для этого нужны парсеры. Парсеры для наиболее распространённых моделей АТС уже есть в LANBilling, но вы можете добавить свой.
Форматы CDR делятся на два вида: бинарные и текстовые. В зависимости от того, какой формат использует ваша АТС, загрузите в LANBilling файл парсера или файл конфигурации. Примеры парсеров и обработки CDR.
Бинарный формат — загрузите отдельный файл парсера.
Текстовый формат обрабатывает text_plug-in — он уже входит в LANBilling. Для обработки текстовых форматов CDR, как правило, используются регулярные выражения — POSIX Extended. Регулярное выражение и другие параметры обработки задаются в специальном файле конфигурации. Расширение файла конфигурации — «.conf», а имя — название формата в нижнем регистре. Например, alcatel-2.conf.
Сохраните файл в директории /usr/local/billing/parsers/
.
Откройте форму агента LBphone. Перейдите на вкладку «Парсеры».
Нажмите «Добавить».
В открывшемся окне укажите название парсера. Оно должно содержать имя плагина — поле plug-in в таблице pabxes. Также заполните описание — оно будет отображаться в других формах настроек.
Выберите тип «парсер».
Введите название файла.
Набор параметров, которые можно использовать в файле конфигурации:
Сохраните файл в директории /usr/local/billing/parsers-configs/
.
Откройте форму агента LBphone. Перейдите на вкладку «Парсеры».
Нажмите «Добавить».
В открывшемся окне укажите название парсера. Также заполните описание — оно будет отображаться в других формах настроек.
Выберите тип «файл конфигурации».
Введите название файла.
Затем добавьте станцию — в её параметрах нужно будет указать парсер. Когда ваши абоненты будут совершать вызовы, LBphone определит, с какой станции они поступают, и подключит нужный парсер.
Парсер можно добавить в форме любого агента с типом LBphone. В дальнейшем парсер можно будет использовать для остальных агентов LBphone.
Когда завершите настройку, задайте параметры в файле конфигурации, а затем запустите модуль LBphone.
#!/usr/bin/perl
$|++;
## Uncoment the following block if PBX requires authentication. #######
#open (OUT,">&3")
#print OUT "Reguired-Login\n"
#print OUT "Required-Password\n"
## End of the block ##
while(<>)
{
if( $_ =~ m/^(\d+);(\d+);(\d{4}-\d{2}-\d{2}T\d\d:\d\d:\d\d);
([^;]*);([^;]*);([^;]*);([^;]*);(\d*);(\d*);$/ )
{
if( $2 eq "0" )
{
next;
}
print "direction=$1;duration=$2;timefrom=$3;numfrom=$4;numto=$5;trunk_in=$6;
trunk_out=$7;uniqueid=$8;cause=$9;\n";
}
else
{
print STDERR "Error: cannot parse line $_\n";
}
}
$ cat in
0;50;2012-01-01T00:00:00;84957950677;7450737;;;13;1;
1;3600;2012-01-01T00:00:00;7450737;112;A;B;666;2;
;3600;2012-01-01T00:00:00;7450737;112;A;B;666;2;
$ cat in | ./parser.pl
direction=0;duration=50;timefrom=2012-01-01T00:00:00;numfrom=84957950677;numto=7450737;
trunk_in=;trunk_out=;uniqueid=13;cause=1;
direction=1;duration=3600;timefrom=2012-01-01T00:00:00;numfrom=7450737;numto=112;
trunk_in=A;trunk_out=B;uniqueid=666;cause=2;
Error: cannot parse line ;3600;2012-01-01T00:00:00;7450737;112;A;B;666;2;
$
alcatel-2.conf:
pattern = [^[:digit:]]*([[:digit:]]+)[[:space:]]+([-\<\>]+)[[:space:]]+([^[:space:]]+)[[:space:]]+
pattern = ([0-9]+\/[0-9]+\/[0-9]+[[:space:]]+[0-9]+\:[0-9]+)[[:space:]]+
pattern = ([0-9]{2})\:([0-9]{2})\:([0-9]{2})[[:space:]]+([0-9]*)
datetime = 4
ani = 1
dnis = 8
dir = 2
duration = 7
dur_hour = 5
dur_min = 6
trunk_in = 3
trunk_out = 3
in = "<--"
out = "-->"
dateformat = %d/%m/%y %H:%M
Исходная запись:
A103 –> 0 03/11/03 08:44 00:01:10 9571135
Параметр | Позиция | Значение из примера |
---|---|---|
Начало звонка | 4 | 03.11.03 08:44:00 |
Длительность звонка | 6 | 00:01:10 |
Номер вызываемого абонента | 8 | 9571135 |
Номер вызывающего абонента | 1 | A103 |
Направление звонка | 2 | –> |
Регулярное выражение, заданное в файле конфигурации, разобьёт исходную строку на 8 подстрок.
Номера абонентов. В первой подстроке содержится номер абонента А, в восьмой — номер абонента Б.
Входящий или исходящий вызов. Плагин сравнивает вторую подстроку со строками <– (in) и –> (out). Если в исходной записи найдётся подходящее значение, плагин установит значение 0 (входящий вызов) или значение 1 (исходящий). По умолчанию все звонки считаются исходящими.
Начало звонка. В примере заданы параметры datetime и dateformat. Подстрока, содержащая дату и время (в примере — четвёртая) конвертируется в Unix time. При этом используется формат, заданный в строке dateformat. Если дата и время начала вызова находятся в разных частях исходной строки, их положение задаётся параметрами конфигурации date и _time. В некоторых форматах время начала вызова выводится в Unix time. Для таких форматов не нужно задавать в файле конфигурации параметр dateformat. Для форматов, у которых в дате начала вызова не указывается год, используется текущий год.
Длительность звонка. В примере звонок продолжался 0 часов (пятая подстрока), 1 минуту (шестая подстрока), 10 секунд (седьмая подстрока). Плагин переведет часы и минуты в секунды и подсчитает общую длительность в секундах.
Пример результата обработки CDR:
direction=1;duration=70;timefrom=1067838240;numfrom=103;numto=9571135;trunk_in=0;trunk_out=0;
Есть вопросы по документации? Пожалуйста, напишите их