Примеры реализации конверторов логов

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
(ISKRATEL si2000)
(M200)
 
(52 промежуточные версии не показаны)
Строка 17: Строка 17:
Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:
Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:
 +
1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то  же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида  i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется.  
1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то  же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида  i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется.  
 +
2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip)  
2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip)  
 +
3. Вызывает data_loader.sh для добавления задачи на загрузку логов
3. Вызывает data_loader.sh для добавления задачи на загрузку логов
пути к локальным и ftp-папке указаны в начале скриптов.  
пути к локальным и ftp-папке указаны в начале скриптов.  
 +
 +
Конвертер:
[[Медиа:ATS.zip]]
[[Медиа:ATS.zip]]
 +
 +
Описание формата:
 +
[[Медиа:FUN559000PCR150.PDF.zip]]
 +
 +
 +
Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет:
 +
http://forum.bgbilling.ru/viewtopic.php?f=10&t=3962
 +
 +
 +
1) в конвертере найдена ошибка при считывании номера звонящего абонента.
 +
нужно заменить вот этот кусок в файле convert_log.pl
 +
<source lang ="perl" >
 +
                        my $lac = undef;
 +
                        my $spis_num = undef;
 +
 +
                        my $bytes_lac_len = get_bytes_len( $lac_len );
 +
                        my $bytes_spis_num_len = get_bytes_len( $spis_num_len );
 +
 +
                        if( $lac_len > 0 )
 +
                        {
 +
                                read( FILE_IN, $data, $bytes_lac_len );
 +
                                $lac = get_bcd( $data, $lac_len );
 +
                        }
 +
                        if( $spis_num_len > 0 )
 +
                        {
 +
                                read( FILE_IN, $data, $bytes_spis_num_len );
 +
                                $spis_num = get_bcd( $data, $spis_num_len );
 +
                        }
 +
 +
                        my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;
 +
 +
</source>
 +
 +
На вот этот
 +
<source lang ="perl" >
 +
my $lac = undef;
 +
            my $bytes_lac_len = get_bytes_len( $lac_len );
 +
 +
            my $first_digit;
 +
            if( $lac_len > 0 )
 +
            {
 +
                read( FILE_IN, $data, $bytes_lac_len );
 +
                $lac = get_bcd( $data, $lac_len );
 +
 +
                if ( $lac_len % 2 == 1 )
 +
                {
 +
                  my $idx = $lac_len / 2;
 +
                  my $part = substr( $data, $idx, 1 );
 +
                  my @f = unpack( 'C', $part);
 +
                  $first_digit = $f[0]&0b00001111;
 +
                }
 +
            }
 +
 +
            my $spis_num = '';
 +
 +
            my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );
 +
 +
            if( $spis_num_len > 0 )
 +
            {
 +
                if ( $first_digit )
 +
                {
 +
                  $spis_num_len--;
 +
                  $spis_num .= $first_digit;
 +
                }
 +
 +
                my $bytes_spis_num_len = get_bytes_len( $spis_num_len );
 +
 +
                read( FILE_IN, $data, $bytes_spis_num_len );
 +
                $spis_num .= get_bcd( $data, $spis_num_len );
 +
            }
 +
 +
            my $var_len = $record_len - 16 - $bytes_summa;
 +
 +
</source >
 +
 +
Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто
 +
выбрасывалась, как  остаток BCD-поля, что неверно.
 +
 +
2) В конвертере можно считывать порты с помощью замены вот этих строк
 +
 +
 +
<source lang="perl">
 +
# vhod tract
 +
        elsif( $f[0] == 113 )
 +
        {
 +
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
 +
            my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 +
 +
            print "113=>$id\n";
 +
 +
            $result{113} = $id;
 +
            $pos += 9;
 +
        }
 +
        # ishod tract
 +
        elsif( $f[0] == 114 )
 +
        {
 +
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
 +
            my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 +
 +
            print "114=>$id\n";
 +
 +
            $result{114} = $id;
 +
            $pos += 9;
 +
        }
 +
 +
</source>
 +
