Я использую Arduino ESP8266 для хранения и загрузки настроек конфигурации на SPIFSS. Я использовал этот ConfigFile.ino в качестве справочного примера.
https://github.com/esp8266/Arduino/blob/master/libraries/esp8266/examples/ConfigFile/ConfigFile.ino
Эта функция загружает настройки конфигурации в переменные serverName
а также accessToken
,
bool loadConfig() {
File configFile = SPIFFS.open("/config.json", "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;
}
// Allocate a buffer to store contents of the file.
std::unique_ptr<char[]> buf(new char[size]);
// We don't use String here because ArduinoJson library requires the input
// buffer to be mutable. If you don't use ArduinoJson, you may as well
// use configFile.readString instead.
configFile.readBytes(buf.get(), size);
StaticJsonBuffer<200> jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(buf.get());
if (!json.success()) {
Serial.println("Failed to parse config file");
return false;
}
const char* serverName = json["serverName"];
const char* accessToken = json["accessToken"];
// Real world application would store these values in some variables for
// later use.
Serial.print("Loaded serverName: ");
Serial.println(serverName);
Serial.print("Loaded accessToken: ");
Serial.println(accessToken);
return true;
}
Я сделал некоторые изменения в этой функции, чтобы загрузить параметры конфигурации в структуру.
struct ConfigSettingsStruct
{
String ssid;
String password;
};
ConfigSettingsStruct ConfigSettings;
bool loadConfig() {
File configFile = SPIFFS.open("/config.json", "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;
}
// Allocate a buffer to store contents of the file.
std::unique_ptr<char[]> buf(new char[size]);
// We don't use String here because ArduinoJson library requires the input
// buffer to be mutable. If you don't use ArduinoJson, you may as well
// use configFile.readString instead.
configFile.readBytes(buf.get(), size);
StaticJsonBuffer<200> jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(buf.get());
if (!json.success()) {
Serial.println("Failed to parse config file");
return false;
}
//const char* serverName = json["serverName"];
//const char* accessToken = json["accessToken"];
char ssid_[30];
strcpy(ssid_, json["ssid"]);
ConfigSettings.ssid = String(ssid_);
char password_[30];
strcpy(password_, json["password"]);
ConfigSettings.password = String(password_);
// Real world application would store these values in some variables for
// later use.
Serial.print("Loaded ssid: ");
Serial.println(ConfigSettings.ssid);
Serial.print("Loaded password: ");
Serial.println(ConfigSettings.password);
return true;
}
После того, как я загружаю код и запускаю ESP8266, чип WiFi сбрасывается с некоторой ошибкой стека. Что не так с моим кодом? Как правильно настроить параметры конфигурации на ConfigSettings
?
В вашем вопросе нет ничего плохого в вашем коде. Он должен работать. Я сильно подозреваю, что причина ошибки стека лежит в другом месте. Пожалуйста, проверьте ваш код еще раз внимательно.
Это не считается ответом, но может быть полезным как напоминание, чтобы искать в другом месте. Возможно, вы смотрите не в том месте.
Пожалуйста, обратите внимание, что; у вас возможная утечка памяти после
std::unique_ptr<char[]> buf(new char[size]);
Я предлагаю вам использовать для выделения некоторой памяти через malloc (что не стильно, а классически) и в конце концов освободить ее. Вам также необходимо закрыть файл перед возвратом.
Также недостаточно длины вашего буфера ssid и passphrase. Максимальная длина ssid должна быть 32. Предполагая, что у вас есть шифрование на основе psk, вам нужно увеличить длину проходного буфера до 64.
Крошечный но; может быть, вы можете подумать о добавлении typedef перед struct define, несмотря на то, что C ++ определяет их в пространстве имен.