Загрузить параметры конфигурации на Arduino ESP8266

Я использую 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?

3

Решение

В вашем вопросе нет ничего плохого в вашем коде. Он должен работать. Я сильно подозреваю, что причина ошибки стека лежит в другом месте. Пожалуйста, проверьте ваш код еще раз внимательно.

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

2

Другие решения

Пожалуйста, обратите внимание, что; у вас возможная утечка памяти после

std::unique_ptr<char[]> buf(new char[size]);

Я предлагаю вам использовать для выделения некоторой памяти через malloc (что не стильно, а классически) и в конце концов освободить ее. Вам также необходимо закрыть файл перед возвратом.

Также недостаточно длины вашего буфера ssid и passphrase. Максимальная длина ssid должна быть 32. Предполагая, что у вас есть шифрование на основе psk, вам нужно увеличить длину проходного буфера до 64.

Крошечный но; может быть, вы можете подумать о добавлении typedef перед struct define, несмотря на то, что C ++ определяет их в пространстве имен.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector