В этом уроке ESP8266 создадим простую программу для синтаксического анализа строки JSON, имитирующей данные с датчика, и вывод полученных значений в последовательный порт. Для данного урока вам нужно установить библиотеки ESP8266 для Arduino IDE, о чем рассказывал здесь.
Чтобы избежать ручного декодирования строки в пригодные для использования значения, будем использовать библиотеку ArduinoJson, которая предоставляет простые в использовании классы и методы для синтаксического анализа JSON. С библиотекой и ее возможностями можно ознакомиться на GitHub.
Эта очень полезная библиотека позволяет, как кодировать, так и декодировать JSON, она очень эффективна и работает на ESP8266. Её можно установить через «менеджер библиотек» Arduino IDE, как показано на рисунке ниже.
Основные настройки для работы esp8266 json http.
Прежде всего, необходимо подключить библиотеку ArduinoJson, реализующую функцию синтаксического анализа.
#include "ArduinoJson.h"
Поскольку в этой библиотеке есть некоторые приемы, позволяющие избежать проблем при ее использовании, в этом уроке будет показано, как анализировать локально созданную строку, и поэтому мы не будем использовать функции WiFi. Итак, мы просто запустим последовательное соединение. Но вы можете использовать esp8266 json http на основании предыдущих уроков.
void setup() {
Serial.begin(115200);
Serial.println(); //Перенос на новую строку
}
Основной код разбора JSON с помощью ESP8266.
В функции основного цикла 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);
}
Проверка кода вывода значений полученных из JSON с помощью ESP8266 (NodeMCU).
Чтобы протестировать код, просто скомпилируйте его, и загрузите на плату ESP8266 (NodeMCU). После этого откройте последовательный монитор Arduino IDE. На рисунке ниже показан результат, вывода данных в последовательный порт.
Как видим, у этой библиотеки есть некоторые особенности, которые должны учитывать при ее использовании, чтобы избежать неожиданных проблем. К счастью, страница этой библиотеки на GitHub очень хорошо документирована, и поэтому здесь есть раздел, описывающий, как избежать ошибок.
Кроме того, настоятельно рекомендую проверить примеры программ, которые устанавливаются вместе с библиотекой, которые очень хорошо подходят для понимания того, как она работает.
Заключение к уроку Arduino json esp8266.
В этом уроке показано, как легко анализировать JSON при помощи ESP8266 в среде Arduino. Естественно, это позволяет изменять данные в хорошо известном структурированном формате, который может быть легко интерпретирован другими приложениями, без необходимости реализации определенного протокола.
Поскольку микроконтроллеры и устройства IoT имеют ограниченные ресурсы, JSON создает гораздо меньше расходов ресурсов, чем, например, XML, и поэтому является очень хорошим выбором.
Тем не менее, нужно иметь в виду, что для некоторых интенсивных приложений даже JSON может создавать недопустимые нагрузки, и поэтому нам может потребоваться перейти на байтовые протоколы. Но для простых приложений, таких как чтение данных с датчика и отправка их на удаленный сервер или получение набора конфигураций, JSON является очень хорошей альтернативой.
Понравился ESP826 урок. Анализ JSON в среде Arduino IDE? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Файлы для скачивания
|
скетч разбора JSON с помощью ESP8266.ino | 1 Kb | 724 |
Скачать
Вы можете скачать файл.
|
Комментарии