В этом уроке ESP8266 создадим простую программу для синтаксического анализа строки JSON, имитирующей данные с датчика, и вывод полученных значений в последовательный порт. Для данного урока вам нужно установить библиотеки ESP8266 для Arduino IDE, о чем рассказывал здесь.
Чтобы избежать ручного декодирования строки в пригодные для использования значения, будем использовать библиотеку ArduinoJson, которая предоставляет простые в использовании классы и методы для синтаксического анализа JSON. С библиотекой и ее возможностями можно ознакомиться на GitHub.
Эта очень полезная библиотека позволяет, как кодировать, так и декодировать JSON, она очень эффективна и работает на ESP8266. Её можно установить через «менеджер библиотек» Arduino IDE, как показано на рисунке ниже.
Прежде всего, необходимо подключить библиотеку ArduinoJson, реализующую функцию синтаксического анализа.
#include "ArduinoJson.h"
Поскольку в этой библиотеке есть некоторые приемы, позволяющие избежать проблем при ее использовании, в этом уроке будет показано, как анализировать локально созданную строку, и поэтому мы не будем использовать функции WiFi. Итак, мы просто запустим последовательное соединение. Но вы можете использовать esp8266 json http на основании предыдущих уроков.
void setup() {
Serial.begin(115200);
Serial.println(); //Перенос на новую строку
}
В функции основного цикла loop() объявим сообщение JSON, которое будет проанализировано. Символы «\» используются для экранирования двойных кавычек в строке, поскольку имена JSON требуют двойных кавычек.
char JSONMessage[] ="{\"SensorType\":\"Temperature\", \"Value\": 10}";
Эта простая структура состоит из 2 пар «имя : значение», соответствующих типу датчика и значению для этого датчика. Для удобства чтения, структура JSON данных показана ниже без экранирования символов.
{
"SensorType" : "Temperature",
"Value" : 10
}
Затем нам нужно объявить объект класса StaticJsonDocument. Он будет соответствовать предварительно выделенному пулу памяти для хранения дерева объектов, и его размер указывается в параметре шаблона (значение между <> ) в байтах.
StaticJsonDocument<300> parsed; //Пул памяти
В этом случае мы объявили размер 300 байт, что более чем достаточно для строки, которую хотим проанализировать. Автор библиотеки указывает здесь два подхода к определению размера буфера. Лично я предпочитаю объявлять буфер, имеющий достаточный размер для ожидаемой полезной нагрузки сообщения, и проверять наличие ошибок на этапе синтаксического анализа.
Библиотека также поддерживает динамическое выделение памяти, но такой подход не рекомендуется.
Затем вызываем объект DeserializationError, передавая строку JSON в качестве аргумента.
// Десериализация документа JSON DeserializationError error = deserializeJson(parsed, JSONMessage);
Чтобы проверить, успешно ли был проанализирован JSON, проверим, удалось ли выполнить синтаксический анализ.
// Проверьте, удастся ли выполнить синтаксический анализ.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
else { //Вывести если ошибок нет
Serial.println("There are no errors");
delay(5000);
}После этого можем использовать оператор индекса для получения проанализированных значений по их именам. Проверяем здесь информацию об операторе нижнего индекса. Другими словами, это означает, что мы используем квадратные скобки и имена параметров для получения их значений, как показано ниже
const char* sensorType = parsed["SensorType"]; //Получить значение типа датчика int value = parsed["Value"]; //Получить значение измерения датчика
Код основного цикла программы показана ниже. Мы включили несколько дополнительных выводов информации, чтобы отделить каждую итерацию функции цикла и показать, как исходная строка изменяется при синтаксическом анализе. Нам нужно напечатать значения char из char, потому что синтаксический анализатор включает символы «\0», и поэтому, если бы мы использовали Serial.println (JSONMessage), мы бы просто видели содержимое до первого символа «\0».
void loop() {
Serial.println("——————");
char JSONMessage[] = " {\"SensorType\": \"Temperature\", \"Value\": 10}"; //Исходное сообщение
Serial.print("Initial string value: ");
Serial.println(JSONMessage);
StaticJsonDocument<300> parsed; //Пул памяти
// Десериализация документа JSON
DeserializationError error = deserializeJson(parsed, JSONMessage);
// Проверьте, удастся ли выполнить синтаксический анализ.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
else { //Вывести если ошибок нет
Serial.println("There are no errors");
delay(5000);
}
const char* sensorType = parsed["SensorType"]; //Получить значение типа датчика
int value = parsed["Value"]; //Получить значение измерения датчика
Serial.println(sensorType);
Serial.println(value);
Serial.print("Final string value: ");
for (int i = 0; i < 35; i++) { //Выведите измененную строку после синтаксического анализа
Serial.print(JSONMessage[i]);
Serial.print(" ");
}
Serial.println();
delay(5000);
}Чтобы протестировать код, просто скомпилируйте его, и загрузите на плату ESP8266 (NodeMCU). После этого откройте последовательный монитор Arduino IDE. На рисунке ниже показан результат, вывода данных в последовательный порт.

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

В этом уроке показано, как легко анализировать JSON при помощи ESP8266 в среде Arduino. Естественно, это позволяет изменять данные в хорошо известном структурированном формате, который может быть легко интерпретирован другими приложениями, без необходимости реализации определенного протокола.
Поскольку микроконтроллеры и устройства IoT имеют ограниченные ресурсы, JSON создает гораздо меньше расходов ресурсов, чем, например, XML, и поэтому является очень хорошим выбором.
Тем не менее, нужно иметь в виду, что для некоторых интенсивных приложений даже JSON может создавать недопустимые нагрузки, и поэтому нам может потребоваться перейти на байтовые протоколы. Но для простых приложений, таких как чтение данных с датчика и отправка их на удаленный сервер или получение набора конфигураций, JSON является очень хорошей альтернативой.
Понравился ESP826 урок. Анализ JSON в среде Arduino IDE? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Файлы для скачивания
| скетч разбора JSON с помощью ESP8266.ino | 1 Kb | 996 | Скачать |
Уроки ESP8266 (заметки)
17 августа , 2021
Комментариев:0
Файлов для скачивания:1
Фото:4
Понравилась статья? Нажми
Читайте также
Мы в соц сетях
Комментарии