Template : ESP32 Credential In a File¶
- Auteur
J.Soranzo
- Association
Bricolab
- Entity
- dépôt Bitbucket des sources 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
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();