Если существует ограничение по объему передаваемых данных за одну транзакцию – данные будут разбиты на фрагменты и переданы пакетами. Подробнее о структуре передаваемых данных написано здесь.
Данные, разделенные на фрагменты, передаются в двух типах пакетов:
Заглавный пакет 0x87
Передача данных в пакетах начинается с заглавного пакета. Размер заголовка (не включая массив data
) пакета – 8 байт. Первый байт заглавного пакета всегда 0x87
.
Название | Размер | Описание |
---|---|---|
flag | 1 байт | Постоянная. 0x87 |
packetID | 2 байта | ID пакета. |
packetsCnt | 1 байт | Количество пакетов, в которых будут переданы данные. |
dataSize | 2 байта | Сколько данных во всех пакетах. |
crc | 1 байт | Контрольная сумма от данных во всех пакетах. |
packDataSz | 1 байт | Сколько данных в данном пакете. |
data[] | packDataSz | Данные. |
Заглавный пакет содержит информацию об общем числе пакетов packetsCnt
и общем количестве байт данных dataSize
, а так же из самих данных data
.
Второй и последующие пакеты 0x88
Последующие пакеты всегда начинаются с байта 0x88
. Размер 5 байт (не включая массив data
), имеют следующую структуру:
Название | Размер | Описание |
---|---|---|
flag | 1 байт | Постоянная. 0x88 |
packetID | 2 байта | ID пакета. |
packetNum | 1 байт | Номер текущего пакета, начиная с 0, где 0 – заглавный пакет. |
packDataSz | 1 байт | Сколько данных в данном пакете. |
data[] | packDataSz | Данные. |
Алгоритм работы с пакетами
Получив заглавный пакет с 0x87
создается временное хранилище и определяется какое будет общее количество пакетов. При получении пакета 0x88
проверяется packetNum
и packetID
, добавляется в хранилище. После получения последнего пакета извлекаются все поля data
из всех пакетов. Проверяется CRC от данных, хранилище очищается, данные передаются далее для обработки. Обработка полученных данных выполняется в соответствии с описанием здесь.
Пример разделения данных на пакеты:
