Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
RMS_Router_V15_09
#1
Bonjour André et Serge19 
Bon j'ai regarde mon code avec enregistrement en EEPROM du WPS. Je suis pas du tout un expert en programmation C.
Donc j'ai bien compris la remarque de Serge qui était très pertinente, et oui c'était pas propre du tout. Alors je me suis penché dessus et voila m'a solution. Je précise que cela marche avec un ESP32 vierge comme avec un ESSP32 déjà programmer.
 Résultat après compilation:
[*]Original : 1761343 octets (flash), 91988 octets (RAM)
[*]Modifié : 1761423 octets (flash), 91988 octets (RAM)

[*]Différence en flash : +80 octets.
[*]Différence en RAM : 0 octet.
[*]Voici ce que j'ai modifier en bleu :
case ARDUINO_EVENT_WIFI_STA_CONNECTED:                   //SR19
      TelnetPrintln("WiFi Reconnecté en Mode Station");  //SR19
     
ssid = WiFi.SSID();                                // met à jour le SSID global
      password = WiFi.psk();                             // met à jour le mot de passe global
      password.trim();                                   // supprime espaces et caractères indésirables (dont \n, \r, \t)
      EcritureEnROM();      
                            // sauvegarde dans l’EEPROM
      break;                                             //SR19
    default:                                             //SR19
      break;                                             //SR19

[*]Je pense que c'est propre, la procédure pour avoir une récupération du SSID et PASS est la même qu'André préconise:
[*]1) Déconnecter le routeur.
[*]2) Activer le wps de la box.
[*]3) Reconnecter le Routeur.
[*]Merci vraiment beaucoup à vous deux.
[*]Alain H

[*]    
Répondre
#2
Merci
Je mets vos lignes ajoutées dans la version 15.10

André
Répondre
#3
Bonsoir André et Alain_H,

Juste un détail concernant la sauvegarde en EEPROM après l’utilisation du WPS : j'ai testé et j'obtiens le même résultat en déplaçant la fonction EcritureEnROM() comme ci-dessous.

Un autre point de détail : l’emplacement proposé par Alain_H pour la sauvegarde en EEPROM entraîne deux écritures successives. Or, le nombre de cycles d’écriture en EEPROM est forcément limité — même si je n’ai pas vérifié la limite dans le datasheet de l’ESP32.


case ARDUINO_EVENT_WIFI_STA_GOT_IP:                                                            //SR19
      TelnetPrintln("WiFi : " + String(WiFi.SSID()) + " connecté via WPS!");                  //SR19
      ssid = (WiFi.SSID());                                                                   //Récup ssid   //SR19
      TelnetPrintln("Récupération IP de " + hostname + " -> " + (WiFi.localIP().toString()));  //SR19
      TelnetPrintln("Récupération password -> " + String(WiFi.psk()));                       //SR19
      password = (WiFi.psk());                                                              //Récup password     //SR19
      isGOT_IP = true; /*IP reçue*/                                                         //SR19
      EcritureEnROM(); // sauvegarde dans l’EEPROM 
      break;                                                          
Répondre
#4
(01-10-2025, 12:22 AM)Serge19 a écrit : Bonsoir André et Alain_H,

Juste un détail concernant la sauvegarde en EEPROM après l’utilisation du WPS : j'ai testé et j'obtiens le même résultat en déplaçant la fonction EcritureEnROM() comme ci-dessous.

Un autre point de détail : l’emplacement proposé par Alain_H pour la sauvegarde en EEPROM entraîne deux écritures successives. Or, le nombre de cycles d’écriture en EEPROM est forcément limité — même si je n’ai pas vérifié la limite dans le datasheet de l’ESP32.


case ARDUINO_EVENT_WIFI_STA_GOT_IP:                                                            //SR19
      TelnetPrintln("WiFi : " + String(WiFi.SSID()) + " connecté via WPS!");                  //SR19
      ssid = (WiFi.SSID());                                                                   //Récup ssid   //SR19
      TelnetPrintln("Récupération IP de " + hostname + " -> " + (WiFi.localIP().toString()));  //SR19
      TelnetPrintln("Récupération password -> " + String(WiFi.psk()));                       //SR19
      password = (WiFi.psk());                                                              //Récup password     //SR19
      isGOT_IP = true; /*IP reçue*/                                                         //SR19
      EcritureEnROM(); // sauvegarde dans l’EEPROM 
      break;                                                          
Bonjour Serge19,

J'ai regardé la durée de vie d'une EEPROM entre 10000 et 100000 cycles
si on fait un changement de SSID et PASSWORD de sa box tous les jours cela correspondrais à:
Endurance typique de la flash (l’“EEPROM” de l’ESP32 est en fait de la flash)
  • Typique : ~10 000 cycles (souvent plus, selon la puce).
et une écriture par jour cela donnerai:
  • 10 000 cycles ⇒ 10 000 jours ≈ 27 ans
  • 100 000 cycles ⇒ 100 000 jours ≈ 274 ans
