В этом уроке 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 | 810 | Скачать |
Уроки ESP8266 (заметки)
17 августа , 2021
Комментариев:0
Файлов для скачивания:1
Фото:4
Понравилась статья? Нажми
Виджеты для Easy HMI
Читайте также
Мы в соц сетях
Комментарии