Двоичный форматировщик сообщений

В настоящее время я разрабатываю устройство IoT с помощью Arduino и хочу свести к минимуму полезную нагрузку данных. Сначала я использовал json, который не очень эффективен в фиксированных сообщениях (формат всегда будет одинаковым). Затем я нашел что-то вроде пакета сообщений, который тоже звучит неплохо, но я думаю, что вы могли бы добиться еще большего успеха, используя только двоичный код. Надеюсь найти что-то подобное:

Например, у меня есть сообщение:

#BOOL#INT#INT#FLOAT#BOOL#STRING#

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

Если нет, я думаю, что это было бы очень полезно в других устройствах IoT!

, 👍4


4 ответа


2

В такой библиотеке нет необходимости, так как базовый C++ может справиться с этим самостоятельно. Создайте упакованную структуру с полями, заполните поля присваиванием или копированием памяти и приведите к char* для отправки. Обратный порядок операций для получения. Остерегайтесь строки, так как они должны/должны где-то указывать длину.

,

также возможно ли завершить строку вместо использования фиксированной длины?, @perotom

Нет никакой разницы между завершением строки и указанием длины, кроме того факта, что в строке нельзя использовать терминатор., @Ignacio Vazquez-Abrams


8

Передача сообщений между компьютерами и/или микроконтроллерами с различной архитектурой может быть настоящей проблемой (порядок байтов...). Так что не попадайте в NIH / изобретать колесо ловушки, но продолжать стоять на плечах гигантов! Существует несколько протоколов сериализации сообщений.

  • BSON
  • Пакет сообщений
  • Буферы протокола
  • CBOR (краткое представление двоичных объектов)
  • ...

Существует несколько реализаций таких протоколов (даже для Arduino).

Я предлагаю вам поискать такие протоколы в поисковой системе и добавить Arduino.

Я нашел:

  • БСОН
    • ардубсон
  • Пакет сообщений
    • msgpack-mcu
    • arduino_msgpack
    • MsgPacketizer
    • msgpack-arduino
    • ArduinoJSON serializeMsgPack / десериализоватьMsgPack
  • Буферы протокола
    • нанопб
  • ЦБОР
    • Arduino-Cbor
  • ...

PS: вы можете прочитать https://scottlocklin.wordpress .com/2017/04/02/please-stop-writing-new-serialization-protocols/ и посмотрите на https://xkcd.com/927/ Просто выберите гиганта, соответствующего вашим требованиям ;-)

https://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats может помочь

,

Блестящий. Может быть, добавить что-нибудь о том, как плохо работает отправка структур между avr, arm и x86?, @Mikael Falkvidd


0

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

вам нужно будет придумать способ определить, когда заканчивается указатель.

,

1

Хорошим выбором для отправки данных датчиков является CayenneLPP. LPP означает "Полезная нагрузка с низким энергопотреблением". Это кодирование с учетом типа датчика, которое использует как можно меньше байтов.

Ключевой особенностью является то, что получатель не должен знать о содержании, поскольку оно закодировано в сообщение, поэтому вы можете создать общий шлюз, используя это.

Подробнее о CayenneLPP можно прочитать здесь: https://developers. mydevices.com/cayenne/docs/lora/#lora-cayenne-low-power-payload

Рекомендуется использовать его на TTN, чтобы минимизировать вес полезной нагрузки.

Существует библиотека Arduino для кодирования и декодирования. Для декодирования он выводит объект JSON, поэтому он готов к использованию на таких платформах, как NodeRed или в любом приложении Python или веб-приложении.

Проверьте это здесь: https://github.com/ElectronicCats/CayenneLPP

,