на эти
 +
<source lang="perl">
 +
# vhod tract
 +
        elsif( $f[0] == 113 )
 +
        {
 +
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
 +
            #my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 +
 +
            #kanal(port)
 +
                my $id = "$id[0]";
 +
 +
            print "113=>$id\n";
 +
 +
            $result{113} = $id;
 +
            $pos += 9;
 +
        }
 +
        # ishod tract
 +
        elsif( $f[0] == 114 )
 +
        {
 +
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
 +
            #my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 +
       
 +
            #kanal(port)
 +
                        my $id = "$id[0]";
 +
 +
 +
            print "114=>$id\n";
 +
 +
            $result{114} = $id;
 +
            $pos += 9;
 +
        }
 +
 +
</source>
 +
 +
== ISKRATEL si3000 ==
 +
Есть только описание формата:
 +
[[Медиа:SI3000CDR.PDF.zip]]
 +
== Ericsson MD-110 ==
== Ericsson MD-110 ==
Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.
Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.
-
Это архив папки home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100.  
+
Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100.  
 +
 
Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log.  
Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log.  
-
файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :
+
Файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :
 +
 
1.  Вызывает скрипт md110/hour_log, который  берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log .  
1.  Вызывает скрипт md110/hour_log, который  берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log .  
-
2. Вызывает md110/hour_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip)  
+
 
-
3. Вызывает data_loader.sh для добавления задачи на загрузку лога
+
2. Вызывает md110/convert_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip)  
 +
 
 +
3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога
пути указаны в начале скриптов.  
пути указаны в начале скриптов.  
 +
Конвертер
[[Медиа:ATS.zip]]
[[Медиа:ATS.zip]]
 +
 +
Примерный формат логов :
 +
<source lang="bash">
 +
MMDD HHMM duration number_from number_to port_to
 +
</source>
 +
 +
 +
update: Для избежания зависания com-порта на порте должен был выдаваться сигнал о готовности принимать данные. Поэтому надо изменить файлик start_read_com.sh :
 +
stty -F /dev/ttyS0 ispeed 19200 cs7 clocal crtscts
 +
 +
== mx96 ==
 +
 +
В данном разделе речь идёт о неком устройстве '''mx96''' (Actionet_MX). Представленный конвертер знает о следующей ситуации. Имеется доступ по ftp к расшаренным исходным логам. Имена логов имеют вид '''ггммддNN.C35''', где, как несложно догадаться, "гг", "мм" и "дд" - это день, месяц и год, а NN - номер файла в шестнадцатиричном виде, причём младший байт расположен слева. Номера файлов придуманы неспроста - при перегрузке считающего оборудования и прочих ситуация начинается вестись новый лог, с той же датой, но следующим номером.
 +
С наименованием разобрались, переходим к формату. Конвертер нацелен на работу со следующим форматом данных файла вызова:
 +
 +
Первые 320 байт файла - заголовок, каждые следующие 123 байта (включая перевод строки и каретки) - отдельная запись вызова.
 +
 +
Описание записи файла вызовов "C" тип 1 (Документация CLD DAXL 0159r стр.117):
 +
<pre>
 +
Поле Длина Формат Описание
 +
record number 6 nnnnnn 6-значный десятичный порядковый номер
 +
a_mx_nbr 2 nn Номер станции MX абонента А
 +
b_mx_nbr 2 nn Номер станции MX абонента Б
 +
date 8 yyyymmdd Дата начала вызова
 +
time 6 hhmmss Время начала вызова
 +
a_subnbr 10 nn..n Полный номер абонента А (выровненный по левому разряду с пробелами в конце)
 +
b_subnbr 20 nn..n Полный номер абонента Б (выровненный по левому разряду с пробелами в конце)
 +
a_int_type 2 nn Тип интерфейса абонента А: 00...08 определены, 09...99 зарезервированы
 +
b_int_type 2 nn Тип интерфейса абонента Б: 00...08 определены, 09...99 зарезервированы
 +
call_type 3 nnn Тип вызова: десятичное число от 00 до 34
 +
