Чтение файла из 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 и сохранить в переменной для использования.
@Mr.EU, 👍0
Обсуждение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
#include FS.h #include ESP8266WiFi.h #include ArduinoJson.h /* Set these to desired credentials in runtime */ String ssid = "tttttttt"; String pass = "ssssssss"; #define fileName "/LaSt.json" DynamicJsonBuffer jsonBuffer; void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial.println(""); delay(1000); //allows serving of files from SPIFFS Serial.println("Mounting FS..."); if (SPIFFS.begin()) { if (SPIFFS.exists(fileName)) { File subscribedUsersFile = SPIFFS.open(fileName, "r"); delay(10); String file_content = subscribedUsersFile.readString(); JsonObject& users = jsonBuffer.parseObject(file_content); if(users.containsKey("ssid")) {ssid=users["ssid"].as();} if(users.containsKey("pass")) {pass=users["pass"].as();} subscribedUsersFile.close(); users.prettyPrintTo(Serial); } else { // Create empty file (w+ not working as expect) File subscribedUsersFile = SPIFFS.open(fileName, "a+"); JsonObject& users = jsonBuffer.createObject(); users.set("ssid", ssid); users.set("pass", pass); users.printTo(subscribedUsersFile); users.printTo(Serial); subscribedUsersFile.close(); Serial.println("New Config File Created...\n"); users.prettyPrintTo(Serial); } } }
Ответ можно улучшить, добавив пару предложений с пояснениями! Пожалуйста примите к сведению., @MichaelT
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- Как связать MPU9250 и NodeMcu?
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Как изменить имя модуля ESP8266-12E по умолчанию
Конфигурация есть тип. у вас нет такого экземпляра, @Juraj