Допустим, что тебе нужно обратиться к электросчётчику, который умеет разговаривать на DLMS\COSEM. Чтобы понять основы смотри, например, синюю книгу. (можешь скачать её на рутрекере)
И спросил ты у счётчика, например, таблицу специальных дней (интерфейсный класс 11). И ответил тебе счётчик. В синей книге описан формат ответа:
array spec_day_entry
spec_day_entry ::= structure
{
index: long-unsigned,
specialday_date: octet-string,
day_id: unsigned
}
Where:
- specialday_date formatting follows the rules set in 4.1.6.1 for date;
- the range of the day_id shall match the length of the bit-string exec_specdays in the related object of IC “Schedule”.
Что это значит?
array spec_day_entry
Ответ содержит array, внутри которого структуры spec_day_entry, формат структуры
spec_day_entry ::= structure
{
index: long-unsigned,
specialday_date: octet-string,
day_id: unsigned
}
рамерность и прочее описание этих типов данных смотрите в той же синей книге.
Но это не всё. Смотрим на ответ счётчика:
01 0B 02 03 12 00 01 09 05 07 E2 01 01 FF 11 02 02 03 12 00
02 09 05 07 E2 01 02 FF 11 02 02 03 12 00 03 09 05 07 E2 01
03 FF 11 02 02 03 12 00 04 09 05 07 E2 01 14 FF 11 01 02 03
12 00 05 09 05 07 E2 02 0A FF 11 01 02 03 12 00 06 09 05 07
E2 02 17 FF 11 02 02 03 12 00 07 09 05 07 E2 03 08 FF 11 02
02 03 12 00 08 09 05 07 E2 03 09 FF 11 02 02 03 12 00 09 09
05 07 E2 05 01 FF 11 02 02 03 12 00 0A 09 05 07 E2 05 02 FF
11 02 02 03 12 00 0B 09 05 07 E2 05 09 FF 11 02
Для того чтобы объяснить на примере, разобью байты
01 0B
02 03
12 00 01
09 05 07 E2 01 01 FF
11 02
02 03
12 00 02
09 05 07 E2 01 02 FF
11 02
02 03
12 00 03
09 05 07 E2 01 03 FF
11 02
02 03
12 00 04
09 05 07 E2 01 14 FF
11 01
Объясняю:
//1 байт - тип данных (01 - это array)
//2 байт в случае массива - это длина массива (0B - 11 элементов)
01 0B
//далее идут элементы массива
//02 - тип данных (структура)
//03 - кол-во элементов струкруты (в нашем случае - три элемента (index, date, day_id)
02 03
//далее идут элементы структуры
//12 - тип данных (unsigned long - так называется двухбайтное целое без знака)
//00 01 - значение
12 00 01
//09 - тип данных (octet byte string - набор байтов (такой тип данных для даты))
//05 - длина octet byte string (5 байт)
//07 E2 01 01 FF - сама байтовая строка. Нам нужно её интерпертировать как Date (формат описан в синей книге)
09 05 07 E2 01 01 FF
//11 - тип данных unsigned (целое 8 бит без знака)
//02 - значение
11 02
//и так далее...
02 03
12 00 02
09 05 07 E2 01 02 FF
11 02
02 03
12 00 03
09 05 07 E2 01 03 FF
11 02
02 03
12 00 04
09 05 07 E2 01 14 FF
11 01