site_a 3 nnn Номер базовой станции абонента А
 +
channel_a 5 nnnnn Номер канала абонента А
 +
site_b 3 nnn Номер базовой станции абонента Б
 +
channel_b 5 nnnnn Номер канала абонента Б
 +
b_subs_q_time 5 nnnnn Время ожидания в очереди к абоненту Б (секунд)
 +
tc_wait_time 5 nnnnn Время ожидания канала связи (секунд)
 +
b_subs_answ_time 5 nnnnn Длительность подачи вызывного сигнала абоненту Б (секунд)
 +
call_duration 5 nnnnn Продолжительность вызова (секунд)
 +
release_mode 3 nnn Режим отбоя вызова (секунд)
 +
spec_func 3 nnn Специальные функции: от 0 до 5
 +
ch_pul_mode 3 nnn Режим тарифных импульсов
 +
ch_pulses 5 nnnnn Тарифные импульсы
 +
call_id 10 nn.n Идентификатор вызова (целое число)
 +
cr_lf 2 0D0A
 +
</pre>
 +
Рассмотрим конкретный пример лога (первой строкой для наглядности дана маска по данным):
 +
<pre>
 +
NNNNNNAABBDDDDDDDDTTTTTTAAAAAAAAAABBBBBBBBBBBBBBBBBBBBAABBTTTSSSCCCCCSSSCCCCCTTTTTWWWWWTTTTTDDDDDRRRFFFPPPCCCCCIIIIIIIIII
 +
1    35352008070900001570749    0063929              0 5  4  3  96255  71    0    0    9    9  0  0  0    0 889738557
 +
2    35352008070823300870341    70355                0 0  4  0  92  0  19965535    0  18 1805 10  0  0    0 896423075
 +
11    353520080708235902?255/8101?70336                5 0  4255  73  3  12265535    0    6  369  1  0  2    0 889673020
 +
133  35352008070901172670431    0067481              0 5  4  3  122255  58    0    0  12  43  0  0  0    0 891835870
 +
</pre>
 +
Имейте ввиду, что форматы разных версий устройства могут различаться (или, возможно, при этом они поддаются какой-либо настройке), так что необходимо править соответствующим образом главное регулярное выражение, производящее разбор.
 +
 +
Теперь рассмотрим скрипты, составляющие конвертер. Первый из них, '''mx96_get_logs.pl''', основной. Он и выполняет самую рутинную работу - отслеживает не появилось ли на ftp несколько новых файлов, скачивает их в соответствующие локальные директории, разбитые по датам (<рабочий каталог>/source/<год>/<месяц>/<день>) и запускает конвертер форматов, '''convert_log.pl'''. Имейте ввиду - "сегодняшние" логи игнорируются, потому, что данные могут оказаться неполными не только за день, но и за час, что не вполне подходит к нашему случаю.
 +
 +
Про второй скрипт, '''convert_log.pl''', надо сказать отдельно. Он принимает один параметр - путь к файлам логов. Так как у нас по пути находятся несколько почасовых файлов (от нуля до 1, 2 и более для каждого часа), то становится ясно - конвертируются логи за сутки. Скрипт сам понимает, какой именно лог и по какой дате составлять, исходные пути подсказывают ему это.
 +
 +
Стоит обратить внимание на то, что все логи, уже скачанные, игнорируются. То есть для переобсчёта надо удалить соответствующие скачанные логи из папки source и перезапустить конвертер (или потерпеть до автоматического перезапуска) - все новые логи будут скачены, разложены по папкам и должным образом обработаны.
 +
 +
Запуск скрипта производится как обычно:<pre>
 +
nohup mx96_get_logs.pl >> convert.out 2>&1 &
 +
</pre>
 +
Для автоматизации настраивается crontab (в скрипте convert_mx96.sh содержится похожая на приведённую выше строка запуска)
 +
 +
Файл crontab:<pre>
 +
SHELL=/bin/sh
 +
# convert
 +
10 0 * * * /home/ATS/convert_mx96.sh
 +
</pre>
 +
