Если существует ограничение по объему передаваемых данных за одну транзакцию – данные будут разбиты на фрагменты и переданы пакетами. Подробнее о структуре передаваемых данных написано здесь.
Данные, разделенные на фрагменты, передаются в двух типах пакетов:
Заглавный пакет 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 от данных, хранилище очищается, данные передаются далее для обработки. Обработка полученных данных выполняется в соответствии с описанием здесь.
Пример разделения данных на пакеты:
