Первой моей программой, написанной во время работы на S-12, был декодировщик биллинга C-DOP. Потом последовал декодировщик АМА-файла. При написании этих первых программ я имел на руках информацию о формате обрабатываемых файлов. Последующие программы писались без какой-либо вспомогательной информации, либо информации о формате файлов было крайне мало. При написании декодировщика исторического файла C-DOP, информация, содержащаяся в SI300, конечно, помогла, но зачастую она была не верна. Для каждого типа файлов писались отдельные программки, на С под DOS. Через некоторое время у меня возникла идея свести эти программы в одну, так и появилась H7. Вообще-то, она выросла из декодировщика Historical Files (отсюда и буква «H» в названии программы) путем постепенного его расширения. Программа работает только с текстовыми файлами, причем, в результирующих файлах используется кодировка CP866, что существенно упрощает процесс декодировки.
В этом случае есть одна фишка программы возможность вывода мнемоники транкгруппы. Для этого нужно воспользоваться макросом TKG_MNEM, который идет вместе с программой. Макрос запускается без параметров. В результате своей работы он выведет десятичные номера и мнемоники транкгрупп. С помощью любого текстового редактора нужно взять эти строки из логфайла терминальной программы и поместить их в файл tkg_mnem. (без расширения), который, в свою очередь, нужно поместить в каталог к H7.EXE. Впрочем, программа не откажется работать и без этого файла.
Результаты работы:Я думаю, содержимое файла с результатами комментировать не стоит, благо в начале имеется шапка, поясняющая содержимое столбцов, к тому же, описание 800-го файла имеется в ТУ на станцию.
Здесь ничего примечательного нет, декодировка производится в соответствии с ТУ. ММС комманды для работы ДОПовским биллингом общеизвестны особых секретов нет.
Результаты работы:№ столбца | Название столбца | Содержимое |
1 | Дата | Дата начала разговора |
2 | Время | Время начала разговора (запуска тарификации) |
3 | Ном.вызывающего | Номер абонента в поле А (выводится 16 знаков из 18) |
4 | Ном.плательщика | Номер плательщика (выводится 16 знаков из 24) |
5 | Ном.вызываемого | Номер абонента в поле Б (выводится 16 знаков из 24) |
6 | ччммсс | Реальная продолжительность разговора |
7 | ччммсс | Оплачиваемая продолжительность разговора (обрабатывается факт корректировки – бит 84) |
8 | Стоим. | Стоимость разговора (в у.е. – уругвайских ескудо) (обрабатывается факт корректировки – бит 91) |
9 | Номер ВРМ (b) | Номер, набранный в поле «Б малое» |
10 | Номер карты | Пишутся названия населенных пунктов |
11 | извр | Причина изменения времени. |
12 | ВОО | К оплате, у нас не используется |
13 | Приоритет вызова | |
14 | Тип счета | |
15 | Тип оплаты/вызова |
File Descriptor Table File (FDTF), файл таблицы описаний файлов. Это специальный файл, который содержит информацию о каждом возможном логическом файле. Эта информация организована в виде File Descriptor Block (FDB) – блока описания файла размером 60 байт. В версии R7.1 FDTF содержит описания (FDB) на 5000 файлов (в том числе и на себя самого), для R7.3 эта цифра равна 9999, а для R7.4 - 32765. Для работы с этим файлом служит FMM FILE DESCRIPTOR TABLE ADMINISTRATOR (FDTA) – администратор FDT, который предоставляет информацию о файлах другим FMM, например IOS File Manager и FDB Maintenance. Для работы с FDT (вернее c FDB) имеются соответствующие ММС команды: (CRN 0391) DISPLAY-FDB-DIR (CRN 0392) CREATE-FDB (CRN 0393) MODIFY-FDB (CRN 0394) REMOVE-FDB (CRN 0395) DISPLAY-FDB (CRN 7281) MODIFY-FDB-PFILNAME Счастливые обладатели комплекта учебной документации от Мосбелл могут обратиться к 770 00435 6120-VHBR «Том 5. Функциональное описание». Начиная со страницы 569 и далее, до наступления крепкого, глубокого сна. |
№ столбца/ параметра | Название столбца | Содержимое |
01 (04) | N | LFILID |
02 (05) | Logic FN | Logical file name |
03 (18) | Physical FileName | Physical file name |
04 (14) | FileType | File Type see (SI027) |
05 (15) | DataTy | Data Type |
06 (06) | LogRL | Logical record length |
07 (07) | MaxNR | Maximum number of records |
08 (20) | Ini.S | Initial size allocation (number) of records |
09 (08) | R | Authorization key for read |
10 (09) | W | Authorization key for write |
11 (10) | M | Authorization key for modify |
12 (19) | Dev.List | Device list |
13 (13) | RA | Recovery Atribut |
14 (22) | Ph.RL | Physical block length in bytes |
15 (21) | Category | Category |
16 (11) | Translat | Translation format |
В первом столбце в скобках приведены номера соответствующих параметров в RRN 336.
Что хочется сказать про обработку исторического файла? Крайне мало
информации для обработки в полном объеме. Даже если использовать листинги
FMM (хотя, порой, без них как без рук!). Дело в том, что много полей
заполняется "умолчальными" значениями при определенных условиях,
некоторые поля имеют одно и то же значение на протяжении всего периода
эксплуатации (например, номер SOTRACE,
Результаты работы:
Примечание: В системе предусмотрена возможность обнаружения мошеннических (по мнению разработчиков системы) действий оператора. Используемые для этого поля, далее по тексту будут выделены красным цветом. Но особо на них надеяться я бы не советовал, результат может дать только ведение тарификации как для обычных абонентов и сравнение ее с данными из исторического файла. Так же, при объяснении значений полей приведена позиция (биты, байты) исходных данных в записях.
#[717310]Accept=[18/11 07:06]Cancel=[18/11/02 07:06:27]Handling=[01:08] NA=H'36&28 ICC=1 Out Conv=A-Sub CircType=Auto CallCat=Orig. SubA[08,01] XX-XXXXXX OpA*[00,00] Op:25 AB Pos:12 HistCall Prio=4 Part=2 Mon:02[00:07] CancA |
#[717310] | Порядковый номер квитанции |
Accept= | Call Acceptance Time. Дата и время принятия вызова |
Cancel= | Cancel Time. Дата и время отмены квитанции |
Handling= | Call Handling Time. Общее время обработки квитанции |
NA=H' | Номер оборудования. Обрабатыватся байты 12-14, хотя предусмотрено на один байт больше. |
ICC= | Incoming Call Class, класс поступившего вызова (байт 147). |
Out/Inc | Incoming or outgoing circuit, (байт 46, биты 7 и 6). |
Conv= | Conversation With. Указывает, какое поле было использовано для установления соединения:
|
CircType= | Circuit Type. Тип соединительной линии, использовавшейся при соединении:
|
CallCat= | Call Category:
|
SubA[nn,mm]ХХХ-ХХХХХ | Номер абонента А: ХХХ-ХХХХХ цифры номера абонента А |
OpA[nn,mm]ХХХ-ХХХХХ | Номер оператора А: ХХХ-ХХХХХ цифры номера оператора А |
Op: | Идентификаторы операторов, работавших с квитанцией. Так же выводится следующая информация:
|
Pos: | Last Logical Position Number. Номер последнего рабочего места, на котором обрабатывалась квитанция. Обрабатывается только байт 174, хотя поле имеет размер два байта. |
TimRel | Timed Release Active. Отбой по таймеру (бит 0 байта 30). |
ChgAm | Charge Amended. Факт корректировки стоимости (бит 4 байта 41). |
HistRetr | Historical Retrieval. Квитанция была исторически запрошена (бит 3 байта 41). |
A-BEnt | Con AB Entered. Соединение АБ было введено? Смысл до конца не понятен, но используется значение бита 5 байта 42. |
3thConn | 3th Connected. Смысл, опят же, до конца не понятен, но используется значение бита 6 байта 42. |
WURRet | Wake Up Retrieved. Побудка (бит 1 байта 43). Прикол в том, что если верить имеющемуся у меня описанию, то значение имеют только первые два бита 43-го байта, но как показала практика, пятый бит тоже используется, для чего непонятно. |
HistCall/CancCall | Отпущена в систему квитанция или нет. Обрабатываются только эти два значения байта 124, т.к. другие значения на практике не встречались. |
Prio= | Call Priority. Приоритет вызова (байт 125). |
Part= | Number Of Parties. Кол-во сторон (байт 126). |
Mon: | Number Of Monitoring and Total Time. Мониторинг соединения: сколько раз (байт 158) и суммарное время (байты 160 и 161). |
CancA/ CancB/ CancS/ CancO | Originator Of Call Cancellation. Причина отбоя (абонент А/ абонент Б/ система/ оператор) |
БНО/ПР1/… | Аббревиатура причины отбоя (байты 198-201). |
Delay | Задержка квитанции. Байты 222-227. Обрабатывается только задержка по абсолютному времени, т.к. другие варианты операторами на практике не используются. По этой же причине не обрабатываются поля, связанные с отсрочкой квитанций. |
-B1 Rec- NA=H'20&14 Conv=B-Op CircType=Auto TaxCat=Nat [ НОМ ВНВ ВОО МСС ] SubB*[10,01] XXX-XXXXXXX OpB[00,01] [Conv start time][Conv end time ][Interm st. time][Real ][Charg] [00/00 00:00:00][00/00 00:00:00][00/00 00:00:00][00:00][00:00] -B2 Rec- Conv=B-Sub CircType=Undef TaxCat=Nat [ НОМ ВНВ МСС ] SubB[10,00] XXX-XXXXXXX OpB*[00,00] [Conv start time][Conv end time ][Interm st. time][Real ][Charg] [00/00 00:00:00][00/00 00:00:00][00/00 00:00:00][00:00][00:00] -B3 Rec- NA=H'30&12 Conv=B-Sub CircType=Auto TaxCat=Nat [ НОМ МСС ] SubB[10,01] XXX-XXXXXXX OpB[00,00] [Conv start time][Conv end time ][Interm st. time][Real ][Charg] [18/10 08:49:08][18/10 08:50:22][18/10 08:49:08][01:13][04:00] |
Примечание: Программой не обрабатываются поля, связанные с начислением оплаты все равно тарификация, как правило, не настроена. Так же, обрабатываются только первые три записи абонента Б, в то время как их предусмотренно больше двадцати.
Запись абонента Б (B-subscriber record), здесь:NA=H' | Номер оборудования. Обрабатыватся байты 12-14, хотя предусмотрено на один байт больше. |
Conv= | Conversation With. Указывает, какое поле было использовано для установления соединения:
|
CircType= | Circuit Type. Тип соединительной линии, использовавшейся при соединении:
|
TaxCat= | Taxation Category:
|
[ НОМ ВНВ МСС ] | Тип оплаты/вызова, (байты 200-205). |
SubB[nn,mm]ХХХ-ХХХХХ | Номер абонента Б: ХХХ-ХХХХХ цифры номера абонента Б |
OpB[nn,mm]ХХХ-ХХХХХ | Номер оператора Б: ХХХ-ХХХХХ цифры номера оператора Б |
[Conv start time] | Conversation start time. Дата и время начала разговора абонентов |
[Conv end time ] | Conversation end time. Дата и время окончания разговора абонентов |
[Interm st. time] | Intermediate conversation start time. Дата и время возобновления разговора абонентов. В случае если разговор абонентов был прерван оператором, а потом начат заново в это поле заносится время возобновления разговора. Если разговор не прерывался, то заносится время начала разговора. Обрабатываются байты |
[Real ] | Real conversation duration. Реальная продолжительность разговора |
[Charg] | Charged conversation duration. Время, выставленное системой к оплате |
-TextRec1- 1 *** СБОЙ ДОСТУПА *** |
Данный тип записи содержит 6 текстовых блоков. При обработке этой записи, программа каждый текстовый блок (если он не пуст) выводит в отдельной строке. В начале каждой такой строки указывается идентификатор текстового блока присвоенный системой.
-DataRec- XXXXXXXX Attempts= 1 BookTime[06:30] StartDate[21/10] Ringing[06:25:04:06] Answer[06:25:19:07] |
XXXXXXXX | Телефонный номер абонента на который заказана побудка (байты 142-151). |
Attempts= | Number of attempts. Число попыток установления автоматического соединения (байт 32). |
BookTime | Booking time for the wake-up. Время, на которое заказана побудка (чч:мм). Обрабатываются байты 160-161. |
StartDate | Start date for the wake-up. Дата, на которое заказана побудка (дд:мм). Обрабатываются байты 162-163. |
Ringing | Время, начала посылки вызова абоненту (чч:мм:сс:дес). Обрабатываются байты 40-43. |
Answer | Время, ответа абонента (чч:мм:сс:дес). Обрабатываются байты 44-47. |
-AmmendmentRec- OpID[05] PartyIdx[02] ChAm[240] |
OpID | Operator identity. Идентификатор оператора, вносившего изменения (байты 8-9). |
PartyIdx | Party index. Номер стороны для которой делается изменение (байт 16). |
ChAm | Сharge amendment duration. Истинное значение поля не понятно, но обрабатываются байты 10-11. |
-CommentRec1- 1316 БНО 1404 БНО 1545 БНО СНЯТ |
Данный тип записи содержит 3 строки примечаний, каждая длиной 78 символов. При обработке этой записи, программа выводит эти строки, если он не пусты.
Security File (SF) – файл надежности. Используется для фиксирования изменений вносимых в БД и для процедур отката (ROLL-BACK/ROLL-FORWARD). Для работы с SF служит SECURITY FILE HANDLER FMM. Записи об изменениях вносятся в SF в хронологическом порядке. Логическая структура SF приведена ниже на рисунке. |
Как видно, SF состоит из 7 разделов (каждый раздел физически является файлом с LFILID от 7 до 13). Раздел начинается с заголовка, который содержит управляющую информацию, и последовательности записей. Записи могут быть трех видов:
1 : Log in Security File Для работы с SF используются следующие ММС команды: (CRN 0481) DISPLAY-SECF (CRN 0415) SAVE-SEC-FILE |
/* Start Of Information extracted from Security File Header */ SF_STATUS=Previous Partition# 01 FILE_ID=0007 SIZE=32766 REC_CORRUPT=00 /* End Of Information extracted from Security File Header */ RCRD_TYPE=TRANS RCRD_ST=VALID_MEMORY Prev=006 Own=010 INT_TRANS_NO=42783 ORJ_ID[0000 1999-05-08] REC_TIME[21:00:17:01] FMM_ID=01690 PROC_ID=H'0830 H'EC44 LCE_ID=H'8D00 DML_COM_ID=002(MODIFY) DML_COM_OP=000 INF_SEC=H'F8F4 DLS_FILE_ID=2462 RID=01584 REL_PNB=00000 NO_OF_CH=001 RcrdNo=00060 RcrdOffs=01770 ChangeLgth=H'0080 MemSegm=H'0002 MemOffs=H'0298 Old Value 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F H'0298 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02A8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02B8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02D8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02E8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02F8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'0308 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'0318 New Value 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F H'0298 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02A8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02B8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02D8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02E8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'02F8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'0308 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 H'0318 |
И так, начнем по порядку с заголовка:
SF_STATUS= | статус SF: может быть Init/Actual/Previous (B_STATUS Z_M_SF_STATUS) |
Partition# | номер раздела (B_PART_NO M_PART_NO) |
FILE_ID= | логический идентификатор файла (B_FILE_ID M_IOS_LOG_FILE) |
SIZE= | размер в записях (1 запись=32 байт) (B_SIZE INT) |
REC_CORRUPT= | кол-во плохих записей (B_REC_CORRUPT BIN(8)) |
Скажу честно – это не весь заголовок, это только наиболее полезная его часть. Продолжим дальше:
RCRD_TYPE= | SECURITY FILE RECORD TYPE (B_RCRD_TYPE Z_M_RCRD_TYPE). Тип записи:
|
RCRD_ST= | SECURITY FILE RECORD STATUS (B_RCRD_ST Z_M_RCRD_ST). Статус записи:
|
Prev= | размер предыдущей записи (в блоках) (B_PREV_LGTH) |
Own= | собственный размер, опять же, в блоках (B_OWN_LGTH) |
INT_TRANS_NO= | номер транзакции (B_INT_TRANS_NO M_TRANS_NO) |
ORJ_ID | идентификатор ORJ Operator Requested Job (B_ORJ_ID M_ORJ_ID) |
REC_TIME | времячко… (B_REC_TIME Z_M_TIME) |
FMM_ID= | идентификатор FMM (B_FMM_ID M_FMM_ID) |
PROC_ID= | идентификатор процесса (B_PROC_ID M_PROCESS_ID) |
LCE_ID= | логический идентификатор контрольного элемента (B_LCE_ID M_LCE_ID) |
DML_COM_ID= | идентификатор комманды языка манипуляции данными (B_COM_ID M_DML_COM_TYPE) |
DML_COM_OP= | опция этой комманды (B_COM_OP M_DML_OPT_TYPE) |
INF_SEC= | (B_INF_SEC M_INF_SEC) |
DLS_FILE_ID= | (B_DLS_FILE_ID M_IOS_LOG_FILE) |
RID= | (B_RID M_RID) |
REL_PNB= | (B_REL_PNB M_REL_PNB) |
В принципе, все возможности программы описаны. Я думаю, стоит отметить, что при декодировании обрабатывались не все существующие поля, а только полезные на практике. По мере своих способностей, я попытался дать некоторые дополнительные сведения по ходу описания. Пока я писал это описание обнаружил несколько ошибок в программе :-). Сырцы не высылаются, но это не касается форматов файлов.
Взять программу.
Максим Осташов |