[[Медиа:mx96scripts.zip]]
 +
 +
--[[Участник:DimOn|dimOn]]
 +
 +
== HuaweiV300R006 ==
 +
[[Медиа:huaweiV300R006.zip]]
 +
 +
Описание формата, пример лога:
 +
[[Медиа:hw300R006_Data.zip]]
 +
 +
== M200 ==
 +
1) Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&t=3675 Автоматизация загрузки логов из ATC М-200 в BGB]<br>
 +
2) Perl скрипт, загружающий логи с ftp АТС и перерабатывающий их в формат биллинга, и архивирующий для обработки биллинга. После обработки скрипт отправляет команду на загрузку логов.
 +
[[Файл:Croncdr.zip]]
 +
 +
== Элком ==
 +
Скрипт обрабатывает первичные логи вида:
 +
<pre>
 +
TML1    | TML2    | Дата                | Длит.  |Тип| Вызывающий | Вызываемый          |
 +
003 : 051| 044 : 001| 13.11.2010 23:59:22  | 5      | 2 | 9875906090 | 2462526              |
 +
071 : 062| 005 : 019| 13.11.2010 23:53:23  | 385    | 2 | 3472460202 | 89876087603          |
 +
004 : 031| 044 : 001| 13.11.2010 23:59:31  | 23    | 2 | 2906090    | 2462526              |
 +
001 : 023| 044 : 008| 13.11.2010 23:59:00  | 58    | 2 | 2906090    | 2462526              |
 +
074 : 002| 078 : 060| 13.11.2010 23:58:33  | 92    | 2 | 4483      | 5558                |
 +
004 : 018| 044 : 004| 13.11.2010 23:59:43  | 22    | 2 | 2906090    | 2462526              |
 +
074 : 005| 064 : 008| 13.11.2010 23:59:50  | 17    | 2 | 3472900444 | 2636474              |
 +
003 : 041| 044 : 006| 13.11.2010 23:59:49  | 17    | 2 | 2906090    | 2462526              |
 +
077 : 025| 017 : 007| 13.11.2010 23:34:29  | 1538  | 2 | 3472460000 | 89174914375          |
 +
074 : 006| 018 : 061| 13.11.2010 23:59:48  | 18    | 2 | 3472900444 | 89875971613          |
 +
</pre>
 +
 +
[[Медиа:Script_elcom_convert.zip]]
 +
 +
== АТС Linea-UT фирмы Italtel ==
 +
Выгрузка данных о звонках со станции  и конвертация.Более подробное описание станции приводится в файле ПО для АТС UT. Описание для установке настройке находится в файле manual.txt.
 +
[[Медиа:colit_v1.0.zip]]
 +
 +
== Коллектор NGN ==
 +
Эта АТС современная и файлы выкладывает в бинарном формате на ftp.
 +
Скрипт умеет копировать новые файлы по мере их появления, преобразовывает в текст. Имеется настройка правил преобразования.
 +
Для предотвращения двойного запуска использовать flock.
 +
Описание формата в файле CDR format_Rus.doc.
 +
Конвертор для windows BillEn.exe.
 +
Использование виндовой конвертором так:
 +
Сначала выбирать тип ZXSS10 SS1 V2.0.0.5 SUN и только потом файл через Open file.
 +
Описание для установке настройке находится в файле manual.txt.
 +
[[Медиа:ngn.zip]]
 +
 +
== HUAWEI - NGN SoftX Bill iGWB ==
 +
Эта АТС современная и файлы выкладывает в бинарном формате на ftp.
 +
Скрипт умеет копировать новые файлы по мере их появления с ftp. Преобразовываются в формат биллинга в соответствии с документацией. Имеется настройка правил преобразования.
 +
Для предотвращения двойного запуска использовать flock.
 +
Возможна полная автоматизация выгрузки с ftp, конвертации и загрузки в биллинг логов.
 +
Описание формата пример логов лежит в архиве.
 +
 +
[[Медиа:HUAWEI_-_NGN_SoftX_Bill_iGWB_CDR_Format.zip‎]]
 +
 +
 +
