Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Библиотека ArduinoJson

Домашняя страница - https://arduinojson.org/

Библиотека позволяет работать с файлами JSON.

ArduinoJson доступна через менеджер библиотек в Arduino IDE. Для работы с библиотекой нужно включить заголовочный файл.


#include <ArduinoJson.h>

Пример десериализации файла и вывод только необходимых данных показан в статье Узнаём погоду через OpenWeatherMap.

Создание JSON-файла

Рассмотрим пример создания JSON-файла с необходимыми данными.


#include <ArduinoJson.h>

void setup() {

  Serial.begin(115200);

  StaticJsonDocument<100> jsonDocument;

  jsonDocument["sensorType"] = "Temperature";
  jsonDocument["value"] = 16;

  char buffer[100];

  serializeJsonPretty(jsonDocument, buffer);

  Serial.println(buffer);
}

void loop() {}

В мониторе порта смотрим, как выглядит запись в JSON-формате.


{
  "sensorType": "Temperature",
  "value": 16
}

MessagePack. Сериализация

Кроме текстового формата JSON существует бинарный формат MessagePack. Честно признаюсь, никогда о нём не слышал до чтения примеров для библиотеки. MessagePack имеет преимущество - он эффективен для передачи данных, занимая меньше места. Это может оказаться решающим фактором при больших объёмах данных.

Пример с сериализацией не сильно отличается от аналогичного примера для JSON.


#include <ArduinoJson.h>

void setup() {

  Serial.begin(115200);

  StaticJsonDocument<100> jsonDocument;

  jsonDocument["sensorType"] = "Temperature";
  jsonDocument["value"] = 10;

  // требуемый
  int expectedBytesToWrite = measureMsgPack(jsonDocument);
  Serial.print("Expected Bytes: ");
  Serial.println(expectedBytesToWrite);
  //
  
  char buffer[100];

  int bytesWritten = serializeMsgPack(jsonDocument, buffer);

  Serial.print("Bytes written: ");
  Serial.println(bytesWritten);

  for (int i = 0; i < bytesWritten; i++) {
    Serial.printf("%02X ", buffer[i]);
  }
}

void loop() {}

// Результат
// Expected Bytes: 31
// Bytes written: 31
// 82 AA 73 65 6E 73 6F 72 54 79 70 65 AB 54 65 6D 70 65 72 61 74 75 72 65 A5 76 61 6C 75 65 0A

Проверить корректность данных можно на сайте msgpack-lite, декодируя набор байт.

В коде есть код, обрамлённый комментариями. Он позволяет узнать требуемый размер сообщения до отправки, не пересылая сами данные. Это пригодится, чтобы оценить объём данных и принять решение об отправке. Во время отправки сообщения этот код избыточен, так как при отправке сообщения мы можем уже сами посчитать количество отсылаемых байтов.

Дополнительные материалы

Узнаём погоду через OpenWeatherMap

Youtube: число подписчиков, просмотров и лайков

Реклама