Чтение файла из SPIFFS в nodemcu с использованием ArduinoJson

#include <ArduinoJson.h>      
#include <FS.h>    

/* Set these to desired credentials in runtime */
struct Config {
  String ssid = "";
  String pass = "";
  bool hFlag = false;
};

void setup() {
  // поместите сюда свой код установки для однократного запуска:
  Serial.begin(115200);
  Serial.println("");
  delay(1000);

  //разрешает обслуживание файлов из SPIFFS
  Serial.println("Mounting FS...");
  if (!SPIFFS.begin()) {
    Serial.println("Failed to mount file system");
    return;
  }

  if (readConfigFile("/LaSt.json", false)) {
    Serial.println("Config read");
  } else {
    Serial.println("Failed to read config");
  }
}

bool readConfigFile(char* fileName, bool whichFile)
{
  File configFile = SPIFFS.open(fileName, "r");
  if (!configFile) {
    Serial.println("Failed to open config file");
    return false;
  }

  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Config file size is too large");
    return false;
  }

  // Выделяем пул памяти в стеке.
  // Используйте arduinojson.org/assistant для вычисления емкости.
  StaticJsonBuffer<256> jsonBuffer;

  // Разбираем корневой объект
  JsonObject &root = jsonBuffer.parseObject(configFile);

  if (!root.success())
    Serial.println(F("Failed to read file, using default configuration"));

  // Копируем значения из JsonObject в конфигурацию
  Config.ssid = root["ssid"];
  Config.pass = root["pass"];
  if (whichFile)
  {
    Config.hFlag = root["hFlag"];
  }

  // Файл нам больше не нужен
  configFile.close();

  return true;
}

Компиляция выдает ошибку в разделе Копировать значения из JsonObject в раздел Config. Ошибка: ожидается неквалифицированный идентификатор перед '.' токен.

Хотите прочитать файл из SPIFFS и сохранить в переменной для использования.

, 👍0

Обсуждение

Конфигурация есть тип. у вас нет такого экземпляра, @Juraj


2 ответа


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

2

Ваш код вверху:

struct Config {
  String ssid = "";
  String pass = "";
  bool hFlag = false;
};

определяет переменную «тип». Это похоже на создание нового int или bool, но ваш называется struct Config.

После создания типа вам необходимо объявить его экземпляр.

struct Config cfg;

Затем вы ссылаетесь на тот, который вы создали:

  // Копируем значения из JsonObject в структуру Config с именем cfg
  cfg.ssid = root["ssid"];
  cfg.pass = root["pass"];
  if (whichFile)
  {
    cfg.hFlag = root["hFlag"];
  }

Обратите внимание, что особая проблема с ArduinoJSON и Strings заключается в том, что вы можете получить следующую ошибку:

error: ambiguous overload for 'operator=' (operand types are 'String' and 'ArduinoJson::JsonObjectSubscript<const char*>')

Существует часто задаваемые вопросы по ArduinoJSON, в котором говорится

В большинстве случаев вы можете полагаться на неявное приведение типов.

Но есть одно заметное исключение: когда вы конвертируете JsonVariant в строка.

Например:

String ssid = network["ssid"];
ssid = network["ssid"];

Первая строка скомпилируется, но вторая завершится с ошибкой. следующая ошибка:

error: ambiguous overload for 'operator=' (operand types are 'String' and 'ArduinoJson::JsonObjectSubscript<const char*>')

Решение состоит в том, чтобы устранить двусмысленность с помощью любой из следующих замен:

ssid = (const char*)network["ssid"];
ssid = network["ssid"].as<const char*>();
ssid = network["ssid"].as<String>();
,

неоднозначная перегрузка для 'operator=' (типы операндов: 'String' и 'ArduinoJson::Internals::JsonObjectSubscript<const char*>'), @Mr.EU

[ссылка1](https://github.com/bblanchon/ArduinoJson/issues/146#issuecomment-153085201), [ссылка2](https://arduinojson.org/v5/faq/how-to-fix-error-ambiguous -перегрузка-для-оператора/), @Mr.EU

Вы хотите задать новый вопрос?, @jose can u c

Нет, просто упомянул, что в конкретном случае переменная типа string выдаст ошибку, а обходные пути приведены в ссылках. Однако эти обходные пути также выдают предупреждения., @Mr.EU


0
#include FS.h
#include ESP8266WiFi.h
#include ArduinoJson.h

/* Установите для них нужные учетные данные во время выполнения */

Строка ssid = «ттттттт»;
String pass = "сссссссс";

#define fileName "/LaSt.json"

ДинамическийJsonBuffer jsonBuffer;

недействительная настройка() {
// поместите сюда свой код установки для однократного запуска:
Serial.begin(115200);
Serial.println("");
задержка(1000);

//разрешает обслуживание файлов из SPIFFS
Serial.println("Монтаж ФС...");
если (SPIFFS.begin()) {

если (SPIFFS.exists(имя_файла)) {

Файл subscribedUsersFile = SPIFFS.open(fileName, "r");

задержка(10);

Строка file_content = subscribedUsersFile.readString();

JsonObject& пользователи = jsonBuffer.parseObject(file_content);

if(users.containsKey("ssid")) {ssid=users["ssid"].as();}
if(users.containsKey("pass")) {pass=users["pass"].as();}


подписавшийсяUsersFile.close();

пользователи.prettyPrintTo(Serial);


}
еще {

// Создаём пустой файл (w+ работает не так, как ожидалось)

Файл subscribedUsersFile = SPIFFS.open(fileName, "a+");

JsonObject& пользователи = jsonBuffer.createObject();

users.set("ssid", ssid);

пользователи.set("пройти", пройти);

пользователи.printTo(subscribedUsersFile);

пользователи.printTo(Serial);

подписавшийсяUsersFile.close();

Serial.println("Новый файл конфигурации создан...\n");

пользователи.prettyPrintTo(Serial);

}

}
}

,

Ответ можно улучшить, добавив пару предложений с пояснениями! Пожалуйста примите к сведению., @MichaelT