== АТС MC240 и Цифровой шлюз SMG-1016M производства Элтекс ==
 +
[[Сопряжение BG-биллинга и Городской цифровой АТС MC240 и Цифрового шлюза SMG-1016M производства Элтекс]]
 +
 +
== Почти универсальный конвертер логов для модуля phone ==
 +
Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&t=5213 Почти универсальный конвертер логов для модуля phone]
 +
 +
== MC240 ==
 +
Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.
 +
 +
[[Медиа:ms240-dimon.zip]]
 +
 +
convert.pl - запуск по всем логам, необработанным. convert_log.pl - обработка одного лога. common.pm - настройки, также там много комментариев.
 +
 +
convert_log.pl: скрипт получает полный путь к исходному логу, конвертирует, раскладывает готовые логи по пути $DEST_PATH, внутри разбивая по источникам и далее по году-месяцу структурой как того требует bgbilling
 +
 +
Формат имени лога ожидается такой: logYYYYMMDD.csv
 +
Дата на логе реально вчерашняя, т.е. ротация делается в 00:xx и в логе имя вчерашнее.
 +
В конце отправляется 24 команды на загрузку часовых логов.
 +
 +
Ошибки конвертации номеров кладутся в файл bglogconverter.num.error.log
 +
 +
Ошибки распознавания логов в файл bglogconverter.run.error.log
 +
 +
 +
--[[Участник:DimOn|dimOn]] 10:49, 26 октября 2015 (UTC)

Текущая версия на 12:10, 26 марта 2016

Содержание

Siemens EWSD

Конвертер на perl из бинарного формата Siemens EWSD v12 в формат биллинга.

ama.pl осуществляет конвертацию дневного лога в часовые. schedule.pl запускается cron-ом и проверяет директорию, указанную в файле conf на наличие логов и запускает ama.pl с указанием имени файла; файл после конвертирования переносится в папку ./done

ama.pl после конвертирования выполняет data_loader.sh для добавления задачи на загрузку лога. Формат названия файла: AMA.yyMMdd.ama.

Медиа:Phone_ama.zip

ISKRATEL si2000

Конвертер на perl из бинарного формата si2000 в формат биллинга.

Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96).

Данный конвертер располагается в подпапке si2000.

Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:

1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется.

2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip)

3. Вызывает data_loader.sh для добавления задачи на загрузку логов

пути к локальным и ftp-папке указаны в начале скриптов.

Конвертер:

Медиа:ATS.zip

Описание формата: Медиа:FUN559000PCR150.PDF.zip


Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет: http://forum.bgbilling.ru/viewtopic.php?f=10&t=3962


1) в конвертере найдена ошибка при считывании номера звонящего абонента. нужно заменить вот этот кусок в файле convert_log.pl

my $lac = undef;
                        my $spis_num = undef;
 
                        my $bytes_lac_len = get_bytes_len( $lac_len );
                        my $bytes_spis_num_len = get_bytes_len( $spis_num_len );
 
                        if( $lac_len > 0 )
                        {
                                read( FILE_IN, $data, $bytes_lac_len );
                                $lac = get_bcd( $data, $lac_len );
                        }
                        if( $spis_num_len > 0 )
                        {
                                read( FILE_IN, $data, $bytes_spis_num_len );
                                $spis_num = get_bcd( $data, $spis_num_len );
                        }
 
                        my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;

На вот этот

my $lac = undef;
            my $bytes_lac_len = get_bytes_len( $lac_len );
 
            my $first_digit;
            if( $lac_len > 0 )
            {
                read( FILE_IN, $data, $bytes_lac_len );
                $lac = get_bcd( $data, $lac_len );
 
                if ( $lac_len % 2 == 1 )
                {
                  my $idx = $lac_len / 2;
                  my $part = substr( $data, $idx, 1 );
                  my @f = unpack( 'C', $part);
                  $first_digit = $f[0]&0b00001111;
                }
            }
 
            my $spis_num = '';
 
            my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );
 
            if( $spis_num_len > 0 )
            {
                if ( $first_digit )
                {
                  $spis_num_len--;
                  $spis_num .= $first_digit;
                }
 
                my $bytes_spis_num_len = get_bytes_len( $spis_num_len );
 
                read( FILE_IN, $data, $bytes_spis_num_len );
                $spis_num .= get_bcd( $data, $spis_num_len );
            }
 
            my $var_len = $record_len - 16 - $bytes_summa;

Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто выбрасывалась, как остаток BCD-поля, что неверно.

