Template : ESP32 Credential In a File

Auteur

J.Soranzo

Association

Bricolab

Entity

VoRoBoTics 1

Repository source doc

https://bitbucket.org/myarduinotemplates/docsource/src/master/

Dépôt BitBucket du code

https://bitbucket.org/myarduinotemplates/esp32credentialsinfile

Création

06/2024

Maj

06/2024

Presentation

Plutôt que d’utiliser WifiManager, l’idée ici est de mettre les informations de connexion dans un fichier dans le SPIFFS de la carte. Pas de mode AP !

Besoin d’avoir plusieurs SSID stockés en même temps et de pouvoir choisir en fonction des lieux.

Recherche net:

See also

SITE DE RESSOURCES GITHUB

Credentials manager for Arduino-based projects using EEPROM 2 from RoboticSolutionsBO

See also

SITE D’AIDE ARDUINO.CC

CredentialManager 3 utilise une dépendance SQLite3 qui dépend d’une autre, et c’est pas documenté… Un bel effort d’écriture mais beaucoup trop complexe.

Les autres exemples que j’ai pu trouver utilisent tous du json et par expérience, je trouve cela trop lourd juste pour quelques lignes de credentials

Mon implémentation

Dans un fichiers à la structure bien pré-définie, je stocke jusqu’à 5 ssid/password

exemple de fichier( la structure doit être strictement respectée):

Nombre de ssid = 5

ssid1=frexboxmachin
pass1=12345678

ssid-giveItAName=frexboxmachin
pass-NameofYourConnexion=12345678

ssid3=frexboxmachin
pass3=12345678

ssid4=frexboxmachin
pass4=12345678

ssid5=frexboxmachin
pass5=12345678

Utilisation du répertoire projet

See also

SITE DE RESSOURCES GITHUB

arduino-esp32fs-plugin 4 supporte les 3 files system

Voir dans ESP32 Wifi Manager Template

Le fichier se nomme credentials.ini

Mais pourquoi ne pas les mettre dans un fichier .h (cela obligerait à recompiler alors qu’avec cette version on peut envisager de changer le contenu au travers d’une interface web par exemple).

  • les lignes vides sont obligatoires

  • Les chaines de caractères avant le symbol = peuvent être quelconques

  • on peut ajouter des espaces de part et d’autre du sing =

Utilisation

Donc pour que cela fonctionne, il faut : un fichier credentials.ini (attention au s !) donc un file system fonctionnel.

Dans le code:

#define DEBUG_PORT Serial
#define CREDENTIAL_FILE_PATH "/credentials.ini"

class Credentials{
    public:
        String ssid;
        String passwd;

};

#define MAX_LINE_LENGTH 100
#define MAX_NUMBERS_OF_SSID 5
#define MAX_RETRY 10 //ie 30s (60*0.5)

/** @todo confirm below values */
#define SSID_MIN_LENGTH 2
#define SSID_MAX_LENGTH 32
#define PASS_MIN_LENGTH 8
#define PASS_MAX_LENGTH 64

enum Error { NOERROR, ERROR, TWO_MANY_SSID, SSID_INCORRECT_LENGTH, PASS_INCORRECT_LENGTH }; /** @todo add error codes */

Credentials cretab[MAX_NUMBERS_OF_SSID];

Et les fonctions:

Error readCredentials(fs::FS &fs, Credentials *credTab, const char * path, int &nbr );
String readALigne( const File file );

Dans le setup, il faut ensuite peupler le tableau des credentials:

if (readCredentials(SPIFFS, cretab, CREDENTIAL_FILE_PATH, nbrOfReadSsid ) ){
    DEBUG_PORT.println("Reading ssid error ! Aborted!");
    return;
}

Puis il faut essayer les ssid un à un, c’est le rôle de la portion de code suivant:

int nbrOfReadSsid = 0;

//..

DEBUG_PORT.println("Try to connect:");
int retryCounter;
for ( int i =0; i< nbrOfReadSsid; i++ ){
    DEBUG_PORT.print( "To : " + cretab[i].ssid + " ");
    WiFi.begin(cretab[i].ssid.c_str(), cretab[i].passwd.c_str());
    retryCounter = 0;
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        retryCounter++;
        DEBUG_PORT.print(".");
        if (retryCounter >= MAX_RETRY){
            DEBUG_PORT.println();
            break;
        }
    }
    if (WiFi.status() == WL_CONNECTED){
        break;
    }
}

On peut également afficher la liste des ssid, mais ce n’est pas obligatoire:

DEBUG_PORT.println("\nSSID liste:\n");
/** @todo improve error handling */
for ( int i =0; i< nbrOfReadSsid; i++ ){
    DEBUG_PORT.println( cretab[i].ssid );
}
DEBUG_PORT.println();