Skip to main content

0x02 Counter1 - Суточный архив

Пакет содержит показания счётчика за сутки с шагом 1 час.

Timestamp Initial value FLAGS DIFF DATA
4B 4B 2B bit array
ПолеРазмер, байтЗначение
Timestamp4uint32_t (значение + 946684800 = UNIX-время)
Init value4Значение в начале интервала
FLAGS2См. ниже
DIFF DATAпеременныйДифференциальные данные

FLAGS​

БитФлагОписание
0 … 4NБиты дифференциальных данных ([0 … 31] + 1)
5DIV10/ 10 DIFF
6RLEBIT RLE КОМПРЕССИЯ
7SIGNEDDIFF ЗНАКОВЫЙ
8 … 13REC_NUMКоличество записей (до 64)
14RESOLИндивидуальный бит
15ALL_DIFF_ZEROСчетчик не изменился, все DIFF=0. В этом случае блок DIFF_DATA отсутствует

RESOL=1​

В поле Differential data данные переменной длины как битовая карта с использованием кодирования длин серий (RLE). В этом случае — нули. В пакете может быть до четырех блоков данных. Индивидуально определяемый блок (если бит RESOL установлен во флагах) используется для изменения настроек устройства:

Один блок
Бит ОбозначениеОписаниеDIFF BLOCKDIFF BLOCK...
0Флаг переменной длиныесли 0: как в предыдущем блоке (если это первый блок, то N)
если 1: задается в следующих 5 битах
1…5Количество бит на дифференциальные данныеПрисутствует, если бит 0 = 1
...следует либо блок повторяющихся нулей, либо блок разности (см. ниже)

RLE=1​

Блок повторяющихся нулей (установлен бит RLE во флагах), который служит для уменьшения/сжатия объема данных:

БитОбозначениеОписание
0RLEвсегда 1
1…5значение повтораколичество повторов с diff=0, ([0 … 31] + 1)

После блока повторяющихся нулей флаг переменной длины НЕ добавляется, используется значение, которое было до блока переменной длины.

Блок разности, если установлен бит RLE во флагах:

БитОбозначениеОписание
0RLEВсегда 0
N битdiff valueразность с предыдущим значением, со знаком если установлен флаг SIGNED;
нужно умножить на 10, если установлен флаг DIV10

RLE=0​

Блок разности, если бит RLE во флагах НЕ установлен:

БитОбозначениеОписание
N битdiff valueразность с предыдущим значением, со знаком если установлен флаг SIGNED;
нужно умножить на 10, если установлен флаг DIV10

Playground​

Результат появится здесь...