2) В конвертере можно считывать порты с помощью замены вот этих строк


# vhod tract
        elsif( $f[0] == 113 )
        {
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
            my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 
            print "113=>$id\n";
 
            $result{113} = $id;
            $pos += 9;
        }
        # ishod tract
        elsif( $f[0] == 114 )
        {
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
            my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 
            print "114=>$id\n";
 
            $result{114} = $id;
            $pos += 9;
        }

на эти

# vhod tract
        elsif( $f[0] == 113 )
        {
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
            #my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 
            #kanal(port)
                my $id = "$id[0]";
 
            print "113=>$id\n";
 
            $result{113} = $id;
            $pos += 9;
        }
        # ishod tract
        elsif( $f[0] == 114 )
        {
            my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );
            #my $id = "$id[0]:$id[1]:$id[2]:$id[3]:$id[4]";
 
            #kanal(port)
                        my $id = "$id[0]";
 
 
            print "114=>$id\n";
 
            $result{114} = $id;
            $pos += 9;
        }

ISKRATEL si3000

Есть только описание формата: Медиа:SI3000CDR.PDF.zip


Ericsson MD-110

Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.

Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100.

Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log.

Файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :

1. Вызывает скрипт md110/hour_log, который берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log .

2. Вызывает md110/convert_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip)

3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога

пути указаны в начале скриптов.

Конвертер Медиа:ATS.zip

Примерный формат логов :

MMDD HHMM duration number_from number_to port_to


update: Для избежания зависания com-порта на порте должен был выдаваться сигнал о готовности принимать данные. Поэтому надо изменить файлик start_read_com.sh : stty -F /dev/ttyS0 ispeed 19200 cs7 clocal crtscts

mx96

В данном разделе речь идёт о неком устройстве mx96 (Actionet_MX). Представленный конвертер знает о следующей ситуации. Имеется доступ по ftp к расшаренным исходным логам. Имена логов имеют вид ггммддNN.C35, где, как несложно догадаться, "гг", "мм" и "дд" - это день, месяц и год, а NN - номер файла в шестнадцатиричном виде, причём младший байт расположен слева. Номера файлов придуманы неспроста - при перегрузке считающего оборудования и прочих ситуация начинается вестись новый лог, с той же датой, но следующим номером. С наименованием разобрались, переходим к формату. Конвертер нацелен на работу со следующим форматом данных файла вызова:

Первые 320 байт файла - заголовок, каждые следующие 123 байта (включая перевод строки и каретки) - отдельная запись вызова.

Описание записи файла вызовов "C" тип 1 (Документация CLD DAXL 0159r стр.117):

		
		Поле	Длина	Формат	Описание
		record number	6	nnnnnn	6-значный десятичный порядковый номер
		a_mx_nbr	2	nn	Номер станции MX абонента А
		b_mx_nbr	2	nn	Номер станции MX абонента Б
		date	8	yyyymmdd	Дата начала вызова
		time	6	hhmmss	Время начала вызова
		a_subnbr	10	nn..n	Полный номер абонента А (выровненный по левому разряду с пробелами в конце)
		b_subnbr	20	nn..n	Полный номер абонента Б (выровненный по левому разряду с пробелами в конце)
		a_int_type	2	nn	Тип интерфейса абонента А: 00...08 определены, 09...99 зарезервированы
		b_int_type	2	nn	Тип интерфейса абонента Б: 00...08 определены, 09...99 зарезервированы
		call_type	3	nnn	Тип вызова: десятичное число от 00 до 34
		site_a	3	nnn	Номер базовой станции абонента А
		channel_a	5	nnnnn	Номер канала абонента А
		site_b	3	nnn	Номер базовой станции абонента Б
		channel_b	5	nnnnn	Номер канала абонента Б
		b_subs_q_time	5	nnnnn	Время ожидания в очереди к абоненту Б (секунд)
		tc_wait_time	5	nnnnn	Время ожидания канала связи (секунд)
		b_subs_answ_time	5	nnnnn	Длительность подачи вызывного сигнала абоненту Б (секунд)
		call_duration	5	nnnnn	Продолжительность вызова (секунд)
		release_mode	3	nnn	Режим отбоя вызова (секунд)
		spec_func	3	nnn	Специальные функции: от 0 до 5
		ch_pul_mode	3	nnn	Режим тарифных импульсов
		ch_pulses	5	nnnnn	Тарифные импульсы
		call_id	10	nn.n	Идентификатор вызова (целое число)
		cr_lf	2		0D0A

