Бинарный протокол TBFP: особенности и сферы применения
Краткое резюме
TBFP — это простой бинарный протокол, разработанный для работы с микроконтроллерами и тестирования различных интерфейсов. Он работает по принципу master-slave и используется для временных нагрузочных тестов, отладки оборудования и проверки кабелей.
В нашем отделе существует 12 различных бинарных протоколов. Мы попытались создать один универсальный, но в итоге у нас появился 13-й протокол.
Всем разработчикам известен этот старый анекдот. В данной статье я хочу рассказать о простом бинарном протоколе, который я разработал много лет назад для практических нужд при работе с микроконтроллерами. Я назвал его TBFP (Trivial Binary Frame Protocol).
Обычно TBFP используется для тестирования интерфейсов, таких как BLE, RS485, LoRa, RS232, GFSK, UWB, CAN, UART, LIN, 1wire, 100 BASE-T1 и других. Этот протокол применяется для временных нагрузочных тестов, испытаний, отладки оборудования, проверки кабелей, тестов на потерю данных и т. п. По сути, TBFP является временным и кустарным аналогом ICMP.
TBFP работает по принципу master-slave, общение происходит в диалоговом режиме: запрос — ответ.
**Основные понятия:**
* Пакет — массив байтов с бинарной структурой известного типа данных.
* Little-Endian — способ хранения переменных в памяти, при котором младший байт идёт первым.
* Payload — полезные данные, передаваемые пакетом.
* Преамбула — константные данные в начале пакета, сигнализирующие приёмнику о начале протокольного пакета.
* Пакетная синхронизация — метод определения границ пакетов в потоке байтов в реальном времени.
**Требования к протоколу:**
* Протокол должен быть бинарным.
* Протокол должен быть предельно простым, чтобы минимизировать вероятность сбоев.
* Пакет должен иметь преамбулу (синхробайты), причём преамбула должна быть настраиваемой.
* Должен быть порядковый номер пакета (Sequence Number) разрядностью не менее 16 бит.
* Должно быть поле, указывающее длину полезных данных.
* Многобайтовые поля в заголовках следует передавать в формате Little Endian.
* В пакете должна быть контрольная сумма CRC, расположенная в конце пакета.
* Должен быть идентификатор типа полезных данных.
* Должно быть подтверждение принятого пакета, которое можно отключить.
* Должна быть предусмотрена повторная отправка в случае отсутствия подтверждения (ReTx), которую также можно отключить.
* Пакетная синхронизация должна осуществляться по преамбуле и по time-stamp(у).
* Должен быть периодический Hello пакет для каждой node (keep alive messages).
* Должен быть сторожевой таймер на потерю соединения.
* Протокол должен позволять обновлять прошивку, перезагружать плату, настраивать RTC, читать и записывать физическую память, передавать свои пакеты и выполнять другие операции с электронной платой.
Я постарался сделать так, чтобы структура пакета TBFP не менялась слишком сильно, как в случае с UDS. Преамбула занимает 1 байт и необходима для программного распознавания начала пакета.