Il y aura longtemps que L'esp32 sera HS.
Merci et très bonne remarque je m'en suis vraiment soucié.
Si cela cause vraiment un gros problème alors peut être regardé sur EEPROM la concordance entre le mot de passe en EEPROM et le SSID et PASS reçu, le seul défaut dans cette approche c'est que le password reçu est en PSK et donc une suite Hexadécimale et que si le passe est écris en dur (le vrai mot de passe de la box) automatiquement il en conclura que l'on peut l'écrire en EEPROM. Après il est vrai que en déplaçant l'écriture en case GOT_IP on as récupéré l'adresse IP, c'est surement mieux j'avais password.trim(); pour nettoyer le mot de passe de caractères parasite car j'ai eu le soucis et pas tout le temps.
Dans ta mdification cela n'écris qu'une ligne de code et c'est super, mais j'ajouterai password.trim() pour la sécurité. Tu peut voir avec André pour ta modification, car il m'a dis qu'il mettrais ça en version 15.10.
Merci à toi.
Répondre
#5
(01-10-2025, 02:17 PM)Alain H a écrit :
(01-10-2025, 12:22 AM)Serge19 a écrit : Bonsoir André et Alain_H,

Juste un détail concernant la sauvegarde en EEPROM après l’utilisation du WPS : j'ai testé et j'obtiens le même résultat en déplaçant la fonction EcritureEnROM() comme ci-dessous.

Un autre point de détail : l’emplacement proposé par Alain_H pour la sauvegarde en EEPROM entraîne deux écritures successives. Or, le nombre de cycles d’écriture en EEPROM est forcément limité — même si je n’ai pas vérifié la limite dans le datasheet de l’ESP32.


case ARDUINO_EVENT_WIFI_STA_GOT_IP:                                                            //SR19
      TelnetPrintln("WiFi : " + String(WiFi.SSID()) + " connecté via WPS!");                  //SR19
      ssid = (WiFi.SSID());                                                                   //Récup ssid   //SR19
      TelnetPrintln("Récupération IP de " + hostname + " -> " + (WiFi.localIP().toString()));  //SR19
      TelnetPrintln("Récupération password -> " + String(WiFi.psk()));                       //SR19
      password = (WiFi.psk());                                                              //Récup password     //SR19
      isGOT_IP = true; /*IP reçue*/                                                         //SR19
      EcritureEnROM(); // sauvegarde dans l’EEPROM 
      break;                                                          
Bonjour Serge19,

J'ai regardé la durée de vie d'une EEPROM entre 10000 et 100000 cycles
si on fait un changement de SSID et PASSWORD de sa box tous les jours cela correspondrais à:
Endurance typique de la flash (l’“EEPROM” de l’ESP32 est en fait de la flash)
  • Typique : ~10 000 cycles (souvent plus, selon la puce).
et une écriture par jour cela donnerai:
  • 10 000 cycles ⇒ 10 000 jours ≈ 27 ans
  • 100 000 cycles ⇒ 100 000 jours ≈ 274 ans
Il y aura longtemps que L'esp32 sera HS.
Merci et très bonne remarque je m'en suis vraiment soucié.
Si cela cause vraiment un gros problème alors peut être regardé sur EEPROM la concordance entre le mot de passe en EEPROM et le SSID et PASS reçu, le seul défaut dans cette approche c'est que le password reçu est en PSK et donc une suite Hexadécimale et que si le passe est écris en dur (le vrai mot de passe de la box) automatiquement il en conclura que l'on peut l'écrire en EEPROM. Après il est vrai que en déplaçant l'écriture en case GOT_IP on as récupéré l'adresse IP, c'est surement mieux  j'avais password.trim(); pour nettoyer le mot de passe de caractères parasite car j'ai eu le soucis et pas tout le temps.
Dans ta mdification cela n'écris qu'une ligne de code et c'est super, mais j'ajouterai password.trim() pour la sécurité. Tu peut voir avec André pour ta modification, car il m'a dis qu'il mettrais ça en version 15.10.
Merci à toi.

Bonsoir Alain_H,

Il est important de souligner la prudence nécessaire dans la gestion des écritures en EEPROM. Imaginez qu’une instruction d’écriture soit mal positionnée dans le code, et qu’en raison d’un bug non anticipé, elle se mette à s’exécuter en boucle, jusqu’à une centaine de fois par seconde (ce qui est théoriquement possible avec un intervalle minimal de 10 ms entre deux écritures).
Sans surveillance, si une telle situation dure seulement une heure, on pourrait rapidement atteindre :
60 minutes × 60 secondes × 100 écritures = 360 000 écritures!

Concernant password.trim(), si vous avez rencontré des pb, c'est vrai que c'est une sécurité qui peut être rajoutée sans surcharger le code.
Répondre
#6
Cette dernière version avec le password.trim(); est en V15.10 non distribué pour l'instant.
André
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)