Рассмотрим конкретный пример лога (первой строкой для наглядности дана маска по данным):

NNNNNNAABBDDDDDDDDTTTTTTAAAAAAAAAABBBBBBBBBBBBBBBBBBBBAABBTTTSSSCCCCCSSSCCCCCTTTTTWWWWWTTTTTDDDDDRRRFFFPPPCCCCCIIIIIIIIII
1     35352008070900001570749     0063929              0 5  4  3   96255   71    0    0    9    9  0  0  0    0 889738557
2     35352008070823300870341     70355                0 0  4  0   92  0  19965535    0   18 1805 10  0  0    0 896423075
11    353520080708235902?255/8101?70336                5 0  4255   73  3  12265535    0    6  369  1  0  2    0 889673020
133   35352008070901172670431     0067481              0 5  4  3  122255   58    0    0   12   43  0  0  0    0 891835870

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

Теперь рассмотрим скрипты, составляющие конвертер. Первый из них, mx96_get_logs.pl, основной. Он и выполняет самую рутинную работу - отслеживает не появилось ли на ftp несколько новых файлов, скачивает их в соответствующие локальные директории, разбитые по датам (<рабочий каталог>/source/<год>/<месяц>/<день>) и запускает конвертер форматов, convert_log.pl. Имейте ввиду - "сегодняшние" логи игнорируются, потому, что данные могут оказаться неполными не только за день, но и за час, что не вполне подходит к нашему случаю.

Про второй скрипт, convert_log.pl, надо сказать отдельно. Он принимает один параметр - путь к файлам логов. Так как у нас по пути находятся несколько почасовых файлов (от нуля до 1, 2 и более для каждого часа), то становится ясно - конвертируются логи за сутки. Скрипт сам понимает, какой именно лог и по какой дате составлять, исходные пути подсказывают ему это.

Стоит обратить внимание на то, что все логи, уже скачанные, игнорируются. То есть для переобсчёта надо удалить соответствующие скачанные логи из папки source и перезапустить конвертер (или потерпеть до автоматического перезапуска) - все новые логи будут скачены, разложены по папкам и должным образом обработаны.

Запуск скрипта производится как обычно:
nohup mx96_get_logs.pl >> convert.out 2>&1 &

Для автоматизации настраивается crontab (в скрипте convert_mx96.sh содержится похожая на приведённую выше строка запуска)

Файл crontab:
SHELL=/bin/sh
# convert
10 0 * * * /home/ATS/convert_mx96.sh

Медиа:mx96scripts.zip

--dimOn

HuaweiV300R006

Медиа:huaweiV300R006.zip

Описание формата, пример лога: Медиа:hw300R006_Data.zip

M200

1) Тема на форуме: Автоматизация загрузки логов из ATC М-200 в BGB
2) Perl скрипт, загружающий логи с ftp АТС и перерабатывающий их в формат биллинга, и архивирующий для обработки биллинга. После обработки скрипт отправляет команду на загрузку логов. Файл:Croncdr.zip

Элком

