在Arduino ESP8266上加载配置参数

时间:2016-09-20 15:22:56

标签: c++ arduino esp8266 arduino-esp8266

我正在使用Arduino ESP8266在SPIFSS上存储和加载配置设置。我使用此ConfigFile.ino作为参考示例。

https://github.com/esp8266/Arduino/blob/master/libraries/esp8266/examples/ConfigFile/ConfigFile.ino

此功能将配置设置加载到变量serverNameaccessToken

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

2 个答案:

答案 0 :(得分:2)

问题中的代码没有任何问题。它应该工作。我强烈怀疑堆栈错误的原因在于其他地方。请再次仔细检查您的密码。

这不算作答案,但可以提醒您去其他地方。你可能正在寻找错误的地方。

答案 1 :(得分:2)

请注意;

之后你可能有内存泄漏
std::unique_ptr<char[]> buf(new char[size]);

我建议您使用malloc(这不是时尚而经典)来分配一些内存,毕竟它是免费的。您还需要在返回之前关闭文件。

此外,您的ssid和密码短语缓冲区长度还不够。最大ssid长度必须为32.假设您有基于psk的加密,则需要将传递缓冲区长度增加到64.

微小但是;也许你可以考虑在struct define之前添加一个typedef,尽管C ++线程可以在命名空间中定义。