Problème pour récupérer données json sur ESP32

Bonjour,
Je découvre l'ESP32. J'utilise platformio pour développer.
Mon souhait :
stocker en mémoire flash (SPIFFS) un fichier config.json avec les paramètres de l'application.
les récupérer pour configurer le wifi entre autre.
Je n'y arrive pas.
Voici le config.json:

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

Voici mon main.cpp (simplifié)

#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:
}

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

Je ne récupère pas les informations du json.
Quelles sont mes erreurs.
Merci de votre aide.

Salut
Tu passes la structure config par valeur, donc la structure d'origine ne sera pas modifiée.
Il faut la passer par adresse :

void loadConfiguration(const char *filename, SSIDConfig *config)
//...
    strcpy(config->ssidName, doc["ssidName"]);
    strcpy(config->ssidPassword, doc["ssidPassword"]);     
// et l'appel de la fonction :
  loadConfiguration(filename, &config);

On peut aussi passer par référence :

void loadConfiguration(const char *filename, SSIDConfig &config)
//...
    strcpy(config.ssidName, doc["ssidName"]);
    strcpy(config.ssidPassword, doc["ssidPassword"]);     
// et l'appel de la fonction :
  loadConfiguration(filename, config);

Merci,

Cela fonctionne mieux.

J'ai toujours eu des pbs avec le passage par référence, adresse..

Salut "hbachetti",

Comment je traite les paramètres de type numérique.
Dans mon config.json, je rajoute l'IP d'un serveur MQTT et son port, un nombre : 1883.

Merci de ton aide.

Utilise l'assistant de la bibliothèque Arduinojson

Il te fera le code de désérialisation pour ton besoin spécifique

Sinon, en ayant ajouté unsigned port à la config :
config.port = atol(doc["port"]);
Ou mieux :
config.port = strtoul(doc["port"], NULL, 10);
Ou tout simplement :
config.port = doc["port"]; // conversion implicite