Скрипт обрабатывает первичные логи вида:

 TML1     | TML2     | Дата                 | Длит.  |Тип| Вызывающий | Вызываемый           |
 003 : 051| 044 : 001| 13.11.2010 23:59:22  | 5      | 2 | 9875906090 | 2462526              |
 071 : 062| 005 : 019| 13.11.2010 23:53:23  | 385    | 2 | 3472460202 | 89876087603          |
 004 : 031| 044 : 001| 13.11.2010 23:59:31  | 23     | 2 | 2906090    | 2462526              |
 001 : 023| 044 : 008| 13.11.2010 23:59:00  | 58     | 2 | 2906090    | 2462526              |
 074 : 002| 078 : 060| 13.11.2010 23:58:33  | 92     | 2 | 4483       | 5558                 |
 004 : 018| 044 : 004| 13.11.2010 23:59:43  | 22     | 2 | 2906090    | 2462526              |
 074 : 005| 064 : 008| 13.11.2010 23:59:50  | 17     | 2 | 3472900444 | 2636474              |
 003 : 041| 044 : 006| 13.11.2010 23:59:49  | 17     | 2 | 2906090    | 2462526              |
 077 : 025| 017 : 007| 13.11.2010 23:34:29  | 1538   | 2 | 3472460000 | 89174914375          |
 074 : 006| 018 : 061| 13.11.2010 23:59:48  | 18     | 2 | 3472900444 | 89875971613          |

Медиа:Script_elcom_convert.zip

АТС Linea-UT фирмы Italtel

Выгрузка данных о звонках со станции и конвертация.Более подробное описание станции приводится в файле ПО для АТС UT. Описание для установке настройке находится в файле manual.txt. Медиа:colit_v1.0.zip

Коллектор NGN

Эта АТС современная и файлы выкладывает в бинарном формате на ftp. Скрипт умеет копировать новые файлы по мере их появления, преобразовывает в текст. Имеется настройка правил преобразования. Для предотвращения двойного запуска использовать flock. Описание формата в файле CDR format_Rus.doc. Конвертор для windows BillEn.exe. Использование виндовой конвертором так: Сначала выбирать тип ZXSS10 SS1 V2.0.0.5 SUN и только потом файл через Open file. Описание для установке настройке находится в файле manual.txt. Медиа:ngn.zip

HUAWEI - NGN SoftX Bill iGWB

Эта АТС современная и файлы выкладывает в бинарном формате на ftp. Скрипт умеет копировать новые файлы по мере их появления с ftp. Преобразовываются в формат биллинга в соответствии с документацией. Имеется настройка правил преобразования. Для предотвращения двойного запуска использовать flock. Возможна полная автоматизация выгрузки с ftp, конвертации и загрузки в биллинг логов. Описание формата пример логов лежит в архиве.

Медиа:HUAWEI_-_NGN_SoftX_Bill_iGWB_CDR_Format.zip‎


АТС MC240 и Цифровой шлюз SMG-1016M производства Элтекс

Сопряжение BG-биллинга и Городской цифровой АТС MC240 и Цифрового шлюза SMG-1016M производства Элтекс

Почти универсальный конвертер логов для модуля phone

Тема на форуме: Почти универсальный конвертер логов для модуля phone

MC240

Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.

Медиа:ms240-dimon.zip

convert.pl - запуск по всем логам, необработанным. convert_log.pl - обработка одного лога. common.pm - настройки, также там много комментариев.

convert_log.pl: скрипт получает полный путь к исходному логу, конвертирует, раскладывает готовые логи по пути $DEST_PATH, внутри разбивая по источникам и далее по году-месяцу структурой как того требует bgbilling

Формат имени лога ожидается такой: logYYYYMMDD.csv Дата на логе реально вчерашняя, т.е. ротация делается в 00:xx и в логе имя вчерашнее. В конце отправляется 24 команды на загрузку часовых логов.

Ошибки конвертации номеров кладутся в файл bglogconverter.num.error.log

Ошибки распознавания логов в файл bglogconverter.run.error.log


--dimOn 10:49, 26 октября 2015 (UTC)

Личные инструменты