++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Template : ESP32 Credential In a File ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .. include:: idBlock.rst :Dépôt BitBucket du code: https://bitbucket.org/myarduinotemplates/esp32credentialsinfile :Création: 06/2024 :Maj: 06/2024 .. _refESP32CredentialInAFile: ==================================================================================================== 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: .. SEEALSO:: **SITE DE RESSOURCES GITHUB** :class: without-title `Credentials manager for Arduino-based projects using EEPROM`_ from RoboticSolutionsBO .. _`Credentials manager for Arduino-based projects using EEPROM` : https://github.com/RoboticSolutionsBO/Credentials/tree/main .. SEEALSO:: **SITE D'AIDE ARDUINO.CC** :class: without-title `CredentialManager`_ 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. .. _`CredentialManager` : https://www.arduino.cc/reference/en/libraries/credentialmanager/ 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 .. index:: pair: Arduino; Data upload plugin .. SEEALSO:: **SITE DE RESSOURCES GITHUB** :class: without-title `arduino-esp32fs-plugin`_ supporte les 3 files system .. _`arduino-esp32fs-plugin` : https://github.com/lorol/arduino-esp32fs-plugin Voir dans :ref:`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: .. code:: cpp #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: .. code:: cpp 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: .. code:: cpp 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: .. code:: cpp 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: .. code:: cpp 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(); ==================================================================================================== Weblinks ==================================================================================================== .. target-notes::