Двоичный форматировщик сообщений
В настоящее время я разрабатываю устройство IoT с помощью Arduino и хочу свести к минимуму полезную нагрузку данных. Сначала я использовал json, который не очень эффективен в фиксированных сообщениях (формат всегда будет одинаковым). Затем я нашел что-то вроде пакета сообщений, который тоже звучит неплохо, но я думаю, что вы могли бы добиться еще большего успеха, используя только двоичный код. Надеюсь найти что-то подобное:
Например, у меня есть сообщение:
#BOOL#INT#INT#FLOAT#BOOL#STRING#
Положение этих переменных никогда не меняется, поэтому я мог представить сообщение в двоичном формате и сэкономить много байтов. Есть ли какая-нибудь библиотека, которая может декодировать такие форматы и генерировать сообщения из заданных значений?
Если нет, я думаю, что это было бы очень полезно в других устройствах IoT!
@perotom, 👍4
4 ответа
В такой библиотеке нет необходимости, так как базовый C++ может справиться с этим самостоятельно. Создайте упакованную структуру с полями, заполните поля присваиванием или копированием памяти и приведите к char*
для отправки. Обратный порядок операций для получения. Остерегайтесь строки, так как они должны/должны где-то указывать длину.
Передача сообщений между компьютерами и/или микроконтроллерами с различной архитектурой может быть настоящей проблемой (порядок байтов...). Так что не попадайте в 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
используйте структуру, организуйте данные и при передаче структуры используйте указатель char, указывающий на нее, чтобы все было отправлено в двоичном формате.
вам нужно будет придумать способ определить, когда заканчивается указатель.
Хорошим выбором для отправки данных датчиков является 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
- устаревшее преобразование из строковой константы в 'char*'
- как быстро loop() работает в Arduino
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Глобальные переменные занимают много места в динамической памяти.
- Включить Guards vs #pragma один раз
- как отправить аргумент объектам ESP8266WebServer в функции
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Какие Arduino поддерживают ATOMIC_BLOCK?
также возможно ли завершить строку вместо использования фиксированной длины?, @perotom
Нет никакой разницы между завершением строки и указанием длины, кроме того факта, что в строке нельзя использовать терминатор., @Ignacio Vazquez-Abrams