NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
#define USE_SERIAL Serial

ESP8266WiFiMulti WiFiMulti;
String url = "http://192.168.31.170/api/mode/qwertyui";

void setup() {
  USE_SERIAL.begin(9600);

  USE_SERIAL.println();
  USE_SERIAL.println();
  USE_SERIAL.println();

  for (uint8_t t = 4; t > 0; t--) {
    USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
    USE_SERIAL.flush();
    delay(1000);
  }

  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP("Robotics Incubator", "XXXXXXX");
}

void loop() {
  // ждем подключения к WiFi
  if ((WiFiMulti.run() == WL_CONNECTED)) {
    HTTPClient http;
    http.begin(url); // HTTP
    int httpCode = http.GET();

    if (httpCode == 200) {
      // Парсинг
      const size_t bufferSize = JSON_OBJECT_SIZE(1) + 50;
      DynamicJsonBuffer jsonBuffer(bufferSize);  // Это не объявленная ошибка.
      JsonObject& root = jsonBuffer.parseObject(http.getString());
      // Параметры
      int Mode = root["mode"]; // 1
      Serial.print("Name:");
      Serial.println(Mode);
    }
    http.end();
  }

  if (Serial.available()) {
    url = Serial.readString();
  }
  delay(100);
}

Как решить эту проблему? Я следовал этому руководству - ESP8266: Анализ JSON

, 👍2


2 ответа


Лучший ответ:

5

Эта ошибка вызвана использованием версии 6.xx библиотеки ArduinoJson с кодом, написанным для версии библиотеки до 6.xx.

У вас есть два варианта решения проблемы:

А. Обновите библиотеку до версии, совместимой с вашим кодом

На данный момент это, вероятно, лучший вариант, потому что версия ArduinoJson 6.xx все еще находится в стадии бета-тестирования, поэтому имеет смысл подождать, пока новый API не будет стабилизирован, прежде чем портировать свой код. Это даже рекомендуют разработчики ArduinoJson:

https://arduinojson.org/v5/faq/ ошибка-jsonbuffer-не была объявлена-в-этой-области/

  1. Скетч > Включить библиотеку > Управление библиотеками...
  2. Дождитесь завершения загрузки.
  3. В поле "Отфильтруйте результаты поиска..." введите "arduinojson".
  4. Нажмите "ArduinoJson от Бенуа Бланшона".
  5. В раскрывающемся меню "Выбрать версию" выберите "Версия 5.13.2".
  6. Нажмите "Обновить". Дождитесь завершения обновления.
  7. Нажмите "Закрыть".

Теперь ваш код будет скомпилирован. Если у вас включен параметр Файл > Настройки > Проверять наличие обновлений при запуске, вы по-прежнему будете получать уведомление об обновляемой библиотеке для библиотеки ArduinoJson, но вам нужно воздержаться от обновления до версии 6.xx или ошибки вернется.

Б. Обновите свой код, чтобы он был совместим с версией 6.xx библиотеки ArduinoJson

В этом случае вам нужно изменить код десериализации, чтобы использовать новый DynamicJsonDocument вместо старого DynamicJsonBuffer:

if (httpCode == 200) {
  // Парсинг
  const size_t bufferSize = JSON_OBJECT_SIZE(1) + 50;
  DynamicJsonDocument jsonDocument(bufferSize);
  DeserializationError error = deserializeJson(jsonDocument, http.getString());
  if (error) {
    Serial.println("There was an error while deserializing");
  }
  else {
    JsonObject root = jsonDocument.as<JsonObject>();
    // Параметры
    int Mode = root["mode"]; // 1
    Serial.print("Name:");
    Serial.println(Mode);
  }
}

Подробнее об этом можно узнать здесь:

https://arduinojson.org/v6/doc/upgrade/

,

0

Этот ответ необходимо обновить для всех, кто посещает этот сайт. Версия 6.xx больше не находится в стадии бета-тестирования. Просто обновитесь до последней версии. На момент написания этого ответа идентификатор версии — 6.15.2. Обновление до этого устранит ошибку.

,