繁体   English   中英

在 ESP32 上如何检索存储在 SPIFFS json 文件中的 wifi 凭据

[英]On ESP32 how to retrieve wifi credentialsstored in SPIFFS json file

我需要你的帮助,因为即使我老了(65 岁),我也是 ESP32 的新手。 我想检索 config.json 文件中的应用程序参数。 我正在使用 PlatformIO

这是代码和文件。 配置.js:

{
  "ssidName": "AP_001",
  "ssidPassword": "**************"
}

这是main.cpp:

#include <Wire.h>
    #include <AsyncTCP.h>
    #include <ESPAsyncWebServer.h>
    #include <SPIFFS.h>
    #include <ArduinoJson.h>
    
    struct SSIDConfig 
    {
      char ssidName[32];
      char ssidPassword[64];
    };
    
    const char *filename = "/config.json";  
    SSIDConfig config;
    
    // ----- Create AsyncWebServer object on port 80
    AsyncWebServer server(80);
    
    // ------------------------------------------------
    // ------ Loads the configuration from a file
    void loadConfiguration(const char *filename, SSIDConfig config) 
    {
      // Open file for reading
      File configFile = SPIFFS.open(filename, "r");
    
      if (configFile) 
      {
        size_t size = configFile.size();
        // ------ Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);
        configFile.readBytes(buf.get(), size);
      
        StaticJsonDocument<512> doc;
    
        // ------ Deserialize the JSON document
        DeserializationError error = deserializeJson(doc, buf.get());
        if (error)
          Serial.println(F("Failed to read file, using default configuration"));
    
        // ------ Copy values from the JsonDocument to the Config  
        strcpy(config.ssidName, doc["ssidName"]); 
        strcpy(config.ssidPassword, doc["ssidPassword"]);   
        
        // ------ Close the file
        configFile.close();
      }
      else
        Serial.println("Echec ouverture config.json");
    }
    
    void setup() {
      // ------------------------------------------------ Serial
      Serial.begin(115200);
      Serial.println();
    
      // ------------------------------------------------ SPIFFS
      if(!SPIFFS.begin())
      {
        Serial.println("Erreur SPIFFS");
        return;
      }
    
      File root = SPIFFS.open("/");
      File file = root.openNextFile();
    
      while (file)
      {
        Serial.print("File: ");
        Serial.print(file.name());
        Serial.print(" - ");
        Serial.print(file.size());
        Serial.println(" octets");
        file.close();
        file = root.openNextFile();
      }
    
       // ------------------------------------------------ Load Config
      Serial.println(F("Loading configuration..."));
      loadConfiguration(filename, config);
    
       // ------------------------------------------------ WIFI
      Serial.print("ssidName:");
      Serial.print(config.ssidName);
      Serial.println("|");
    
      Serial.print("ssidPassword:");
      Serial.print(config.ssidPassword);
      Serial.println("|");
    
      WiFi.begin(config.ssidName, config.ssidPassword);
      Serial.print("Connexion au Wifi...");
    
      while(WiFi.status() != WL_CONNECTED)
      {
        Serial.print(".");
        delay(100);
      }
    
      Serial.println("\n");
      Serial.println("Connexion établie!");
      Serial.print("Adresse IP: ");
      Serial.println(WiFi.localIP());
    
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    }

结果如下:

File: /config.json - 375 octets
Loading configuration...
ssidName:|
ssidPassword:|
[E][WiFiSTA.cpp:125] begin(): SSID too long or missing!
Connexion au Wifi............................................

如您所见,我从 config.json 文件中一无所获。

我做错了什么。 谢谢你的帮助

使用这个JsonTinyDB库会更容易。

#include "Json.h"
#include "SPIFFS.h"
#include "TinyDB.h"
#include "WiFi.h"

TinyDB db;

void setup() {
    Serial.begin(115200);
    delay(1000);  //Make sure Serial has been initialized

    SPIFFS.begin(true);
    db.begin(SPIFFS);

    //Be careful, there is no directory in SPIFFS.
    //If you've saved the file as "config.json", you should use "config.json" instead of "/config.json"
    String cfgStr = db.getString("/config.json");
    Serial.println("Config: " + cfgStr);  //Check if the file exists

    //If the file exist, just pass the string to Json object
    Json config = Json(cfgStr);

    //Print Json object into Serial
    //This would be empty if the json format is invalid
    JSUtil.prettyPrint(Serial, config);

    //Get the value of "ssidName"
    String ssidName = config["ssidName"];
    Serial.println("SSID: " + ssidName);

    //Get the value of "ssidPassword"
    String ssidPassword = config["ssidPassword"];
    Serial.println("Password: " + ssidPassword);

    Serial.println("\nConnecting to WiFi...");
    WiFi.begin(ssidName.c_str(), ssidPassword.c_str());
    while (!WiFi.isConnected()) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("\nWiFi Connected!");
}

void loop() {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM