Arduino-esp32: La reconnexion automatique du WiFi ne fonctionne toujours pas - Existe-t-il une meilleure pratique pour garantir la connexion?

Créé le 21 sept. 2017  ·  150Commentaires  ·  Source: espressif/arduino-esp32

Carte: Module de développement ModeMCU ESP32
Installation du noyau / date de mise à jour: 15 / sept. / 2017
Nom IDE: Arduino IDE

Il semble qu'il n'y ait pas de logique de reconnexion automatique permettant à l'ESP32 de se reconnecter lorsque la connexion tombe ou si elle ne fonctionne pas correctement. J'ai eu des résultats complètement aléatoires avec ma carte ESP32, parfois elle dure aussi peu que 30 minutes et tout au plus 18 à 20 heures. Le WiFi est en baisse et ne veut pas se reconnecter.

La bibliothèque que j'utilise pour le WiFi regarde l'événement WiFi et lors d'une déconnexion, elle essaie de se reconnecter, ce qui aide mais parfois elle échoue à la reconnexion et puis c'est tout ... Je dois redémarrer. Il n'y a pas du tout de mode veille / faible consommation et l'appareil est constamment alimenté par 3,3 V po. Une affaire a été ouverte à ce sujet, https://github.com/espressif/arduino-esp32/issues/353 , mais son fermé sans réponse réelle (dit que la connexion automatique est en quelque sorte implémentée ... je ne sais pas ce que cela signifie).

Je suppose que la question se résume à la reconnexion automatique implémentée dans le code lui-même, de manière fiable, et sinon quel est le meilleur moyen de code Arduino de s'assurer qu'il est connecté?

-Allan

bug

Commentaire le plus utile

METTRE À JOUR; Je vois beaucoup de WiFiEvent utilisé et pour le débogage, mais pour simplement détecter le wifi en panne et reconnecter l'IF / ELSE ci-dessous fonctionne de manière fiable à chaque fois.

cela fonctionne car il faut environ 18 secondes entre le début et le signalement du changement WL_CONNECTED, ce qui donne au serveur DHCP le temps de libérer l'adresse IP pour une reconnexion fiable plus tard.

Cela fonctionne depuis plus de 6 ans et ça compte.

loop()
{
  if ( WiFi.status() ==  WL_CONNECTED ) 
  {
    // WiFi is UP,  do what ever
  } else
  {
    // wifi down, reconnect here
   WiFi.begin(  );
    int WLcount = 0;
    while (WiFi.status() != WL_CONNECTED && WLcount < 200 ) 
    {
      delay( 100 );
         Serial.printf(".");
         if (UpCount >= 60)  // just keep terminal from scrolling sideways
         {
            UpCount = 0;
               Serial.printf("\n");
         }
         ++UpCount;
      ++WLcount;
    }
  }
} // END loop()

jetez un œil au code squelette que j'ai posté sur https://github.com/espressif/arduino-esp32/issues/1100

même si c'était pour la configuration avec SmartConfig, cela fonctionne.

Tous les 150 commentaires

pouvez-vous s'il vous plaît activer le débogage dans le menu du tableau et voir pourquoi il ne veut pas se reconnecter lorsque vous lui dites de le faire?

Je peux essayer ça ce soir. Le code Arduino est assez basique, regardant l'événement WiFi et a ensuite ceci:

case SYSTEM_EVENT_STA_DISCONNECTED:
    Serial.println("WiFi lost connection.  Attempting to reconnect...");
    WiFi.reconnect();
    break;

Mais ne devrait-il pas y avoir quelque chose qui puisse être appelé pour que cela se produise tout seul?

Juste pour une solution rapide:
Démarrez une minuterie dans le SYSTEM_EVENT_STA_DISCONNECTED qui appelle le WiFi.reconnect (); et arrêtez-le dans SYSTEM_EVENT_STA_CONNECTED. Le principal problème vient de votre idée est que si le périphérique ne peut pas se connecter, l'événement SYSTEM_EVENT_STA_DISCONNECTED n'est pas appelé, donc il ne tentera plus jamais de se reconnecter.

Malheureusement, j'adapte la bibliothèque de quelqu'un d'autre et je ne suis pas très familier avec C ++ mais je vais voir ce que je peux faire pour ajouter une minuterie (je connais VB.net ... je peux au moins comprendre les parties logiques et j'espère adapter).

Mais je pense que vous avez raison de ne pas se reconnecter ou, mieux encore, d'essayer uniquement une déconnexion qui, si elle échoue, abandonne une seule fois. L'activation du débogage pourrait me montrer que je vais donc commencer par là.

Mais revenons à la question initiale et au problème précédemment clos: cette fonctionnalité n'est-elle pas intégrée? Et si ce n'est pas le cas, pourquoi le numéro précédent a-t-il été classé "en quelque sorte"? Sinon, le sera-t-il également?

J'ai commuté le niveau de débogage sur le débogage et ouvert le moniteur série et je l'ai répété encore et encore:

[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...

J'ai vérifié la dernière fois qu'il a envoyé des données à un autre contrôleur et c'était il y a plus de 24 heures, donc je suppose qu'il est bloqué dans ce mode. Je l'ai donc éteint et sauvegardé, il s'est connecté au WiFi très bien et j'ai transmis les données comme il se doit pendant environ 2 heures cette fois. Puis, sans aucun autre message, il s'est déconnecté et a commencé avec le même message encore et encore. Je l'ai laissé aller pendant une heure, j'ai redémarré le contrôleur et il est à nouveau connecté, mais je suis sûr que ce n'est qu'une question de temps avant qu'il ne recommence.

La première question est donc de savoir comment résoudre ce problème. Deuxièmement, cela m'amène toujours à mes questions précédentes sur la reconnexion automatique

Les gars, veuillez activer le débogage afin que vous puissiez voir une sortie d'état WiFi plus détaillée:
screen shot 2017-09-22 at 13 48 16

J'utilise le code suivant pour vérifier si mon appareil est toujours connecté au STA (appelez-le à partir de loop ()). Vous avez eu l'idée? wifi_is_connected est un global qui est défini et réinitialisé lors du rappel d'événement wifi.

static void poll_watchdog_sta(void) {
  static uint32_t ms = millis();
  static uint8_t watchdog = 0;

  // watch out for STA disconnects and reboot if
  // connection cannot be reestablished after
  // X minutes

  // this watchdog MUST NOT reboot the device if
  // wifi is not enabled or never was connected
  // since last reboot

  if (wifi_is_enabled && watchdog_enabled && ((millis() - ms) > 1000 * 6)) {
    ms = millis();

    if (!wifi_is_connected) {
      if (++watchdog < watchdog_timeout * 10) { // timeout in minutes ( * 10 )
        if (watchdog == 1) {
          log_print(F("WIFI: arming network watchdog (reboot in %i min.)"),
            watchdog_timeout
          );
        }
      } else {
        log_print(F("WIFI: still not connected, triggering reboot ..."));
        system_reboot();
      }
    } else {
      if (watchdog) {
        log_print(F("WIFI: network is back, disarming watchdog"));
        watchdog = 0;
      }
    }
  }
}

Oui, je ne vois pas de Loop () dans la bibliothèque que j'utilise pour le WiFi (encore une fois, un tiers) mais je comprends ce que vous faites et je peux fonctionner avec.

Je vais activer la journalisation détaillée et voir si j'obtiens plus d'informations avant de changer quoi que ce soit.

Les événements WiFi qui sont également vérifiés et traités sont SYSTEM_EVENT_STA_GOT_IP, SYSTEM_EVENT_STA_DISCONNECTED, SYSTEM_EVENT_STA_START et SYSTEM_EVENT_STA_CONNECTED. Il y en a plus cependant sur https://github.com/espressif/esp-idf/blob/master/components/esp32/include/esp_event.h donc j'ai ajouté un défaut: au commutateur qui devrait imprimer l'événement pour voir si la bibliothèque obtient quelque chose mais n'agit pas en conséquence.

J'ai vu dans la bibliothèque que j'utilise un //WiFi.setAutoReconnect(true); donc je suppose que l'auteur original a essayé d'utiliser la reconnexion automatique mais cela ne fonctionnait pas, alors l'a commenté?

@ me-no-dev - Verbose a donné une bien meilleure explication. Eh bien ... peut-être pour vous:

Tout allait bien puis cela s'est répété encore et encore, peut-être 150 fois:

[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113

Suivi par ceci:

[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 202 - ASSOC_FAIL
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5

La dernière partie (reconnexion, événement 5, raison 2) se répète toutes les 4 à 5 secondes.

Sur la base de cette première erreur qui se répète encore et encore, j'ai trouvé ceci: https://github.com/espressif/arduino-esp32/issues/180. Vous y avez dit "Essayez de vider le client ou de lire toutes les données disponibles.". Comment pourrais-je faire ça? Je regarde la bibliothèque que j'utilise et voici ce qu'ils ont pour attraper l'événement WiFi:

//**************************************************************************************
/// Event Handler for ESP32 WiFi Events (needed to implement reconnect logic for now...)
//**************************************************************************************
    void MyESP32WiFi::WiFiEvent(WiFiEvent_t event)
    {
        Serial.printf("[WiFi-event] event: %d\n", event);

        switch (event) {
        case SYSTEM_EVENT_STA_GOT_IP:
            Serial.println("WiFi connected");
            Serial.println("IP address: ");
            Serial.println(WiFi.localIP());
            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            Serial.println("WiFi lost connection.  Attempting to reconnect...");
            WiFi.reconnect();
            break;
        case SYSTEM_EVENT_STA_START:
            Serial.println("ESP32 station start");
            break;
        case SYSTEM_EVENT_STA_CONNECTED:
            Serial.println("ESP32 station connected to AP");
            break;
        default:            
            Serial.println("Unhandled WiFi Event raised.");
            break;
        }

    }

Sur la base des erreurs du post précédent, j'obtiens le "5" qui se traduit par une perte de connexion WiFi, puis le code essaie d'exécuter "WiFi.reconnect ();" mais son évidemment ne fonctionne pas. Dois-je avoir autre chose là-bas? Peut-être un compteur un peu comme l'exemple @everslick mais plus simple (juste ai = i + 1) et s'il se retrouve au même endroit après 20 essais, il redémarre? Ou cela ne devrait-il pas se produire / être évité en premier lieu?

Essayez d'appeler WiFi.begin () au lieu de vous reconnecter et de faire un rapport :)

@ me-no-dev - Je l'ai changé en WiFi.begin () au lieu de WiFi.reconnect () mais cela n'a pas aidé. J'ai travaillé pendant environ une heure, puis j'ai obtenu la ligne lwip_connect_r: 113, chacune à environ une minute d'intervalle, suivie d'une déconnexion toutes les 5 secondes environ:

[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE

Et puis les 4 lignes se répètent indéfiniment jusqu'à ce que le contrôle soit redémarré. Que puis-je essayer d'autre? Le fait que @everslick redémarre le contrôleur lorsqu'il est dans le même état déconnecté est inquiétant ... Je pense que le redémarrage est la dernière option et que quelque chose peut être fait pour le garder en ligne.

En remarque, deux ESP8266 connectés au même routeur (Netgear R8000) n'ont aucun problème et sont stables depuis plus d'un mois sans déconnexion.

hmmm .... cela semble être un problème dans la pile inférieure ou dans votre routeur.
vous pouvez voir que la première raison est NOT_ASSOCED et ensuite vous obtenez AUTH_EXPIRE.
pourriez-vous peut-être éteindre le STA puis le rallumer? La cause de déconnexion me fait penser que quelque chose dans la demande de re-assoc n'est pas changé ou que votre routeur n'accepte pas, donc il vous refuse de vous reconnecter. Je vais voir si je peux soulever un problème interne à ce sujet. Quelle est la version du micrologiciel du routeur que vous utilisez?

C'est un Netgear Nighthawk R8000. Actuellement sur le dernier firmware V1.0.3.54_1.1.37 bien qu'il l'ait fait sur la dernière version également. J'ai 20 à 25 appareils connectés à tout moment sans problème, y compris les deux ESP8266 mentionnés précédemment.

Je vais essayer de remplacer la ligne de démarrage / reconnexion Wi-Fi avec le STA éteint et allumé et voir ce qui se passe.

Edit: Ne sachant pas grand-chose à ce sujet et en utilisant la bibliothèque de quelqu'un d'autre .... comment "éteindre le STA puis le rallumer"?

Deuxième édition: cela ne pouvait pas être lié à https://github.com/espressif/esp-idf/issues/499#issuecomment -314262611, n'est-ce pas? Une des seules choses que j'ai vues avec les mêmes NOT_ASSOCED et AUTH_EXPIRE. Je ne le penserais pas uniquement parce que je me suis compilé sans les trucs BLE mais je ne sais jamais.

J'ai également alerté l'équipe wifi :) on verra si quelque chose sort de ça

Merci. Dois-je essayer de faire le STA par intermittence? Si oui, pouvez-vous me guider ou me diriger dans la bonne direction?

J'ai également vu ceci: https://github.com/espressif/esp-idf/issues/738#issuecomment -311626685 qui indique que je ne peux pas appeler WiFi.connect ou WiFi.Begin depuis le gestionnaire d'événements? Cela pourrait-il aussi être mon problème? @rojer ?

J'ai donc acheté un deuxième ESP32, le même, pour essayer de m'assurer que ce n'est pas un problème matériel. J'ai recompilé le firmware hier soir à partir d'une nouvelle puce de github (https://nodemcu.readthedocs.io/en/dev-esp32/en/build/) et j'ai flashé à la fois la nouvelle puce et l'ancienne. J'ai également flashé les deux avec exactement le même croquis. L'original est dans mon garage, un peu à l'écart de mon routeur, et l'autre test est dans mon salon où le WiFi est beaucoup plus puissant. Les deux ont un moniteur série fonctionnant sur un PC connecté avec un ensemble détaillé. Je rapporterai tout ce que je trouve.

Avec ce qui précède, y a-t-il autre chose que je puisse essayer? Comment puis-je éteindre et rallumer le STA? Cela peut-il être fait dans la partie STA_Disconnect où se trouve WiFi.reconnect?

Eh bien, cela n'a pas duré longtemps ... J'ai le même problème avec le nouveau. D'abord l'original a commencé avec la même erreur "[E] [WiFiClient. Cpp : 97 ] connect (): lwip_connect_r: 113" et n'a pas envoyé de données après à peine 30 minutes en ligne. Habituellement obtenu cette erreur deux à la fois avec environ 5 ou 6 secondes entre puis 45 à 50 secondes entre le prochain set mais encore une fois un peu aléatoire. J'ai fait cela pendant environ 10 minutes, puis est entré dans le même schéma de déconnexion:


[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
Data: Sending: temperature1 -49.02
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
Data: Sending: humidity1 -5.02
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 202 - ASSOC_FAIL
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5

Et répété les 4 dernières lignes encore et encore. À un moment donné, il a fait quelque chose de différent ... le message d'erreur a légèrement changé:

[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
Data: Sending: temperature2 -1.00
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
Data: Sending: humidity2 -1.00
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5

Remarquez que l'erreur est passée à la fin de 118 par opposition à 113. Mais à partir de ce moment, il a simplement répété l'erreur 118 de manière aléatoire avec STA_DISCONNECTED et AUTH_EXPIRED encore et encore.

Ensuite, le nouvel ESP32 a commencé à faire exactement la même chose. principalement 113 erreur puis le même modèle de NOT_ASSOCED, ASSOC_FAIL et AUTH_EXPIRE suivi par juste la déconnexion et AUTH_EXPIRE encore et encore.

Ils ont échoué à des moments différents, à 25 minutes d'intervalle, alors qu'ils étaient démarrés exactement au même moment. Le signal WiFi ne semble pas être un facteur, ni aucune synchronisation.

Edit: Juste pour être clair lors d'un redémarrage, il se connecte instantanément au premier essai à chaque fois:

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371 
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0010,len:4
load:0x3fff0014,len:708
load:0x40078000,len:0
load:0x40078000,len:11460
entry 0x400789f4
Everything: init started
Everything: Free RAM = -1
Disabling ESP32 WiFi Access Point
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 2 - STA_START
[WiFi-event] event: 2
Initializing ESP32 WiFi network.  Please be patient...
ESP32 station start
Attempting to connect to WPA SSID: (SSIDRemoved)
..[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 4 - STA_CONNECTED
[WiFi-event] event: 4
ESP32 station connected to AP
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 7 - STA_GOT_IP
[WiFi-event] event: 7
WiFi connected
IP address: 
192.168.xx.xx

En attente de réponse de l'équipe WiFi. Fera un peu plus de bruit car cela me gêne aussi. Le problème est quelque part en dessous d'Arduino et dans la bibliothèque wifi à source fermée.

Merci. Je vais essayer d'ajouter un compteur à l'instruction de commutation d'événement STA_DISCONNECTED que je continue à obtenir et après 5 essayez de redémarrer le wifi et après 10 redémarrer le contrôleur et lors d'une connexion réinitialiser le compteur à 0, voir si cela à le moins maintient le contrôleur en place.

S'il y a autre chose que je peux vous fournir pour vous aider à corriger ce code ou à essayer, veuillez me le faire savoir. Si cela compte, l'ESP32 que j'utilise est utilisé pour deux entrées de tension, une entrée binaire et un DTH22 (température + humidité), alors ces données sont envoyées à un contrôleur via HTTP.

Salut @vseven , je ne peux tout simplement pas reproduire ce problème moi-même, pourriez-vous me faire part de la version du firmware du WiFi? Vous pouvez obtenir si à partir du journal de démarrage, cela ressemble à "I (588) wifi: version du firmware wifi: 2cd69aa", alors je peux vous fournir une version de débogage wifi lib pour déboguer ce problème.

@vseven pouvez-vous me faire part de la logique de reconnexion WiFi? Je veux dire quand appeler esp_wifi_connect ()? Ce sera utile si vous pouvez coller la logique d'implémentation.

La journalisation wifi
@vseven commente cette ligne pour qu'elle s'affiche

Ok, j'ai commenté cette ligne et recompilé. Je ferai rapport. En passant, j'ai essayé d'ajouter un compteur pour se reconnecter en rappelant mon init () mais cela n'a rien fait ... c'était comme si init () n'avait jamais été appelé. Je fais peut-être mal cependant. Mais lorsque le compteur est arrivé à 10, l'ESP.restart a été appelé et redémarré correctement, puis il s'est reconnecté:

    void SmartThingsESP32WiFi::WiFiEvent(WiFiEvent_t event)
    {
        Serial.printf("[WiFi-event] event: %d\n", event);
        switch (event) {
        case SYSTEM_EVENT_STA_GOT_IP:
            Serial.println("WiFi connected");
            Serial.println("IP address: ");
            Serial.println(WiFi.localIP());
            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            Serial.println("WiFi lost connection.  Attempting to reconnect...");
            WiFi.reconnect();
            disconnectCounter++;
            if (disconnectCounter > 5) {
                Serial.println("We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...");
                void init();
            }
            if (disconnectCounter > 10) {
                Serial.println("We have recieved the STA_DISCONNECTED event 10 times now.  Reboot...");
                ESP.restart();
            }
            break;
        case SYSTEM_EVENT_STA_START:
            Serial.println("ESP32 station start");
            break;
        case SYSTEM_EVENT_STA_CONNECTED:
            Serial.println("ESP32 station connected to AP");
            disconnectCounter = 0;
            break;
        }
    }

@liuzfesp - voici les informations supplémentaires avec cette ligne commentée:

I (243) wifi: wifi firmware version: c1b8a2f
I (243) wifi: config NVS flash: enabled
I (243) wifi: config nano formating: disabled
I (257) wifi: Init dynamic tx buffer num: 32
I (257) wifi: Init data frame dynamic rx buffer num: 64
I (257) wifi: Init management frame dynamic rx buffer num: 64
I (261) wifi: wifi driver task: 3ffd0d8c, prio:23, stack:4096
I (267) wifi: Init static rx buffer num: 10
I (270) wifi: Init dynamic rx buffer num: 0
I (274) wifi: Init rx ampdu len mblock:7
I (278) wifi: Init lldesc rx ampdu entry mblock:4
I (282) wifi: wifi power manager task: 0x3ffd60f0 prio: 21 stack: 2560
I (290) wifi: wifi timer task: 3ffd7148, prio:22, stack:3584
I (314) wifi: mode : null
Disabling ESP32 WiFi Access Point

I (815) wifi: Init Ampdu: 1 tx baw=6 rx baw=6
I (815) wifi: mode : sta (30:ae:a4:25:78:64)
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 2 - STA_START

Initializing ESP32 WiFi network.  Please be patient...
[WiFi-event] event: 2
ESP32 station start
Attempting to connect to WPA SSID: (SSIDREMOVED)
.I (1946) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
.I (2603) wifi: state: init -> auth (b0)
I (2605) wifi: state: auth -> assoc (0)
I (2612) wifi: state: assoc -> run (10)
I (2670) wifi: connected with (SSIDREMOVED), channel 1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 4 - STA_CONNECTED
[WiFi-event] event: 4
ESP32 station connected to AP
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 7 - STA_GOT_IP
[WiFi-event] event: 7
WiFi connected

Et les fichiers que j'utilise (avant d'ajouter le compteur de déconnexion):

SmartThingsESP32WiFi.h.txt
SmartThingsESP32WiFi.cpp.txt

@liuzfesp - Donc, il a fait la même chose avec le débogage activé, j'espère que quelque chose ici vous dira quelque chose. Il a bien fonctionné pendant une heure environ, puis a commencé à lancer l'erreur 113 au hasard. Après environ 15 minutes d'erreurs aléatoires 113 entre les routines d'envoi de données réelles, il a fait ceci:

I (5427111) wifi: state: run -> auth (7c0)
I (5427111) wifi: pm stop, total sleep time: 0/1119534452

I (5427111) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5427133) wifi: state: auth -> init (0)
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 202 - ASSOC_FAIL
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5427276) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5427276) wifi: state: init -> auth (b0)
I (5428276) wifi: state: auth -> init (2)
I (5428277) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5428413) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5428414) wifi: state: init -> auth (b0)
I (5429414) wifi: state: auth -> init (2)
I (5429414) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5429551) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5429551) wifi: state: init -> auth (b0)
I (5430551) wifi: state: auth -> init (2)
I (5430551) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5430688) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5430688) wifi: state: init -> auth (b0)
I (5431689) wifi: state: auth -> init (2)
I (5431689) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5431826) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5431826) wifi: state: init -> auth (b0)
I (5432826) wifi: state: auth -> init (2)
I (5432826) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5432963) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5432963) wifi: state: init -> auth (b0)
I (5433964) wifi: state: auth -> init (2)
I (5433964) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5434100) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5434101) wifi: state: init -> auth (b0)
I (5435101) wifi: state: auth -> init (2)
I (5435101) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5435238) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5435238) wifi: state: init -> auth (b0)
I (5436238) wifi: state: auth -> init (2)
I (5436239) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5436375) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5436376) wifi: state: init -> auth (b0)
I (5437376) wifi: state: auth -> init (2)
I (5437376) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
We have recieved the STA_DISCONNECTED event 10 times now.  Reboot...
I (5437405) wifi: flush txq
I (5437407) wifi: stop sw txq
I (5437410) wifi: lmac stop hw txq
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

Donc, pour chaque STA_DISCONNECT, il a essayé d'appeler WiFi.reconnect sans succès apparent, puis il a essayé d'exécuter init () après plus de 5 déconnexions, ce qui n'a pas non plus aidé, puis une fois qu'il a atteint 10 déconnexions, il a redémarré, ce qui a redémarré et reconnecté.

J'ai fait fonctionner le moniteur série sur mon ESP32 tout le week-end et il a redémarré environ 10 fois entre 18 heures le vendredi soir et 21 heures le dimanche soir. À chaque fois, c'était exactement comme les journaux ci-dessus.

@ me-no-dev - pouvez-vous me guider de manière à simplement éteindre et rallumer le STA pour voir si cela fonctionne également pour la reconnexion et je peux essayer cela après 5 tentatives infructueuses? Le redémarrage après 10 fonctionne mais je prévois de l'utiliser pour contrôler l'éclairage RVB et je ne veux vraiment pas que les lumières s'éteignent et s'allument.

@liuzfesp - Y a-t-il autre chose que je peux vous fournir pour le débogage? Ou tout ce que je peux essayer?

Les mises à jour? Vous avez toujours des déconnexions constantes avec les deux appareils.

@liuzfesp des nouvelles ici?

Je vois qu'il y a des changements de code avec Bluetooth et WiFi. Je ne sais pas si tout cela va m'aider ou non. Je continue à avoir les mêmes problèmes et le redémarrage fonctionne pour que mes données restent transmises, mais je n'ai pas été en mesure de l'utiliser pour le contrôle de la bande lumineuse RVB car les lumières s'éteignaient constamment au redémarrage.

@liuzfesp - Y a-t-il quelque chose dans les journaux qui aide ou quoi que ce soit d'autre que je peux fournir ou essayer?

J'ai nettoyé certaines choses, je me suis assuré que dans mon code il n'y avait rien de retard ou de blocage, et j'ai maintenant moins d'erreurs (ne voyez pas les erreurs 113 et 118) mais j'ai toujours le même problème de déconnexion et cela semble directement lié au WiFi essayant de s'authentifier (renouveler?) Et échouant. Voici une nouvelle capture de ce week-end où je l'ai fait redémarrer environ 5 fois en 24 heures. Encore une fois, même chose sur deux ESP32 différents, je cherche la déconnexion (événement 5) et j'essaie de me reconnecter avec un WiFi.reconnect et un WiFi.begin tous les deux sans chance, donc après 10 essais, il redémarre et se connecte bien après:

I (1903652) wifi: active cnt: 5
I (1913652) wifi: active cnt: 5
I (1923652) wifi: send null to keep active
I (1933652) wifi: send null to keep active
I (1943653) wifi: active cnt: 1
I (1953653) wifi: active cnt: 2
I (1963653) wifi: send null to keep active
I (1973653) wifi: send null to keep active
I (1983653) wifi: send null to keep active
I (1993653) wifi: active cnt: 1
I (2003654) wifi: send null to keep active
I (2013654) wifi: send null to keep active
I (2023654) wifi: send null to keep active
I (2033654) wifi: send null to keep active
I (2043654) wifi: send null to keep active
I (2053654) wifi: send null to keep active
I (2063654) wifi: send null to keep active
I (2073655) wifi: send null to keep active
I (2083655) wifi: active cnt: 1
I (2093655) wifi: send null to keep active
I (2103655) wifi: send null to keep active
I (2113655) wifi: send null to keep active
I (2123655) wifi: send null to keep active
I (2133655) wifi: send null to keep active
I (2143656) wifi: send null to keep active
I (2153656) wifi: send null to keep active
I (2163656) wifi: send null to keep active
I (2173656) wifi: send null to keep active
I (2183656) wifi: send null to keep active
I (2193656) wifi: send null to keep active
I (2203657) wifi: send null to keep active
I (2213657) wifi: send null to keep active
I (2223657) wifi: send null to keep active
I (2233657) wifi: send null to keep active
I (2243657) wifi: send null to keep active
I (2253657) wifi: send null to keep active
I (2263657) wifi: send null to keep active
I (2273658) wifi: active cnt: 2
I (2283658) wifi: send null to keep active
I (2293658) wifi: send null to keep active
I (2303658) wifi: send null to keep active
I (2313658) wifi: send null to keep active
I (2323658) wifi: send null to keep active
I (2333658) wifi: send null to keep active
I (2343659) wifi: send null to keep active
I (2353659) wifi: send null to keep active
I (2363659) wifi: send null to keep active
I (2373659) wifi: send null to keep active
I (2383659) wifi: send null to keep active
I (2393659) wifi: send null to keep active
I (2403660) wifi: send null to keep active
I (2413660) wifi: send null to keep active
I (2423660) wifi: send null to keep active
I (2433660) wifi: send null to keep active
I (2443660) wifi: send null to keep active
I (2453660) wifi: send null to keep active
I (2463660) wifi: send null to keep active
I (2473661) wifi: send null to keep active
I (2483661) wifi: send null to keep active
I (2483663) wifi: state: run -> auth (7c0)
I (2483663) wifi: pm stop, total sleep time: 0/-1824912959

I (2483663) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2483674) wifi: state: auth -> init (0)
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2483805) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2483805) wifi: state: init -> auth (b0)
I (2484805) wifi: state: auth -> init (2)
I (2484806) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2484930) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2484931) wifi: state: init -> auth (b0)
I (2485931) wifi: state: auth -> init (2)
I (2485931) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2486056) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2486056) wifi: state: init -> auth (b0)
I (2487056) wifi: state: auth -> init (2)
I (2487056) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2487181) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2487181) wifi: state: init -> auth (b0)
I (2488182) wifi: state: auth -> init (2)
I (2488182) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2488306) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2488307) wifi: state: init -> auth (b0)
I (2489307) wifi: state: auth -> init (2)
I (2489307) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2489432) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2489432) wifi: state: init -> auth (b0)
I (2490432) wifi: state: auth -> init (2)
I (2490432) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2490557) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2490557) wifi: state: init -> auth (b0)
I (2491558) wifi: state: auth -> init (2)
I (2491558) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2491682) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2491683) wifi: state: init -> auth (b0)
I (2492683) wifi: state: auth -> init (2)
I (2492683) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2492808) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2492808) wifi: state: init -> auth (b0)
I (2493808) wifi: state: auth -> init (2)
I (2493808) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event over 10 times now.  Reboot...
I (2493819) wifi: flush txq
I (2493822) wifi: stop sw txq
I (2493824) wifi: lmac stop hw txq
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0010,len:4
load:0x3fff0014,len:708
load:0x40078000,len:0
load:0x40078000,len:11460
entry 0x400789f4
Everything: init started
Everything: Free RAM = -1
I (749) wifi: wifi firmware version: c1b8a2f
I (749) wifi: config NVS flash: enabled
I (749) wifi: config nano formating: disabled
I (758) wifi: Init dynamic tx buffer num: 32
I (758) wifi: Init data frame dynamic rx buffer num: 64
I (758) wifi: Init management frame dynamic rx buffer num: 64
I (762) wifi: wifi driver task: 3ffca34c, prio:23, stack:4096
I (768) wifi: Init static rx buffer num: 10
I (771) wifi: Init dynamic rx buffer num: 0
I (775) wifi: Init rx ampdu len mblock:7
I (779) wifi: Init lldesc rx ampdu entry mblock:4
I (783) wifi: wifi power manager task: 0x3ffd6004 prio: 21 stack: 2560
I (791) wifi: wifi timer task: 3ffd705c, prio:22, stack:3584
I (815) wifi: mode : null
Disabling ESP32 WiFi Access Point

I (1816) wifi: Init Ampdu: 1 tx baw=6 rx baw=6
I (1816) wifi: mode : sta (30:ae:a4:07:f1:98)
[WiFi-event] event: 2

Initializing ESP32 WiFi network.  Please be patient...
ESP32 station start
Attempting to connect to WPA SSID: (SSIDREMOVED)
.I (2943) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
.I (3600) wifi: state: init -> auth (b0)
I (3602) wifi: state: auth -> assoc (0)
I (3606) wifi: state: assoc -> run (10)
I (3635) wifi: connected with (SSIDREMOVED), channel 1
[WiFi-event] event: 4
ESP32 station connected to AP
[WiFi-event] event: 7
WiFi connected
IP address: 
192.168.1.142

@liuzfesp / @ me-no-dev - Y a-t-il d'autres informations que je peux fournir? Cela arrive-t-il à quelqu'un d'autre ou uniquement avec mes deux ESP32 HiLetGo ModeMCU? Existe-t-il un firmware personnalisé que je peux essayer?

-Allan

J'ai exactement le même comportement sur mon module WROOM-32.
Tous les 3 ou 4 redémarrages, il se bloque dans la boucle STA_DISCONNECTED -> AUTH_EXPIRED.
Vérifié un deuxième module du même type, montrant le même comportement.
Mon routeur est un TL-WR841 (TPLINK) mais cela arrive aussi avec un ASUS RT-AC87U.

Quand y aura-t-il une solution, c'est inutile s'il y a besoin d'un redémarrage dans de telles situations ...

edit: pour moi, ce problème survient aussi après le démarrage, c'est à dire WiFi.begin () n'établira pas du tout de connexion mais des boucles dans STA_DISCONNECTED -> AUTH_EXPIRED

Je n'ai pas eu de réponse depuis un mois bien que, sans offense, je suis heureux que cela arrive à quelqu'un d'autre donc je sais que je ne suis pas seul.

@liuzfesp / @ me-no-dev - Y a-t-il eu des progrès à ce sujet ou sur quoi que ce soit que nous pouvons essayer pour que cela reste connecté de manière fiable au WiFi.

a encore poussé @liuzfesp ... c'est tout ce que je peux vraiment faire. Je n'ai pas accès à la source WiFi lib

@igrr

@copercini pourquoi?

Depuis que j'ai été tagué ici ... @vseven , y a-t-il une chance que vous puissiez effectuer une capture de paquets en utilisant Wireshark et un adaptateur WiFi en mode moniteur? Le moment où le processus de reconnexion commence à échouer est particulièrement intéressant. Comme nous ne savons pas ce qui se passe ici et que nous ne pouvons pas reproduire un problème similaire dans notre environnement CI, la capture de paquets peut révéler une anomalie, donnant un indice sur la situation à laquelle vous êtes confronté.

Une autre pensée (juste pour réduire le nombre de variables), ce problème se produit-il également si vous vous connectez à un réseau WiFi ouvert?

actuellement, toutes les reconnexions échouent avec mes WROOM32 avec la sortie de débogage suivante:

[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Événement: 2 - STA_START
.... [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Événement: 4 - STA_CONNECTED
.. [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Événement: 7 - STA_GOT_IP
WiFi connecté
... puis je bloque la réception de l'antenne ou j'appuie sur RESET sur mon point d'accès, pour forcer une déconnexion ...
[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Événement: 5 - STA_DISCONNECTED
[W] [WiFiGeneric. cpp: 270 ] _eventCallback (): Raison: 200 - NO_AP_FOUND
... lorsque la réception devrait être à nouveau correcte, cela prend environ 2 minutes jusqu'à ce qu'il dise:

[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Événement: 8 - STA_WPS_ER_SUCCESS

Cependant, il reste déconnecté du réseau pour toujours dans cet état.
WPS est désactivé sur mon AP. Je ne sais pas ce que signifie le message de débogage.
Même comportement avec deux points d'accès différents et deux modules WROOM32 différents, en utilisant l'exemple d'esquisse wificlient. Peu importe si WPA2 utilisé ou réseau ouvert.
Peut envoyer le journal Wireshark en mode moniteur si nécessaire.

Tout d'abord, merci à tous pour votre travail acharné sur le SDK. J'ai eu beaucoup de plaisir à développer avec, et je suis très reconnaissant pour tous les efforts qui y ont été consacrés.

Je vois aussi ce problème. Je pense que j'ai peut-être réussi à le réduire un peu. J'utilise ce très petit croquis qui devrait fonctionner à la fois sur ESP8266 et ESP32:

https://github.com/sidoh/esp32_reconnect_demo

J'ai désactivé la reconnexion automatique pour avoir plus de contrôle sur les variables.

Installer

  1. Test sur ESP8266 et ESP32
  2. Utilisation d'un réseau hotspot mobile. J'ai essayé à la fois WPA2 PSK et les réseaux ouverts
  3. Autorisez le MCU à se connecter au réseau et à fonctionner pendant quelques secondes. J'ai ajouté un client NTP pour vérifier la connectivité.

Ensuite, j'ai essayé deux choses différentes:

(A) Démontez le réseau, recréez immédiatement

Dans ces circonstances, le réseau est généralement recréé au moment où le MCU remarque qu'il est déconnecté.

(B) Démontez le réseau, attendez que le MCU remarque qu'il est déconnecté, recréez le réseau

Observations

  1. Le comportement est le même avec WPA2 et les réseaux ouverts.
  2. L'ESP8266 se reconnecte avec succès avec (A) et (B).
  3. ESP32 se reconnecte dans l'expérience (A), mais reste coincé dans (B).
  4. ESP32 se reconnecte avec succès dans (A) et (B) si: WiFi.disconnect(true); _and_ WiFi.begin(WIFI_SSID, WIFI_PASSWD); sont appelés. On dirait que les deux sont nécessaires.
    \
    Le paramètre booléen wifioff à disconnect mis à true semble également nécessaire. Puisque WiFi.disconnect(true); semble effacer les paramètres WiFi, il est nécessaire de redéfinir le ssid et le mot de passe dans l'appel à begin .

Journaux

Tous ces éléments ont un réseau ouvert. J'omets les journaux ESP8266 car le comportement était comme prévu, mais je peux fournir s'ils seraient utiles.

ESP32, expérience (A)

I (25) wifi: wifi firmware version: 708a055
I (26) wifi: config NVS flash: enabled
I (26) wifi: config nano formating: disabled
I (31) wifi: Init dynamic tx buffer num: 32
I (32) wifi: Init data frame dynamic rx buffer num: 64
I (32) wifi: Init management frame dynamic rx buffer num: 64
I (35) wifi: wifi driver task: 3ffd46dc, prio:23, stack:4096
I (40) wifi: Init static rx buffer num: 10
I (44) wifi: Init dynamic rx buffer num: 0
I (48) wifi: wifi power manager task: 0x3ffd9418 prio: 21 stack: 2560
I (425) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (2836) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (2836) wifi: state: init -> auth (b0)
I (2853) wifi: state: auth -> assoc (0)
I (2872) wifi: state: assoc -> run (10)
I (2872) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Setup completed
[4] ssid=glowyrectangle
[5] ssid=glowyrectangle
I (5872) wifi: pm start, type:0

[6] ssid=glowyrectangle
[7] ssid=glowyrectangle
[8] ssid=glowyrectangle
[9] ssid=glowyrectangle
[10] ssid=glowyrectangle
I (10388) wifi: state: run -> auth (7c0)
I (10389) wifi: pm stop, total sleep time: 0/4516399

I (10389) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 7 - NOT_ASSOCED
W (11413) wifi: Haven't to connect to a suitable AP now!
[11] ssid=
Attempting to reconnect...
I (13822) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
I (13823) wifi: state: auth -> auth (b0)
I (13826) wifi: state: auth -> assoc (0)
I (13839) wifi: state: assoc -> run (10)
I (13839) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Connection result: 3
[1513219385] ssid=glowyrectangle
[1513219386] ssid=glowyrectangle
[1513219387] ssid=glowyrectangle
[1513219388] ssid=glowyrectangle
I (16839) wifi: pm start, type:0

ESP32, expérience (B)

rst:0x10 (RTCWDT_RTC_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:812
load:0x40078000,len:0
load:0x40078000,len:11404
entry 0x40078aa0
I (25) wifi: wifi firmware version: 708a055
I (26) wifi: config NVS flash: enabled
I (26) wifi: config nano formating: disabled
I (35) wifi: Init dynamic tx buffer num: 32
I (36) wifi: Init data frame dynamic rx buffer num: 64
I (36) wifi: Init management frame dynamic rx buffer num: 64
I (39) wifi: wifi driver task: 3ffd46d0, prio:23, stack:4096
I (44) wifi: Init static rx buffer num: 10
I (48) wifi: Init dynamic rx buffer num: 0
I (52) wifi: wifi power manager task: 0x3ffd940c prio: 21 stack: 2560
I (431) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (2842) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (2843) wifi: state: init -> auth (b0)
I (2846) wifi: state: auth -> assoc (0)
I (2863) wifi: state: assoc -> run (10)
I (2863) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Setup completed
[3] ssid=glowyrectangle
[4] ssid=glowyrectangle
I (5863) wifi: pm start, type:0

[5] ssid=glowyrectangle
[1513219573] ssid=glowyrectangle
[1513219574] ssid=glowyrectangle
[1513219575] ssid=glowyrectangle
[1513219576] ssid=glowyrectangle
[1513219577] ssid=glowyrectangle
[1513219578] ssid=glowyrectangle
[1513219579] ssid=glowyrectangle
I (13174) wifi: bcn_timout,ap_probe_send_start
[1513219580] ssid=glowyrectangle
[1513219581] ssid=glowyrectangle
[1513219582] ssid=glowyrectangle
I (15676) wifi: ap_probe_send over, resett wifi status to disassoc
I (15677) wifi: state: run -> init (1)
I (15678) wifi: pm stop, total sleep time: 0/9813809

I (15678) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 200 - NO_AP_FOUND
W (16387) wifi: Haven't to connect to a suitable AP now!
[1513219583] ssid=
Attempting to reconnect...
Connection result: 5
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (17412) wifi: Haven't to connect to a suitable AP now!
[1513219584] ssid=
Attempting to reconnect...
Connection result: 5
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (18437) wifi: Haven't to connect to a suitable AP now!
[1513219585] ssid=
Attempting to reconnect...
Connection result: 5
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (19462) wifi: Haven't to connect to a suitable AP now!
[1513219586] ssid=
Attempting to reconnect...
Connection result: 5

... ( loops like this indefinitely ) ...

ESP32, expérimentez (B) avec disconnect (true) + begin (ssid, passwd)

rst:0x10 (RTCWDT_RTC_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:812
load:0x40078000,len:0
load:0x40078000,len:11404
entry 0x40078aa0
I (27) wifi: wifi firmware version: 708a055
I (28) wifi: config NVS flash: enabled
I (28) wifi: config nano formating: disabled
I (36) wifi: Init dynamic tx buffer num: 32
I (36) wifi: Init data frame dynamic rx buffer num: 64
I (36) wifi: Init management frame dynamic rx buffer num: 64
I (39) wifi: wifi driver task: 3ffd46d0, prio:23, stack:4096
I (45) wifi: Init static rx buffer num: 10
I (48) wifi: Init dynamic rx buffer num: 0
I (52) wifi: wifi power manager task: 0x3ffd940c prio: 21 stack: 2560
I (431) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (2842) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (2843) wifi: state: init -> auth (b0)
I (2847) wifi: state: auth -> assoc (0)
I (2863) wifi: state: assoc -> run (10)
I (2863) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Setup completed
[1513219802] ssid=glowyrectangle
[1513219803] ssid=glowyrectangle
[1513219804] ssid=glowyrectangle
I (5863) wifi: pm start, type:0

[1513219805] ssid=glowyrectangle
[1513219806] ssid=glowyrectangle
[1513219807] ssid=glowyrectangle
[1513219808] ssid=glowyrectangle
[1513219809] ssid=glowyrectangle
[1513219810] ssid=glowyrectangle
[1513219811] ssid=glowyrectangle
[1513219812] ssid=glowyrectangle
[1513219813] ssid=glowyrectangle
[1513219814] ssid=glowyrectangle
[1513219815] ssid=glowyrectangle
[1513219816] ssid=glowyrectangle
I (17282) wifi: bcn_timout,ap_probe_send_start
[1513219817] ssid=glowyrectangle
[1513219818] ssid=glowyrectangle
[1513219819] ssid=glowyrectangle
I (19785) wifi: ap_probe_send over, resett wifi status to disassoc
I (19785) wifi: state: run -> init (1)
I (19786) wifi: pm stop, total sleep time: 0/13922305

I (19786) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 200 - NO_AP_FOUND
W (20616) wifi: Haven't to connect to a suitable AP now!
[1513219820] ssid=
Attempting to reconnect...
I (20632) wifi: mode : null
I (20634) wifi: flush txq
I (20634) wifi: stop sw txq
I (20635) wifi: lmac stop hw txq
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 3 - STA_STOP
I (20644) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 201 - AUTH_FAIL
Connection result: 1
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (24182) wifi: Haven't to connect to a suitable AP now!
[1513219823] ssid=
Attempting to reconnect...
I (24254) wifi: mode : null
I (24256) wifi: flush txq
I (24257) wifi: stop sw txq
I (24257) wifi: lmac stop hw txq
I (24266) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 3 - STA_STOP
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 201 - AUTH_FAIL
Connection result: 1
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (27804) wifi: Haven't to connect to a suitable AP now!
[1513219827] ssid=
Attempting to reconnect...
I (27820) wifi: mode : null
I (27822) wifi: flush txq
I (27822) wifi: stop sw txq
I (27822) wifi: lmac stop hw txq
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 3 - STA_STOP
I (27832) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (30311) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (30312) wifi: state: init -> auth (b0)
I (30318) wifi: state: auth -> assoc (0)
I (30339) wifi: state: assoc -> run (10)
I (30340) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Connection result: 3
[1513219831] ssid=glowyrectangle
[1513219832] ssid=glowyrectangle
I (33340) wifi: pm start, type:0

[1513219833] ssid=glowyrectangle
[1513219834] ssid=glowyrectangle
[1513219835] ssid=glowyrectangle
[1513219835] ssid=glowyrectangle
[1513219836] ssid=glowyrectangle

Emballer

J'ai fait quelques recherches dans le SDK, mais je ne vois rien d'évident. Je vais peut-être creuser un peu, mais j'espère que les informations ci-dessus sont utiles. S'il y a d'autres informations que je peux fournir, veuillez me le faire savoir; Je serais plus qu'heureux d'obliger.

J'ai essayé d'obtenir des pcaps en mode moniteur, mais ils n'étaient pas très intéressants. Il semblait juste que l'ESP32 n'envoyait rien après la déconnexion.

Je suis heureux d'avoir au moins trouvé une solution de contournement (disconnect (true) + begin (ssid, passwd)).

@vseven @Markusenz @sidoh
Désolé de répondre plus tard, et merci pour votre travail acharné sur le SDK.
La pièce jointe est la version de débogage de wifi lib, vous pouvez l'utiliser pour faire un test, puis nous pouvons analyser vos journaux pour résoudre le problème.
wifi_lib.tar.gz

@igrr - J'ai essayé à la fois ouvert et sécurisé avec les mêmes résultats. Je peux essayer de vous faire une capture de paquets mais le problème est extrêmement aléatoire, il pourrait le faire 4 fois en une heure ou deux fois par jour, donc la capture pourrait être très fastidieuse. Maintenant que plusieurs personnes ont le même problème, je vais essayer la version de débogage publiée par @zhangyanjiaoesp et si cela ne vous conduit toujours pas à la solution, j'essaierai la capture de paquets.

La reconnexion automatique sera-t-elle corrigée pour fonctionner comme prévu? On dirait que @sidoh est en train de le contourner, ce avec quoi je n'ai pas eu beaucoup de chance. Seul le redémarrage semble contourner ces boucles de déconnexion.

Je vais le recompiler et le charger ce week-end.

EDIT: Le fichier wifi_lib.tar.gz est vide. Pouvez-vous s'il vous plaît republier?

Je pense que la chose la plus intéressante que j'ai remarquée est la suivante:

WiFi.disconnect(true);
WiFi.begin(SSID, PASSWORD);

se reconnecte toujours pour moi (le true à disconnect est important). Je pense que WiFi.disconnect(true) éteint la radio. Je suppose que dans certaines circonstances, un état sur le réseau auquel l'ESP32 est censé se connecter est effacé, et ce qui précède le réinitialise.

Il est également intéressant de noter que le problème semble être reproductible à 100% en désactivant le réseau wifi, en attendant que l'ESP32 remarque qu'il s'est déconnecté et en rallumant le réseau. Si le réseau réapparaît avant que l'ESP32 ne le remarque, il peut parfois se reconnecter avec succès. D'après les journaux, la différence semble être qu'un événement NO_AP_FOUND est déclenché dans le premier cas, mais pas dans le second.

Réexécuté le code lié aux bibliothèques de débogage. Journaux ici:

Tout cela sur un réseau ouvert.

edit - lien vers les journaux bruts au lieu de la page principale.

@zhangyanjiaoesp - Des nouvelles à ce sujet? Je n'ai pas essayé le code de débogage parce que @sidoh l'a déjà fait et a déjà fourni beaucoup de journaux, mais encore une fois, cela fait encore quelques semaines et aucune vraie réponse.

@sidoh
Dans le slow_ap_recreate.log , nous trouvons qu'il y a des print comme

[1513308152] ssid =
Tentative de reconnexion...

il semble que votre ssid soit vide, donc après avoir scanné tous les canaux, renvoyez aucun ap trouvé.
vous devez donc vérifier votre code pour voir si le ssid est correctement défini.
screenshot from 2018-01-04 17-55-20

Salut @zhangyanjiaoesp ,

Je pense que c'est probablement le cœur du problème. Dans le slow_ap_recreate.log , le code de reconnexion fait juste (esquisse complète ici ):

WiFi.begin();

il ne fournit donc pas d'AP. Ma compréhension du SDK est qu'il devrait simplement se reconnecter au dernier AP connu. Peut-être que s'il ne trouve pas le dernier SSID utilisé, il efface la configuration? Est-ce prévu?

Utiliser ceci à la place semble toujours fonctionner:

WiFi.disconnect(true);
WiFi.begin(ssid, passwd);

edit - juste pour s'assurer que la configuration est claire, le cas où la reconnexion ne fonctionne pas est lorsque l'AP disparaît suffisamment longtemps pour que le SDK décide qu'il est parti. C'est peut-être un comportement attendu, cependant.

@sidoh Oui, vous avez raison. Il s'agit d'un comportement attendu, vous pouvez le contourner par votre méthode:

WiFi.disconnect (vrai);
WiFi.begin (ssid, passwd);

Je vois, cela a du sens. J'essaierai de reproduire sans le WiFi.begin() dans les prochains jours. Pensez que la bonne chose est d'avoir simplement la reconnexion de la poignée du SDK.

Où la reconnexion est-elle gérée dans le SDK? La seule référence que je peux trouver est ici , qui semble utiliser WiFi.begin() . Est-ce prévu?

Oui, tu as raison

Cela ne signifie-t-il pas que le code du SDK gérant les reconnexions aurait le même problème que ma démo? S'il essaie de se reconnecter après la disparition de l'AP, le SSID sera effacé et il ne pourra pas se reconnecter à moins que les informations AP ne soient à nouveau fournies?

le SDK devrait certainement essayer de se reconnecter automatiquement. C'est tout l'intérêt d'avoir WiFi.setAutoReconnect (true).

@everslick - Je suis tout à fait d'accord, cela ne semble pas fonctionner, c'est pourquoi j'ai posté ceci il y a plus de 3 mois. Le WiFi.setAutoReconnect (true) ne semble pas le faire se reconnecter, ce qui est pour le moins ironique. La seule chose qui fonctionne est de redémarrer le contrôleur et de le laisser revenir à sa connexion normale (ce qui ne fonctionnera pas pour moi lors du contrôle des LED lorsqu'elles s'éteignent) ou de procéder à la déconnexion complète et à la reconnexion.

@zhangyanjiaoesp - Vous dites donc que WiFi.setAutoReconnect (true) ne fonctionne tout simplement pas? Et pour contourner le problème, nous devons appeler la déconnexion et nous reconnecter avec le SSID et le mot de passe à nouveau? Si cela est vrai, sera-t-il corrigé ou du moins la documentation mise à jour pour indiquer que cela ne fonctionne pas?

J'ai un problème similaire,
Après avoir réinitialisé le logiciel en utilisant la séquence suivante:
WiFi.disconnect (); // Assurez-vous que le ssid / mot de passe actuel est effacé
retard (1000);
ESP.restart ();
L'ESP redémarre mais ne se connecte jamais à l'AP jusqu'à une réinitialisation matérielle.
La fonction Wifi.disconnect () ne fonctionne pas non plus correctement.
Robert

Le plus difficile est de connecter une broche GPIO à la broche EN et de forcer une réinitialisation du système (GPIO Low) au cas où un redémarrage / redémarrage ou une (re) connexion wifi est nécessaire.

Ne faites pas la déconnexion. Le redémarrage fonctionne pour moi. Mais encore une fois ... ne devrait pas avoir à redémarrer si WiFi.setAutoReconnect (true) fonctionnait correctement.

Cela devrait être bien de faire fonctionner le Wifi.disconnect ou l'autoreconnect, mais à quoi ça sert, s'il y a un problème de connexion Wifi, c'est un problème majeur dans le cas d'ESP32 (toutes les applications ultérieures reposent probablement sur le Wifi), donc la solution ultime est d'essayer une réinitialisation matérielle, si celle-ci échoue ... bye bye utilisation ESP32.

Le redémarrage n'est PAS une solution. J'utilise ceci pour le contrôle de la LED RVB et le redémarrage réinitialise les lumières. S'il y a une fonction qui dit à l'ESP que s'il perd le WiFi, il devrait continuer à essayer de se connecter, alors cette fonction devrait fonctionner comme documenté.

OK, j'ai essayé de réinitialiser l'ESP via un GPIO, mais il semble que l'ESP n'aime pas le suicide, donc cela ne fonctionne pas sans périphérique externe. J'ai donc convenu que la seule solution qui reste est que la déconnexion WiFi, le redémarrage de l'ESP ou la reconnexion automatique du Wifi fonctionnent réellement.
Autre problème pour lequel il faut attendre un module ESP fonctionnel (je note que pour autant que j'ai pu le tester, le protocole I2C est un autre pour lequel j'attends une solution).
ESP32 est loin d'être fiable jusqu'à présent ...
Robert

et je n'ai pas mentionné l'interface SPI ...

esp_restart_noos ();

Pour quand ESP.restart () ne fonctionne pas.

J'utilise Arduino IDE pour configurer un WeMos Lolin32.
J'utilise la fonction:

void unitReset ()
 {
#ifdef DEBUGGING
  Serial.println ("Coordinator will REBOOT NOW ....");
#endif    
  WiFi.disconnect();                          //Ensure current  ssid/password is erased
  delay (1000);
  ESP.restart();
 }

Lorsque WeMos est connecté en WiFi.mode (WIFI_STA), j'appelle cette fonction depuis MQTT.
Il redémarre en fait le système et l'esquisse démarre, mais Wifi (impossible de se synchroniser à partir de ce point, les tentatives de connexion se déroulent dans une boucle sans fin). Une réinitialisation manuelle le résout.
Cependant, la même fonction appelée depuis avec WiFi.mode (WIFI_STA) via telnet, fonctionne.

@vseven @everslick @rrobinet
Vous avez mal compris la signification de la fonction WiFi.setAutoReconnect(true) .
Dans notre code, WiFi.setAutoReconnect(true) n'est pas destiné à reconnecter le wifi de manière utomotrice. Cela signifie que si l'ESP32 s'est connecté au wifi avant, alors lorsque le système redémarrera la prochaine fois, il connectera le dernier wifi connecté.
Nous allons donc ajouter quelques commentaires dans le code. Désolé d'avoir affecté votre travail.

@zhangyanjiaoesp Désolé de le dire comme ça: C'est juste "faux". Cette API a été introduite pour l'ESP8266 et c'est exactement ce qu'elle a fait: se reconnecter automatiquement au wifi. Ce que vous décrivez est ce que le WiFi.setAutoConnect (); la méthode est pour. Vous ne pouvez pas modifier à volonté la sémantique d'une API bien établie.

En outre, même lorsque l'API était censée fonctionner comme vous l'avez dit, la dénomination des fonctions serait incroyablement mauvaise et trompeuse.

En tous cas. Nous parlons ici d'appareils IoT. La valeur par défaut devrait être de rester connecté au réseau quoi qu'il arrive. Si quoi que ce soit, il devrait y avoir des fonctions pour désactiver les reconnexions automatiques et ne pas obliger l'utilisateur de l'API à sauter à travers des cercles pour le faire se comporter de cette façon.

@vseven @everslick @rrobinet
Veuillez regarder ici , cela indique à l'utilisateur que cette fonction fonctionne lorsqu'elle est allumée.

Problème ESP.restart, correction.
Eh bien, le script ci-dessus fonctionnait avec un ESP8266 et non avec un ESP32, mais après quelques tests, le problème est l'utilisation du WiFi.disconnect (true), avant l'ESP.restart (). Cette fonction pour ESP32 doit être placée à l'initialisation du Wifi (voir https://github.com/espressif/arduino-esp32/pull/466)
Quelque chose comme:

<snip>
  WiFi.disconnect(true);                                      // Clear Wifi Credentials
  WiFi.persistent(false);                                     // Avoid to store Wifi configuration in Flash
  WiFi.mode(WIFI_STA);                                        // Ensure WiFi mode is Station 
  Serial.println("Now Connecting to Access Point ...");  
  // Connect to the Access Point
  WiFi.begin(ssid,key);
<snip>

et la réinitialisation de l'unité doit être simplement:

void unitReset ()
 {
#ifdef DEBUGGING
  Serial.println ("Coordinator will REBOOT NOW ....");
#endif    
  delay (1000);
  ESP.restart();
 }

Pouvez-vous confirmer ce qui suit, que je comprends jusqu'à présent en lisant ce fil:

  • ESP32 se comporte différemment de l'ESP8266, de sorte qu'avec l'ESP32, il n'y a pas de reconnexion automatique du wifi pendant l'exécution au cas où le point d'accès serait perdu ou inaccessible pendant un certain temps. L'utilisateur doit détecter la perte de wifi et gérer la reconnexion dans son code (pas possible sans redémarrage de l'appareil ??)
  • ESP32 se comporte différemment de ESP8266 car après le démarrage, il ne se connecte parfois pas à AP. Nous avons besoin de certaines lignes de code pour le corriger, comme ici https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356534618
  • les problèmes décrits sont considérés comme un comportement attendu et il n'est pas prévu de changer le comportement de l'API, nous devons donc adapter notre code en conséquence lorsque vous travaillez avec ESP32

@Markusenz , je peux confirmer que https://github.com/espressif/arduino-esp32/issues/653#issuecomment -355659659 semble toujours fonctionner pour moi. Il semble que la seule référence à getAutoReconnect soit le lien que j'ai collé dans le commentaire, qui ne gérerait pas bien les déconnexions, si tout.

@zhangyanjiaoesp , merci pour votre aide à ce sujet. :)

Vous avez mal compris la signification de la fonction WiFi.setAutoReconnect (true).
Dans notre code, WiFi.setAutoReconnect (true) ne signifie pas pour reconnecter le wifi de manière utomotrice. Cela signifie que si l'ESP32 s'est connecté au wifi avant, alors lorsque le système redémarrera la prochaine fois, il connectera le dernier wifi connecté.

La méthode à laquelle vous vous êtes lié est setAutoConnect , et non setAutoReconnect . Je pense que ces méthodes sont différentes. setAutoReconnect est ici . Il définit simplement un drapeau, et je pense que le seul endroit où ce drapeau est utilisé est ici .

Étant donné le nom de la méthode et la façon dont cet indicateur est utilisé en interne, il semble que cette méthode soit censée faire ce que les gens supposent qu'elle fait - activer / désactiver les tentatives automatiques de se reconnecter à un AP après une déconnexion.

Je pense que cette fonctionnalité ne fonctionne tout simplement pas comme prévu, et je pense que c'est peut-être parce qu'en interne le SDK utilise WiFi.begin() , ce qui effacera le SSID si l'AP enregistré n'existe pas, comme je l'ai découvert ci-dessus.

Voilà donc comment cela semble se produire. Le SDK peut-il être mis à jour pour NE PAS effacer l'AP s'il ne le voit pas instantanément? Ou pour faire un WiFi.Begin en utilisant le dernier SSID et mot de passe connus si WiFi.setAutoReconnect (true) ou est-ce que je manque quelque chose?

Si ma façon de penser / creuser est correcte, je doute vraiment que ce comportement soit intentionnel ou attendu. Il semble probable que setAutoReconnect soit censé avoir la fonctionnalité que les gens de ce fil attendent, et il a juste quelques bogues.

Ma suggestion serait de contourner ce problème pour le moment. Dans mon propre projet, je joins simplement un gestionnaire d'événements qui

WiFi.disconnect(true);
WiFi.begin(ssid, passwd);

Et cela fonctionne pour moi.

Il semble que la reconnexion soit actuellement gérée par le SDK Arduino plutôt que par les éléments sous-jacents. Avec le SDK Arduino ESP8266, la reconnexion est gérée par le SDK Non-OS. Donc, une solution au SDK ESP32 Arduino ressemblera probablement beaucoup à cette solution de contournement externe (encore une fois - en supposant que ma pensée soit correcte. Je pourrais certainement me tromper).

edit - voici la section pertinente de mon code qui gère la reconnexion.

@Markusenz
vous avez raison.
@vseven @sidoh
Je suis d'accord avec @sidoh , vous pouvez le contourner pour le moment. Nous mettrons en œuvre la fonction de connexion automatique, et nous connaissons l'importance de ce problème, mais nous avons besoin de temps pour vous fournir une solution parfaite.

Après quelques recherches, j'ai trouvé que cela fonctionnait plutôt bien:

static bool sta_was_connected = false;

static void poll_connection(void) {                                         
#ifdef ESP32
  // this is a crude workaround due to the inability of
  // the ESP32 to reconnect to an accesspoint automatically.
  //
  // https://github.com/espressif/arduino-esp32/issues/653

  static uint32_t ms = millis();

  if (!WiFi.isConnected() && (millis() - ms) > 1000 * 5) {
    ms = millis();

    if (sta_was_connected) WiFi.reconnect(); else WiFi.begin();
  }
#endif
}

loop() {
  poll_connection();
}

Dans le gestionnaire d'événements WiFi pour SYSTEM_EVENT_STA_GOT_IP, vous devez définir sta_was_connected sur true.

Cela fonctionnera également lorsque le point d'accès n'était pas disponible au démarrage de l'ESP32.

L'avantage est qu'il n'efface pas la configuration STA. Ceci est particulièrement utile si vous avez défini une configuration IP statique (sans utiliser DHCP).

obtenez-vous un
[D][WiFiGeneric.cpp:293] _eventCallback(): Event: 8 - STA_LOST_IP
si vous attendez assez longtemps (il y a un délai)

Je vais essayer

    } else if(event->event_id == SYSTEM_EVENT_STA_LOST_IP) {
        if(WiFi.getAutoReconnect()){
            WiFi.begin();
        }

Voici une solution de travail qui contourne certains problèmes avec la bibliothèque WiFi.
Notez les boucles while après un WiFi.begin ().
J'ai trouvé que le délai de connexion varie en fonction du routeur et des paramètres de cryptage, AES, WPA2 semblent les meilleurs, les plus rapides et les plus fiables.

À cette fin, attendre de savoir qu'une connexion a fonctionné, mais en veillant à ne pas verrouiller, le fait à peu près.

J'ai noté que certains appelaient WiFi.disconnect (). Veillez à utiliser WiFi.persistent (false); avec ou à chaque fois que vous récupérez, vous réécrivez le NV FLASH et le briquerez lorsque le FLASH mourra.

ÉCHANTILLON DE CODE partiel

setup()
{
  WiFi.begin( rssiSSID , password );

  int WLcount = 0;
  while (WiFi.status() != WL_CONNECTED && WLcount < 250 ) 
  {
    delay( 100 );
    #ifdef DEBUG
       Serial.print(".");
    #endif
    ++WLcount;
  }
}

void loop() 
{
  if (WiFi.status() ==  WL_CONNECTED) 
  {
    // PUT_YOUR_UP_TIME_CODE_HERE   

    #ifdef DEBUG
       Serial.print("C");
       if (UpCount >= 20)   // just keep terminal from scrolling sideways
       {
        UpCount = 0;
        Serial.println();
       }
       ++UpCount;
    #endif

      // END WiFi connected loop()
  } else
  {
    // PUT_YOUR_DOWN_TIME_CODE_HERE
    //  WiFi DOWN loop

    #ifdef DEBUG
        WFstatus = getWifiStatus( WFstatus );
    #endif

    WiFi.begin( rssiSSID , password );
    int WLcount = 0;
    // loop - depending on router, connect can be from 4 - 20 seconds
    // usually longer to reconnect than the connect at boot
    // lopping till reconnect seems to let it settle
    // usually around 80 count to breakout
    while (WiFi.status() != WL_CONNECTED && WLcount < 250 ) 
    {
        delay( 100 );
        #ifdef DEBUG  
            Serial.print(".");
            // just keep terminal from scrolling sideways in test
            if (UpCount >= 20)
            {
                UpCount = 0;
                Serial.println();
            }
            ++UpCount;
        #endif
        ++WLcount;
    }
    delay( 1000 );
  }  // END WiFi DOWN 
} // END loop()


int getWifiStatus( int WiFiStatus  )
{
  WiFiStatus = WiFi.status();
  Serial.print("\tStatus "); Serial.print( WiFiStatus );
  switch( WiFiStatus )
     {
        case WL_IDLE_STATUS :           // WL_IDLE_STATUS     = 0, 
                Serial.println(", WiFi IDLE "); 
                break;
        case WL_NO_SSID_AVAIL:          // WL_NO_SSID_AVAIL   = 1,
                Serial.println(", NO SSID AVAIL ");
                break;
        case WL_SCAN_COMPLETED:         // WL_SCAN_COMPLETED  = 2,
                Serial.println(", WiFi SCAN_COMPLETED "); 
                break;
        case WL_CONNECTED:      // WL_CONNECTED       = 3,
                Serial.println(", WiFi CONNECTED "); 
                WiFi.persistent(true);  
                break;
        case WL_CONNECT_FAILED:         // WL_CONNECT_FAILED  = 4,
                Serial.println(", WiFi WL_CONNECT FAILED"); 
                break;
        case WL_CONNECTION_LOST:        // WL_CONNECTION_LOST = 5,
                Serial.println(", WiFi CONNECTION LOST");
                WiFi.persistent(false); // don't keep writing FLASH
                break;   
        case WL_DISCONNECTED:            // WL_DISCONNECTED    = 6
                Serial.println(", WiFi DISCONNECTED ==");
                break;
  }
  return WiFiStatus;
}  // END getWifiStatus()

======
il faut en moyenne 8 à 15 secondes pour détecter le changement de mode
notez que les "." se connectent
Les "C" sont connectés

OUTPUT
CCCCCCCCC     Status 5, WiFi CONNECTION LOST    Unplugged Router here
.........
....................                            Trying
 More lines of dots...
....................
...........       Status 1, NO SSID AVAIL       Gave up, Changed Modes
.........                                       Replugged Router here
....................
................CCCC                            TaDa I'm Back...
CCCCCCCCCCCCCCCCCCCC

J'utilise ceci, semble fonctionner pour moi

void WiFiEvent(WiFiEvent_t event){
    if(event == SYSTEM_EVENT_STA_DISCONNECTED){
      Serial.println("Event: SYSTEM_EVENT_STA_DISCONNECTED, reconnecting");
      WiFi.reconnect();
    }
}

if(WiFi.getAutoReconnect()) WiFi.onEvent(WiFiEvent);

Je suppose que mon appartement avec les 50 points d'accès à proximité est vraiment un endroit idéal pour tester ce problème. La solution de tablatronix provoque le vidage de mon esp32 et je ne vois pas comment la solution de mickeypop ferait du bien, ce qui n'a pas aidé. J'ai trouvé que le redémarrage de la connexion wifi fonctionne assez bien, mais même cela nécessite une réinitialisation de l'alimentation matérielle de temps en temps. Sur le côté, j'ai un esp8266 dans le même environnement qui ne nécessite aucune intervention manuelle. J'ai essayé quelques autres suggestions ici sans chance.

Je pense que c'est incroyable tout le développement qui est fait. Franchement, je n'ai pas les compétences pour trouver une solution. Si quelqu'un souhaite essayer quelque chose dans un environnement difficile, n'hésitez pas à m'envoyer des tests. Nous avons vraiment besoin de l'esp32 pour avoir une connexion solide et gérer le wifi intermittent avec élégance.

Edit: après avoir essayé beaucoup de choses: @tablatronix Si je lance cette ligne trop vite, elle plante / donne une trace. Appeler toutes les quelques secondes ne m'a posé aucun problème. Maintenant, laissez-le fonctionner pendant quelques jours pour voir ce qui se passe
if(WiFi.getAutoReconnect()) WiFi.onEvent(WiFiEvent);
Edit2: a duré 30 minutes avant de déposer

@thefatmoop J'ai rencontré un problème de reconnexion WiFi qui a fini par être un problème de corruption NVS. # 1147 J'ai réécrit un croquis pour vider les données nvs. Essayez-le et capturez la sortie. Cela peut montrer quelque chose.
Afficher les clés NVS

Mandrin.

thefatmoop

Les deux solutions devraient fonctionner.
Comme je l'ai noté; "_Voici une solution fonctionnelle qui contourne certains problèmes avec la bibliothèque WiFi._"

Alors que l'un contourne certains problèmes de bibliothèque, l'autre utilise le service WiFi.onEvent () , les deux détectent simplement lorsqu'une connexion est interrompue et

Bien que certains aient remarqué qu'après plusieurs heures, ils continuaient à être bumpés, cela dépend presque certainement de la durée de location du serveur DHCP dans le routeur.

Si la durée de location du routeur n'est pas la même, les périphériques «oublient» parfois de se mettre à jour, ce qui entraîne une absence d'adresse IP même si parfois la connexion WiFi est toujours là.

  • WiFi.begin () force le DHCP à obtenir une nouvelle adresse IP avec une nouvelle connexion.
  • WiFi.reconnect () fonctionne mais suppose souvent que l'unité a toujours une adresse IP et ne peut pas faire de requête DHCP.

Le moyen le plus simple de contourner ce problème consiste à envoyer périodiquement un ping au routeur DHCP.
Cela force le routeur à savoir que vous êtes toujours sur le réseau et à maintenir le bail à jour.

Le redémarrage peut se reconnecter, mais ne résout pas le pourquoi de la déconnexion et souvent les applications peuvent se désynchroniser si vous redémarrez simplement.

Donc, se reconnecter sans redémarrer est souvent une nécessité.

reconnecter ne refait pas DHCP, j'ai découvert cela en essayant de changer le nom d'hôte et de me reconnecter, j'allais le classer comme un bogue.

La solution de @tablatronix fonctionne pour moi merci! @thefatmoop vous pouvez vérifier l'implémentation sur le code OpenMQTTGateway.ino .

Le code est appelé après la déconnexion de MQTT, si je mets le code en dehors de cette condition, le vidage ESP.

Si WiFi.reconnect() reconnecte, mais pas le client MQTT, vous pouvez faire un autre setup_wifi() : avec disconnect () delay () et begin (), après quelques tentatives de reconnexion du client et cela fonctionne très bien dans le nouveau connexion. Mais que se passe-t-il lorsque le serveur MQTT est en panne?

C'est un problème au niveau de l'application.

Ajout de la proposition de code mickeypop au Wiki

Désolé. Je suis un débutant en programmation arduino / esp. Je suis également confronté aux bugs / problèmes de connexion et de reconnexion wifi. Ma partie de code qui gère à la fois le client WiFi et MQTT (PubSubClient), et qui fonctionne réellement sur un ESP32 d'Adafruit / Huzzah32:

void setupWiFi() {
  WiFi.disconnect(true);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  WiFi.waitForConnectResult();
}

boolean clientReconnect() {
  if(client.connect("esp32_client")) {
    client.subscribe("/test");
  }
  return client.connected();
}

boolean wifi_connected_once = false;
unsigned long last_client_reconnect_attempt = 0;
int client_reconnect_attempts = 0;

void setup() {  
  client.setServer(MQTT_SERVER, 1883);
  client.setCallback(client_callback);
}

void loop() {
  unsigned long loop_start = millis();

  if(WiFi.isConnected()) {
    // WiFi connected
    if(client.connected()) {
      // client connected
      // publish data every 5 seconds
      if(loop_start - last_client_publish >= 5000) {
        client_publish_data();
        last_client_publish = loop_start;
      }
      client.loop();
    } else {
      // client not connected
      // try reconnect a few times every 5 seconds
      if(client_reconnect_attempts <= 5) {
        if(loop_start - last_client_reconnect_attempt > 5000) {
          client_reconnect_attempts++;
          if(clientReconnect()) {
            // client connected
            client_reconnect_attempts = 0;
          }
          last_client_reconnect_attempt = loop_start;
        }
      } else {
        // maybe MQTT server is down
        // try reconnect in 5 minutes
        if(loop_start - last_client_reconnect_attempt > 300000) {
          last_client_reconnect_attempt = loop_start;
          client_reconnect_attempts = 0;
        }
      }
    }
  } else {
    // WiFi not connected
    // try connect for the first time or 
    // try reconnect every 2 minutes
    if((loop_start - last_client_reconnect_attempt > 120000) || wifi_connected_once == false) {
      last_client_reconnect_attempt = loop_start;
      wifi_connected_once = true;
      client_reconnect_attempts = 0;
      setupWiFi();
    }
  }
}

Testé avec certains redémarrages du routeur et le code semble fonctionner sans redémarrage ESP.
Avez-vous une bien meilleure suggestion?

Ce problème me tue. Cela se produit au hasard parfois dans la première heure, parfois après six heures tout en fonctionnant sans problèmes. J'ai essayé toutes sortes de configurations et aucune d'entre elles n'est fiable. Le redémarrage de l'ESP par logiciel ou matériel est le dernier recours qui fonctionne réellement, mais ce n'est pas une solution viable pour mon produit.

La dernière fois, je l'ai laissé en marche et j'ai essayé plus de QUATRE MILLE tentatives, aucune d'elles n'a réussi.

J'ai essayé jusqu'à présent:

1) Activation de la reconnexion automatique et reconnexion d'appel
2) Désactivation de la reconnexion automatique et déconnexion et reconnexion manuelle. Dans cette configuration, j'ai essayé les deux méthodes pour éteindre complètement l'antenne ou non. Ne fonctionne dans aucun mode.

Ici, vous avez quelques journaux (cela fonctionne actuellement avec plus de 600 tentatives de reconnexion sur un routeur en parfait état de fonctionnement (TP-LINK):

AVERTISSEMENT: WiFi perdu la connexion. Tentative de reconnexion 632 à l'itération suivante
Déclenchement d'une tentative de reconnexion WiFi 632
I (14944038) wifi: mode: softAP (30: ae: a4: 1a: ca: 1d)
Création du WiFi avec SSID 'Nano BAB - Développement' et mot de passe '#######'
Connexion au WiFi 'TP-LINK_A8FB38'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Événement: 3 - STA_STOP
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Événement: 2 - STA_START
Événement [WiFi-event]: 2
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Événement: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

Comme vous pouvez le voir, l'authentification échoue, mais le mot de passe est correct. Lors d'une tentative précédente (numéro 578 !!) du même exemple, l'erreur 2 est levée:

AVERTISSEMENT: WiFi perdu la connexion. Tentative de reconnexion 578 lors de la prochaine itération
Déclenchement d'une tentative de reconnexion WiFi 578
I (14134199) wifi: mode: softAP (30: ae: a4: 1a: ca: 1d)
Création du WiFi avec SSID 'Nano BAB - Développement' et mot de passe '#########'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Événement: 3 - STA_STOP
[Événement WiFi] événement: 3
Connexion au WiFi 'TP-LINK_A8FB38'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Événement: 13 - AP_START
[Événement WiFi] événement: 13I (14134890) wifi: mode: sta (30: ae: a4: 1a: ca: 1c) + softAP (30: ae: a4: 1a: ca: 1d)
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Événement: 2 - STA_START *

[Événement WiFi] événement: 2 [D] [WiFiGeneric.cpp: 293] _eventCallback (): événement: 2 - STA_START
[Événement WiFi] événement: 2I (14137748) wifi: réglage du canal ap o: 1,1 n: 6,1
I (14137749) wifi: n: 6 1, o: 1 0, ap: 6 1, sta: 6 1, prof: 1
I (14138422) wifi: état: init -> auth (b0)
I (14139423) wifi: état: auth -> init (2)
I (14139424) wifi: n: 6 0, o: 6 1, ap: 6 1, sta: 6 1, prof: 6
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Événement: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

C'est toujours l'une des deux erreurs. En fin de compte, c'est simplement qu'il ne se reconnecte pas.

Ce qui est drôle, c'est que je peux déconnecter manuellement le routeur en tirant sur le cordon d'alimentation pendant quelques minutes, mon code détecte la déconnexion et recommence à réessayer, puis mon système se reconnecte correctement une fois de retour, mais si le routeur fonctionne normalement, ce problème se produit finalement et le ESP ne se reconnecte tout simplement pas.

Btw, je cours avec:

Exécution sur le SDK: 'v3.1-dev-239-g1c3dd23f-dirty'
Fréquence du processeur: 240 MHz
WiFi créant à la fois son propre WiFi privé et se connectant à un autre avec accès à Internet

À quand remonte la dernière fois que vous vous êtes retiré du repo?

1132

vous n'avez posté que des journaux, pas de croquis ni de solution de reconnexion.

La dernière fois, c'était environ une semaine. Ma version SDK est 3.1-dev-239.
Désolé, je n'ai pas ajouté le code car j'ai essentiellement testé toutes les solutions contenues dans le message. Au démarrage, j'appelle quelque chose de similaire à:

WiFi.disconnect(true);
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

Ensuite, je gère les événements WiFi et surtout l'événement SYSTEM_EVENT_STA_DISCONNECTED . Lorsque cet événement se produit, j'ai essayé 3 façons différentes de reconnexion:

1) Lorsque la reconnexion automatique Wifi a été activée, j'ai laissé le système se charger de la reconnexion
2) J'ai essayé en désactivant la reconnexion automatique et sur cet événement en appelant WiFi.reconnect ()
3) Le dernier que j'essaie est de me déconnecter en éteignant la radio et en se reconnectant si aucune autre déconnexion ne l'a déclenchée. J'ai quelque chose comme:

reconnections++;
needsReconnection = true;
reconnectionDetection = millis();
Serial.printf("\r\nWARNING: WiFi lost connection. Trying reconnection attempt %d on next iteration\r\n", reconnections);

needsReconnection est un indicateur qui est vérifié dans la boucle principale et déclenche à nouveau la connexion en exécutant essentiellement les 3 premières lignes de code.

J'espère que cela a du sens maintenant ;-)

Je ne sais pas s'il existe une autre façon de le faire.

J'ai oublié de mentionner que j'utilise aussi un serveur mangouste pour implémenter une API Rest, permettant un maximum de 3 connexions simultanées. Je ne sais pas si cela pourrait en être la cause.

  1. Il n'y a pas de reconnexion automatique, c'est à cela que sert ce problème.
  2. WiFi.reconnect peut ne pas être le même que disconnect, begin () (dhcp, etc.)
  3. Cela peut être spécifique au mode, sans code, personne ne sait ce que vous faites, aucune idée de la façon dont vous gérez les événements ou "éteindre la radio"

Je suggérerais d'apporter des modifications et de créer un cas de test simple.

Josmunpav

votre problème est peut-être lié au mode WiFi

votre code

WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

Vous utilisez des modes mixtes.
WiFi.softAP () ; la valeur par défaut est le mode WIFI_MODE_AP

WiFi.begin (); la valeur par défaut est le mode WIFI_AP_STA

si vous continuez avec le mode WIFI_MODE_APSTA (mode mixte), ils ne devraient pas changer et WiFi EVENT ne sera pas mélangé avec différents modes.

WiFi.mode( WIFI_MODE_APSTA );
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

REF INFO
dans esp_wifi_types.h

typedef enum {
    WIFI_MODE_NULL = 0,  /**< null mode */
    WIFI_MODE_STA,       /**< WiFi station mode */
    WIFI_MODE_AP,        /**< WiFi soft-AP mode */
    WIFI_MODE_APSTA,     /**< WiFi station + soft-AP mode */
    WIFI_MODE_MAX
} wifi_mode_t;

dans wifitypes.h

typedef enum {
    WL_NO_SHIELD        = 255,   // for compatibility with WiFi Shield library
    WL_IDLE_STATUS      = 0,
    WL_NO_SSID_AVAIL    = 1,
    WL_SCAN_COMPLETED   = 2,
    WL_CONNECTED        = 3,
    WL_CONNECT_FAILED   = 4,
    WL_CONNECTION_LOST  = 5,
    WL_DISCONNECTED     = 6
} wl_status_t;

Salut mickeypop ,

Je teste votre solution de:


WiFi.mode( WIFI_MODE_APSTA );
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

J'appelle WiFi.reconnect () lorsque l'événement SYSTEM_EVENT_STA_DISCONNECTED se produit, ce que j'ai essayé en déconnectant manuellement le routeur et semble fonctionner (ce bit fonctionnait également avant).

Jusqu'à présent, il a fonctionné pendant la nuit pendant 7 heures sans interruption sur 2 ESP32 différents. Je leur ai envoyé un ping toutes les 5 secondes et aucun problème jusqu'à présent. Je ne pouvais pas imaginer que la déclaration en mode mixte pouvait en être la raison, je pensais qu'elle était automatiquement activée lors de l'appel de WiFi.begin et WiFi.softAP () . Doigts croisés. Je vais commencer maintenant par des tests plus poussés pour confirmer que c'est la solution aux problèmes auxquels je suis confronté.

Au fait, merci beaucoup !!

@mickeypop @josmunpav merci d'avoir partagé vos découvertes.
Je l'ai ajouté au Wiki

Cela n'a aucun sens, cela indique qu'il y a un bogue dans enablesta ou activeoftap si le réglage du mode au préalable change le résultat. C'est pourquoi j'ai suggéré que cela soit spécifique au mode, les solutions de contournement ne devraient pas être nécessaires. Donc, le code de reproduction serait bien

Beaucoup de cela n'a pas de sens, comme @everslick l'a clairement souligné ci-dessus: https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356515973. En fait, je ne peux pas croire que j'ai publié cela il y a 6 mois et que j'en parlais encore alors que cela n'aurait jamais dû être un problème en premier lieu.

Pourquoi quelque chose s'appelle "reconnexion automatique" qui ne se reconnecte pas automatiquement est au-delà de la confusion. Tout le monde semble créer son propre code pour surmonter cette lacune / ce bogue. Je vais tirer une nouvelle copie du code et reflasher par suggestion @tablatronix, mais le point

Personnellement, j'ai toujours un problème avec la puce qui se verrouille complètement à l'occasion lorsqu'elle entre dans cette boucle de déconnexion. Je le fais compter jusqu'à 10 et redémarrer, mais au hasard (1 redémarrage sur 15 environ), il ne redémarre pas et se verrouille simplement, ce qui nécessite un redémarrage à froid. Je passerais à l'ESP8266 en un clin d'œil s'il avait de meilleures / plus d'entrées analogiques, mais ce n'est malheureusement pas le cas. Non pas que l'ESP32 soit très bon non plus (https://www.esp32.com/viewtopic.php?f=19&t=2881).

Dans esp8266, la reconnexion automatique est implémentée dans le SDK, dans esp32 il n'y a pas d'implémentation, donc il a été ajouté à la bibliothèque pour apporter une certaine forme de compatibilité, bien qu'il ne soit implémenté que pour WIFI_REASON_AUTH_EXPIRE .

Il peut être implémenté mais il doit être mis au point, et cette bibliothèque est toujours alpha donc il ne devrait vraiment y avoir aucune attente, le sdk est sujet à changement, tout le système d'événements est sujet à changement. La mise en œuvre de fonctionnalités de base comme celle-ci prend donc du temps.

Sans oublier que si espressif implémente cela dans le SDK, nous avons simplement perdu tout notre temps.

Quand je dis qu'il doit être réglé, je veux dire qu'il y a plusieurs problèmes en suspens qui doivent être résolus. C'est pourquoi je demande des croquis de test pour les personnes pour lesquelles la solution d'événement ci-dessus échoue.

  • reconnecter, peut échouer perdre l'affectation DHCP, par opposition à disconnect (), begin () **
  • la connexion automatique provoque une mauvaise émission de wl_status et une boucle infinie
  • sdk émet auth_expire pour auth_fail sur certains routeurs, déclencheurs ci-dessus
  • esp_wifi_set_mode est asynchrone, conditions de course
  • autoconnect, ne fonctionne même pas, https://github.com/espressif/arduino-esp32/issues/173

** reconnect does not enablesta, it just returns false, you should always be checking for return values!

Si vous utilisez ma solution de contournement ci-dessus, je suggère de désactiver la reconnexion automatique pour éviter 2 de ces bogues.

Salut les gars, je suis de retour avec un échantillon qui reproduit les problèmes auxquels je suis confronté. L'exemple est plein de commentaires mais consiste essentiellement en:

  1. Deux tâches: principale et web / wifi (implémentée par la bibliothèque mongoose 6.11)
  2. Certains objets partagés pour effectuer des tâches factices telles que la configuration de PWM sur une broche, la lecture de la valeur ADC moyenne et un compteur int partagé
  3. Une page de test sur http: // your_esp32_ip / que vous pouvez laisser en cours d'exécution et vous
  4. Un sémaphore pour éviter la corruption des données entre les tâches. La tâche principale effectue des changements sur la broche pwm, lit à partir de l'ADC et augmente le compteur. La tâche Web présente ces données sur la page d'accueil.
  5. Méthodes WiFi typiques pour la connexion, la déconnexion et la gestion des événements WiFi.
  6. Il fonctionne en mode APSTA, vous devez donc configurer votre propre WiFi (votre WiFi a besoin d'une connexion Internet car la page Web d'accueil utilise jQuery à partir d'un CDN pour effectuer des appels d'API implémentés par l'ESP32 dans l'exemple)

Ce que j'ai trouvé jusqu'à présent, c'est que si vous désactivez les tâches factices (il y a un indicateur pour cela), les deux tâches s'exécutent bien sans fin. Si vous les activez, alors finalement (peut parfois prendre des heures mais se produit normalement dans la première heure) l'ESP32 se déconnecte du WiFi et ne peut pas se reconnecter, en exécutant la tentative de connexion toutes les 10 secondes sans succès tout le temps.

Je pense qu'il y a des interférences entre la bibliothèque ADC ou PWM (implémentée par esp32-hal-ledc.h ), car je ne pouvais pas reproduire le problème lorsque la tâche principale ne faisait que faire une attente factice.

Une autre chose que j'ai remarquée, c'est lorsque la déconnexion se produit, le signal WiFi du point d'accès diminue beaucoup. J'ai vérifié cela sur mon smartphone.

Voici les messages typiques du journal WiFi que vous pouvez trouver en cas d'échec:

[WiFi-event] event: 5
Disconnected from WiFi. Trying connection again in 10000ms
Web/Main Task is up and running. Shared counter is 11309, Average ADC Value = 1305.000000, PWM Value = 0
Connecting to WiFi 'TP-LINK_A8FB38' with password: 'C1A8FB38' on connection attempt = 108
Oops, there was a problem when connecting. It returned error: 1[D][WiFiGeneric.cpp:293] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:298] _eventCallback(): Reason: 2 - AUTH_EXPIRE

Veuillez trouver le code source ci-joint et des exemples de pages:

working
not_working

ESP32_APSTA_Mode_Disconnection_Test.zip

PS: Ma vraie application fait un peu la même chose. Démarrage du mode APSTA avec deux tâches une pour la mise à jour des capteurs, des appareils et du GPIOS et la seconde pour la gestion du WiFi et du serveur Web implémenté par mangouste et confrontée au même problème.

J'ai construit ce croquis pour tester la connexion, obtenir le temps toutes les 10 secondes 10 fois, déconnecter le wifi, reconnecter le wifi. Cela semble fonctionner plutôt bien, donc je mets en œuvre mon autre code pour qu'il s'exécute pendant quelques jours car j'avais des problèmes de reconnexion.

#include <WiFi.h>
#include "time.h"

const char* ssid       = "ssid1";
const char* password   = "password1";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600;
const int   daylightOffset_sec = 3600;

byte wfConnectTry = 0;
byte loopCnt = 0;

void printLocalTime()
{
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

void setup()
{
  Serial.begin(115200);

  //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  //WiFi.begin(ssid, password);
  wifiStart();
  //init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  if (WiFi.status() == WL_CONNECTED) {
    printLocalTime();
  }

}

void loop()
{
  delay(10000);
  printLocalTime();
  while (WiFi.status() != WL_CONNECTED || wfConnectTry >=5) {
    wfConnectTry++;
    wifiReconnect();

  }
  if (loopCnt >= 10){
    wifiReconnect();
  }
  loopCnt++;
}

void wifiReconnect()
{
  Serial.println(F("Disconnecting"));
  WiFi.disconnect(true);
  delay(500);
  Serial.println(F("Starting WiFi!"));
  wifiStart();
  loopCnt = 0;
}

void wifiStart()
{
  unsigned long timer1 = millis();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED && millis() - timer1 < 5000UL) {
    delay(500);
    Serial.print(".");
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println(F(" CONNECTED"));
    wfConnectTry = 0;
  }
  else {
    Serial.println(F("Could not connect!"));
  }
}

.... merci pour le code tip @tablatronix

Utiliser le code clôtures trois ticks nouvelle ligne avant amd après

Voici une information intéressante. J'ai essayé toutes les astuces mentionnées dans ce fil et rien n'a fonctionné. Cependant, chaque fois que j'installe et exécute SimpleWiFiServer, les choses sont réinitialisées , puis je peux réinstaller mon application et les choses fonctionnent à nouveau.

Mon application se connecte très bien au WiFi et à un moment donné (des jours ou des semaines), elle perd la connexion et rien ne peut la faire se connecter. J'ai essayé toutes les astuces sur ce fil et nada. Comme je l'ai dit ci-dessus, la seule façon de rétablir la connexion de mon ESP32 au Wifi est d'installer cette autre application pour réinitialiser les choses. Je me demande ce qu'il fait pour que mon ESP32 fonctionne à nouveau avec le WiFi.

@gdombiak , avez-vous des informations de débogage pour montrer ce que fait l'ESP32 lorsqu'il se verrouille? J'ai eu un problème récent où l'un de mes croquis fonctionnait comme un champion, sauf quand le nouveau jour est arrivé et qu'il y avait deux lignes qui l'ont mis dans une boucle continue et l'ESP s'est finalement effondré jusqu'à ce que je réinitialise ou recharge. Un autre problème que j'ai eu était que j'avais un autre ESP qui était un AP_STA et qu'il essayait de s'y connecter plutôt que le WiFI normal. J'ai dû recharger l'autre ESP et stipuler WiFi.mode (WIFI_STA) pour résoudre ce problème.

@AIWIndustries

Consultez un article que j'ai publié sur: https://github.com/espressif/arduino-esp32/issues/1100
Recherchez « SmartConfig / WiFi skeleton »

J'ai écrit un squelette complet qui; enregistre, défini avec SmartConfig, traite du WiFi UP et DOWN, se reconnecte automatiquement si Down.

C'est une structure complète et s'est toujours reconnectée lorsque le WiFi est tombé en panne ou simplement déconnecté pour des raisons inconnues.

Prenez note dans loop () pour " // WiFi DOWN ". J'utilise un simple if () / else pour suivre l'état du WiFi.
En raison des bibliothèques espressif, il faut environ 30 à 40 secondes pour signaler que le WiFi est en panne, puis commence à chercher à se reconnecter.

Si le point d'accès est mis sous tension, il faut environ 30 secondes pour que le point d'accès démarre et 15 secondes supplémentaires pour se reconnecter, mais se reconnecte toujours.

@AIWIndustries

Il existe un moyen de rechercher un verrouillage si le Traceback est imprimé sur le terminal.

Installez "ESP Exception Decoder" à partir de; https://github.com/me-no-dev/EspExceptionDecoder
Les instructions sont là.

Une fois installé, copiez et collez simplement la ligne de trace et elle vous dira ce qui se passe au verrouillage.

Salut à tous,

Le code suivant fonctionne pour moi.

void wifiReconnect () {
while (WiFi.status ()! = WL_CONNECTED) {
WiFi.begin (ssid, mot de passe);
pour (int i = 0; i <= 50; i ++) {
digitalWrite (LED_BUILTIN, HIGH);
retard (100);
Serial.print (".");
digitalWrite (LED_BUILTIN, LOW);
retard (100);
}
}
}

Utilisez ceci dans la boucle () comme

if (WiFi.status ()! = WL_CONNECTED) {
wifiReconnect ();
}

Salut à tous
J'utilisais le noyau ESP32 mis à jour il y a environ 2 mois.
Dans mon programme, j'utilise Wifi.begin (ssid, pass) dans setup () et j'appelle la méthode WiFi.reconnect () sur l'événement "SYSTEM_EVENT_STA_DISCONNECTED". Le système se connectait automatiquement en cas de déconnexion. Mais hier, j'ai mis à jour le dernier noyau et cela a commencé à donner une erreur avec le code raison 8.
Après quelques succès et essais, j'ai commenté WiFi.reconnect () puis il a commencé à fonctionner parfaitement. Le wifi se reconnecte également automatiquement si AP est éteint et allumé.

Dans mon cas uniquement dans la méthode de configuration que j'utilise
WiFi.mode (WIFI_STA);
Wifi.begin ()

cela fonctionne correctement.
Pouvons-nous dire que dans le nouveau noyau, il n'est pas nécessaire d'appeler reconnect () et que la reconnexion automatique fonctionne maintenant dans le dernier noyau?

correct. il n'est plus nécessaire d'appeler reconnexion;) Je l'ai corrigé: P

Il y a un sérieux défaut dans le wifi.Reconnect ().

En regardant en profondeur les bibliothèques que j'ai trouvées dans plusieurs conditions, il se connectera sans faire de mise à jour DHCP, vous êtes donc connecté sans adresse IP. - Je l'ai signalé mais je n'ai pas encore vu de correctif.

J'ai prouvé cela une fois en ajoutant un appel UDP dans un code de test. - Je pouvais parler à l'AP par UDP mais je n'avais pas d'adresse IP. En même temps, le MAC est apparu sur la liste de connexion AP.

Vous souhaitez utiliser wifi.begin (), il est toujours fiable. - Vous devez simplement être sûr que vous êtes en panne lorsque vous l'appelez pour vous connecter ou vous pourriez vous retrouver avec des problèmes de débordement de pile.

_Le modèle que j'ai écrit ci-dessous n'a jamais manqué de se reconnecter ._ Il utilise SmartConfig et les préférences au lieu de coder en dur l'AP / Pass, bien que cela puisse facilement être changé.

Une partie de mon code est la propriété du clignotant LED, j'ai donc laissé des commentaires en place. Vous pouvez y mettre n'importe quel code indicateur.

Jetez un œil au wifi dans la partie inférieure de la boucle (). J'appelle WiFi.begin (PrefSSID.c_str (), PrefPassword.c_str ()); tout en testant toujours un état de retour de WL_CONNECTED.

J'espère que cela aide certains.

// ESP32 only,  8266 will not work here
#include "FS.h"
#include "esp_system.h"
#include <esp_wifi.h>
#include <string.h>
#include <WiFi.h>
#include <Preferences.h> // WiFi storage

const char* rssiSSID;        // NO MORE hard coded set AP, all SmartConfig
const char* password;
String PrefSSID, PrefPassword;   // used by preferences storage

int WFstatus;
int UpCount; = 0;
int32_t rssi;         // store WiFi signal strength here
String getSsid;
String getPass;
String MAC;

// SSID storage
  Preferences preferences;       // declare class object
// END SSID storage

void setup() {
  Serial.begin(115200);

  Serial.printf("\tWiFi Setup -- \n" ); 
  wifiInit();      // get WiFi connected
  IP_info();
  MAC = getMacAddress();

  delay(2000);  // let thing settle
} // END setup()

void loop()
{
  if ( WiFi.status() == WL_CONNECTED )
  {   // Main connected loop

         // ANY MAIN LOOP CODE HERE

  }   // END Main connected loop()
  else
  {      // WiFi DOWN

    //  wifi down start LED flasher here

    WFstatus = getWifiStatus( WFstatus );
    WiFi.begin(  PrefSSID.c_str() , PrefPassword.c_str() );
    int WLcount = 0;
    while (  WiFi.status() != WL_CONNECTED && WLcount < 200 )
    {
      delay( 100 );
      Serial.printf(".");

        if (UpCount >= 60)  // keep from scrolling sideways forever
        {
           UpCount = 0;
           Serial.printf("\n");
        }
        ++UpCount;
        ++WLcount;
    }

    if( getWifiStatus( WFstatus ) == 3 )   //wifi returns
    { 
      // stop LED flasher, wifi going up
    }
   delay( 1000 );
  } // END WiFi down
} // END loop()


void wifiInit() //
{
  WiFi.mode(WIFI_AP_STA); // required to read NVR before WiFi.begin()

  // load credentials from NVR, a little RTOS code here
  wifi_config_t conf;
  esp_wifi_get_config(WIFI_IF_STA, &conf);     // load wifi settings to struct comf
  rssiSSID = reinterpret_cast<const char*>(conf.sta.ssid);
  password = reinterpret_cast<const char*>(conf.sta.password);

  //  Serial.printf( "SSID = %s\n", rssiSSID );  // un-comment for debuging
  //  Serial.printf( "Pass = %s\n", password );  // un-comment for debuging
  // Open Preferences with wifi namespace. Namespace is limited to 15 chars
  preferences.begin("wifi", false);
    PrefSSID     = preferences.getString("ssid", "none"); //NVS key ssid
    PrefPassword = preferences.getString("password", "none"); //NVS key password
  preferences.end();

  // keep from rewriting flash if not needed
  if( !checkPrefsStore() )   // see is NV and Prefs are the same
  {                          // not the same, setup with SmartConfig
    if( PrefSSID == "none" ) // New...setup wifi
    {
      initSmartConfig();
      delay( 3000);
      ESP.restart(); // reboot with wifi configured
    }
  }

  // I flash LEDs while connecting here

  WiFi.begin( PrefSSID.c_str() , PrefPassword.c_str() );

  int WLcount = 0;
  while (WiFi.status() != WL_CONNECTED && WLcount < 200 ) // can take > 100 loops depending on router settings
  {
    delay( 100 );
    Serial.printf(".");
    ++WLcount;
  }
  delay( 3000 );

  // stop the led flasher here

} // END wifiInit()

// match WiFi IDs in NVS to Pref store, assumes WiFi.mode(WIFI_AP_STA); was executed
bool checkPrefsStore()
{
  bool val = false;
  String NVssid, NVpass, prefssid, prefpass;

  NVssid = getSsidPass( "ssid" );
  NVpass = getSsidPass( "pass" );

  // Open Preferences with my-app namespace. Namespace name is limited to 15 chars
  preferences.begin("wifi", false);
    prefssid  =  preferences.getString("ssid",     "none"); //NVS key ssid
    prefpass  =  preferences.getString("password", "none"); //NVS key password
  preferences.end();

  if( NVssid.equals(prefssid) && NVpass.equals(prefpass) )
  { 
    val = true; 
  }
  return val;
} // END checkPrefsStore()

void initSmartConfig()
{
  // start LED flasher here
  int loopCounter = 0;

  WiFi.mode( WIFI_AP_STA );     //Init WiFi, start SmartConfig
  Serial.printf( "Entering SmartConfig\n" );

  WiFi.beginSmartConfig();

  while (!WiFi.smartConfigDone())
  { // flash led to indicate not configured
    Serial.printf( "." );
    if( loopCounter >= 40 )
    {
      loopCounter = 0;
      Serial.printf( "\n" );
    }
    delay(600);
    ++loopCounter;
  }
  loopCounter = 0;

  // stopped flasher here

  Serial.printf("\nSmartConfig received.\n Waiting for WiFi\n\n");
  delay(2000 );

  while( WiFi.status() != WL_CONNECTED )
  { // check till connected
     delay(500);
  }
  IP_info();

  preferences.begin("wifi", false); // put it in storage
    preferences.putString( "ssid" ,    getSsid);
    preferences.putString( "password", getPass);
  preferences.end();

  delay(300);
} // END SmartConfig()

void IP_info()
{
  getSsid = WiFi.SSID();
  getPass = WiFi.psk();
  rssi = getRSSI( rssiSSID );
  WFstatus = getWifiStatus( WFstatus );
  MAC = getMacAddress();

  Serial.printf( "\n\n\tSSID\t%s, ", getSsid.c_str() );
  Serial.print( rssi);  Serial.printf(" dBm\n" );  // printf??
  Serial.printf( "\tPass:\t %s\n", getPass.c_str() ); 
  Serial.print( "\n\n\tIP address:\t" );  Serial.print(WiFi.localIP() );
  Serial.print( " / " );              Serial.println( WiFi.subnetMask() );
  Serial.print( "\tGateway IP:\t" );  Serial.println( WiFi.gatewayIP() );
  Serial.print( "\t1st DNS:\t" );     Serial.println( WiFi.dnsIP() );
  Serial.printf( "\tMAC:\t\t%s\n", MAC.c_str() );
}  // END IP_info()

int getWifiStatus( int WiFiStatus )
{
  WiFiStatus = WiFi.status();
  Serial.printf("\tStatus %d", WiFiStatus );
  switch( WiFiStatus )
  {
    case WL_IDLE_STATUS : // WL_IDLE_STATUS = 0,
        Serial.printf(", WiFi IDLE \n");
        break;
    case WL_NO_SSID_AVAIL: // WL_NO_SSID_AVAIL = 1,
        Serial.printf(", NO SSID AVAIL \n");
        break;
    case WL_SCAN_COMPLETED: // WL_SCAN_COMPLETED = 2,
        Serial.printf(", WiFi SCAN_COMPLETED \n");
        break;
    case WL_CONNECTED: // WL_CONNECTED = 3,
        Serial.printf(", WiFi CONNECTED \n");
        break;
    case WL_CONNECT_FAILED: // WL_CONNECT_FAILED = 4,
        Serial.printf(", WiFi WL_CONNECT FAILED\n");
        break;
    case WL_CONNECTION_LOST: // WL_CONNECTION_LOST = 5,
        Serial.printf(", WiFi CONNECTION LOST\n");
        WiFi.persistent(false); // don't write FLASH
        break;
    case WL_DISCONNECTED: // WL_DISCONNECTED = 6
        Serial.printf(", WiFi DISCONNECTED ==\n");
        WiFi.persistent(false); // don't write FLASH when reconnecting
        break;
  }
  return WiFiStatus;
}  // END getWifiStatus()

// Get the station interface MAC address.
// <strong i="14">@return</strong> String MAC
String getMacAddress(void)
{
  WiFi.mode(WIFI_AP_STA); // required to read NVR before WiFi.begin()
  uint8_t baseMac[6];
  esp_read_mac( baseMac, ESP_MAC_WIFI_STA ); // Get MAC address for WiFi station
  char macStr[18] = { 0 };
  sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", baseMac[0], baseMac[1], baseMac[2], baseMac[3], baseMac[4], baseMac[5]);
  return String(macStr);
}  // END getMacAddress()

// Return RSSI or 0 if target SSID not found
// const char* SSID = "YOUR_SSID"; // declare in GLOBAL space
// call: int32_t rssi = getRSSI(SSID);
int32_t getRSSI( const char* target_ssid )
{
  byte available_networks = WiFi.scanNetworks();

  for (int network = 0; network < available_networks; network++)
  {
    if ( strcmp( WiFi.SSID( network).c_str(), target_ssid ) == 0)
    {
      return WiFi.RSSI( network );
    }
  }
  return 0;
} // END getRSSI()

// Requires; #include <esp_wifi.h>
// Returns String NONE, ssid or pass arcording to request
// ie String var = getSsidPass( "pass" );
String getSsidPass( String s )
{
  String val = "NONE"; // return "NONE" if wrong key sent
  s.toUpperCase();
  if( s.compareTo("SSID") == 0 )
  {
    wifi_config_t conf;
    esp_wifi_get_config( WIFI_IF_STA, &conf );
    val = String( reinterpret_cast<const char*>(conf.sta.ssid) );
  }
  if( s.compareTo("PASS") == 0 )
  {
    wifi_config_t conf;
    esp_wifi_get_config( WIFI_IF_STA, &conf );
    val = String( reinterpret_cast<const char*>(conf.sta.password) );
  }
  return val;
}  // END getSsidPass()

J'ai remarqué cela aussi, mais je ne l'ai jamais réduit, mais j'ai remarqué que reconnect () and begin (ssid ..) ne réinitialise pas toujours DHCP, cas de bord je pense

Début (args)
ne refait dhcp que si config n'est pas égal ou n'est pas déjà connecté, sinon il retourne, ce qui pourrait être un problème.

    wifi_config_t current_conf;
    esp_wifi_get_config(WIFI_IF_STA, &current_conf);
    if(!sta_config_equal(current_conf, conf)) {
        if(esp_wifi_disconnect()){
            log_e("disconnect failed!");
            return WL_CONNECT_FAILED;
        }

        esp_wifi_set_config(WIFI_IF_STA, &conf);
    } else if(status() == WL_CONNECTED){
        return WL_CONNECTED;
    }
 // We do not always get here
    if(!_useStaticIp) {
        if(tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA) == ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED){
            log_e("dhcp client start failed!");
            return WL_CONNECT_FAILED;
        }
    } else {
        tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
    }

@mickeypop merci pour le partage de code. Mais j'ai un doute.
Comme tu dis:
I proved this once buy adding a UDP call in some test code. - I could talk to the AP by UDP but had no IP address. At the same time the MAC showed up on the AP connection list.

mais pour autant que je sache, nous ne pouvons pas établir de connexion UDP sans avoir une adresse IP. UDP est construit sur la couche IP.

@jjassar

UDP ne nécessite aucune adresse IP, juste son propre MAC.

UDP est l'endroit où se trouve la magie de SmartConfig. L'application sur votre cellule envoie un paquet UDP spécialement formaté uniquement pour l'ESP32 avec les informations d'identification AP.

Parce qu'UDP est sans connexion, tous les périphériques WiFi sur ou hors du point d'accès peuvent le voir.

Lorsque l'ESP32 voit cela, il envoie un UDP différent à l'AP pour obtenir une connexion et l'adresse IP de l'AP. N'oubliez pas qu'avant la connexion, il n'y a pas d'adresse IP.

UDP est la sous-couche utilisée dans DHCP pour obtenir l'IP en premier lieu, mais est également utilisé de nombreuses autres manières.

@mickeypop est-il possible que vous
TCP et UDP résident tous deux sur la couche de transport, qui est construite au-dessus de la couche Internet, où se trouve IP.

@mickeypop @bedenko vous avez peut-être tous les deux raison, je pense que cela pourrait être une diffusion UDP à l'adresse 255.255.255.255.
Quoi qu'il en soit, j'ai trouvé un nouveau problème avec le dernier repo.
J'avais un esp32 qui était connecté à AP, j'ai éteint l'AP et je l'ai remis en marche après un certain temps.
En cas de déconnexion si le code anomalie est 201 (REASON_NO_AP_FOUND), il se connecte automatiquement
Mais parfois, le code de raison de déconnexion 7 (REASON_NOT_ASSOCED) ne se reconnecte jamais, ne se reconnecte qu'après le redémarrage du matériel.
Pourquoi le code anomalie 7 arrive-t-il si j'ai désactivé AP?

Probablement, car le code 201 est supprimé ici , mais le code 7 est ignoré.

@jjassar @bedenko

Pensez-y un instant.
Il doit y avoir un protocole pour se connecter AVANT que l'appareil ait une adresse IP, sinon DHCP n'aurait aucun moyen de contacter le serveur DHCP pour «obtenir» une adresse IP.

J'ai été ingénieur réseau pendant plus de 30 ans et si UDP ne faisait pas partie intégrante de TCP / IP, vous auriez à reconfigurer les adresses IP à chaque fois que vous passiez à un autre réseau.

voici une petite introduction.

PROTOCOLE DHCP

Le protocole _DHCP est un protocole sans connexion utilisant les ports

DHCP fonctionne sur UDP car le client DHCP fonctionne sur les diffusions, qui ne peuvent être prises en charge que par UDP. Ceci est nécessaire car la machine cliente n'a toujours pas reçu d'adresse IP (c'est le but du protocole de négociation DHCP) et il n'y aurait aucun moyen d'établir un flux TCP sans l'adresse IP elle-même.

Le client DHCP commence par diffuser le paquet DHCP DISCOVER. La diffusion est reçue par le (s) serveur (s) DHCP, qui à leur tour répond par le message DHCP OFFER. Le message DHCP OFFER contient l'adresse IP proposée par le serveur et la période pour laquelle l'adresse IP est allouée (l'adresse IP peut être aléatoire ou basée sur une politique d'administration).

Le client DHCP peut recevoir plusieurs messages DHCP OFFER, mais il choisit un seul message DHCP OFFER en fonction de la stratégie configurée dans le client DHCP. Habituellement, c'est sur la base du premier arrivé, premier servi. Cependant, nous pouvons configurer le client DHCP pour choisir l'OFFRE DHCP ayant la durée de bail la plus longue ou un sous-réseau préféré. Le client DHCP répond maintenant avec le message DHCP REQUEST.

Le message DHCP REQUEST est un message de diffusion. Lorsque d'autres serveurs DHCP reçoivent ce message, ils retirent toutes les offres qu'ils auraient pu faire au client et renvoient l'adresse proposée au pool d'adresses disponibles. Le serveur DHCP prévu à la réception du message envoie un message DHCP ACK, confirmant ainsi la transaction et attribuant l'adresse IP à l'hôte pendant la durée spécifiée.

@mickeypop : je suis d'accord avec votre explication, sauf avec le fait qu'UDP peut fonctionner sans adresse IP. Toutes les négociations DHCP sont effectuées sur l'IP de diffusion 255.255.255.255 ( info ).

@bedenko
Vous devez à peu près être d'accord. Je l'ai coupé et collé directement à partir des documents officiels.

Vous avez à la fois raison et tort et voici pourquoi.

Tous les protocoles réseau utilisent la même structure de paquets. AppleTalk, TCP / IP, Arpnet, AIX, etc ... Cela leur permet de coexister sur le même Ethernet sans conflit.

La structure comprend des bits pour le protocole, le type, la somme de contrôle, la destination, etc. Tous recherchent les 24 (255.255.255.255) bits dans l'identificateur de destination comme identificateur spécial.

cela dit;

Le trafic IP est traité via un masque de réseau afin que tous les périphériques puissent déterminer si un paquet leur est destiné ou non ainsi que le routage.

UDP n'a pas de masque de réseau. Le 255.255.255.255 n'est pas destiné à l'expéditeur UDP ni même utilisé par eux, c'est ainsi que tous les autres périphériques voient l'identifiant spécial. Il n'est pas du tout traité comme une adresse IP dans ce cas.

REMARQUE: UDP envoie par MAC et non par IP.

Prenez DHCP par exemple, vous n'avez pas encore d'IP ou de masque de réseau, donc le périphérique passe en mode promiscuité à la recherche de tout paquet avec sa propre adresse MAC.

Un paquet DHCP DISCOVER est envoyé par UDP avec l'adresse MAC de l'expéditeur car le serveur DHCP doit savoir qui demande une adresse IP.

L'expéditeur ne peut clairement pas encore le traiter comme trafic IP et à cette fin, le serveur DHCP ne peut pas utiliser IP pour envoyer une réponse. D'où UDP.

Le message DHCP OFFER renvoyé par UDP doit inclure le MAC pour que le client sache que c'est pour lui. Notez que tout le trafic est structuré de la même manière, mais ce n'est pas encore du tout IP.

Ce n'est que lorsque toutes les négociations sont terminées que tout trafic IP est même possible.

=====
Séparément, je dois noter;
J'étais dans l'équipe en 1968-70 développant le système d'exploitation UNIX. C'est là que TCP / IP est né.
Nous avons utilisé une première version d'UDP avant même que TCP / IP n'existe.

@mickeypop Merci pour votre travail! Nous pouvons tous toucher le ciel parce que nous nous tenons sur les épaules des géants!

Mandrin.

Salut.
J'utilise ce code pour cela

  if (WiFi.status() != WL_CONNECTED)
{
  digitalWrite(26,0);
  WIFI_Connect();
} else {
  digitalWrite(26,1);
}

et, c'est la fonction "WIFI_Connect"

void WIFI_Connect ()
{
digitalWrite (26, HIGH);
WiFi.disconnect ();
Serial.println ("Reconectando WiFi ...");
WiFi.mode (WIFI_AP_STA);
WiFi.begin (ssid, mot de passe);
// Attendre la connexion
pour (int i = 0; i <50; i ++)
{
if (WiFi.status ()! = WL_CONNECTED) {
retard (500);
DigitalWrite (26,0);
Serial.print (".");
retard (500);
DigitalWrite (26,1);
}
}
DigitalWrite (26,0);
}

Pour moi, ce code fonctionne.
Obs: La version 2.3

comprendre

comprendre

définir WIFI_SSID "===="

définir WIFI_PASSWORD "==="

// ce projet Firebase a été supprimé
// vous devrez saisir vos propres informations Firebase

définir FIREBASE_HOST "home-automation-1122.firebaseio.com"

définir FIREBASE_AUTH "============"

définir LED1 5

définir LED2 4

définir LED3 0

définir LED4 2

définir LED5 14

définir LED6 12

définir LED7 13

définir LED8 15

void setup() {

pinMode (LED1, SORTIE);

digitalWrite (LED1,0);

pinMode (LED2, SORTIE);

digitalWrite (LED2,0);

pinMode (LED3, SORTIE);

digitalWrite (LED3,0);

pinMode (LED4, SORTIE);

digitalWrite (LED4,0);

pinMode (LED5, SORTIE);

DigitalWrite (LED5,0);

pinMode (LED6, SORTIE);

DigitalWrite (LED6,0);

pinMode (LED7, SORTIE);

DigitalWrite (LED7,0);

pinMode (LED8, SORTIE);

DigitalWrite (LED8,0);

Serial.begin (9600);

WiFi.begin (WIFI_SSID, WIFI_PASSWORD);

Serial.print ("connexion");

while (WiFi.status ()! = WL_CONNECTED) {

Serial.print (".");

retard (500);

}

Serial.println ();

Serial.print ("connecté:");

Serial.println (WiFi.localIP ());

Firebase.begin (FIREBASE_HOST, FIREBASE_AUTH);

Firebase.setInt ("LEDStatus", 0);

}

boucle void () {

if (Firebase.getInt ("champ1"))

{

digitalWrite (LED1, LOW);

}

autre

{
digitalWrite (LED1, HIGH);

}
if (Firebase.getInt ("champ2"))

{

digitalWrite (LED2, LOW);

}

autre

{

digitalWrite (LED2, HIGH);

}

if (Firebase.getInt ("champ3"))

{

digitalWrite (LED3, LOW);

}

autre

{
digitalWrite (LED3, HIGH);

}

if (Firebase.getInt ("champ4"))

{

digitalWrite (LED4, LOW);

}

autre

{

digitalWrite (LED4, HIGH);

}
if (Firebase.getInt ("champ5"))

{

digitalWrite (LED5, LOW);

}

autre

{

digitalWrite (LED5, HIGH);

}
if (Firebase.getInt ("champ6"))

{

digitalWrite (LED6, LOW);

}

autre

{

digitalWrite (LED6, HIGH);

}
if (Firebase.getInt ("champ7"))

{

digitalWrite (LED7, LOW);

}

autre

{

DigitalWrite (LED7, HIGH);

}
if (Firebase.getInt ("champ8"))

{

digitalWrite (LED8, LOW);

}

autre

{

digitalWrite (LED8, HIGH);

}

//Serial.println(Firebase.getInt("led1 "));
//Serial.println(Firebase.getInt("led2 "));
//Serial.println(Firebase.getInt("led3 "));
//Serial.println(Firebase.getInt("led4 "));
//Serial.println(Firebase.getInt("led5 "));
//Serial.println(Firebase.getInt("led6 "));
//Serial.println(Firebase.getInt("led7 "));
//Serial.println(Firebase.getInt("led8 "));

Serial.println ("...............");
if (Firebase.failed ()) // Rechercher les erreurs {

Serial.print ("paramètre / numéro a échoué:");

Serial.println (Firebase.error ());

revenir;

}

mon nodemcu esp8226 ne se reconnecte pas après la perte de connexion jusqu'à ce que je le rallume

Ce fil est pour esp32. Utilisez-vous esp8266, ou était-ce une faute de frappe?

esp82255 nodemcu

Le mar 11 septembre 2018 13 h 45 Bedenko, [email protected] a écrit:

Ce fil est pour esp32. Utilisez-vous esp8266, ou était-ce une faute de frappe?

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, affichez-le sur GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

Désolé c'est esp8266

Le mar 11 septembre 2018 13:48 Ijaz Ahmad, [email protected] a écrit:

esp82255 nodemcu

Le mar 11 septembre 2018 13 h 45 Bedenko, [email protected] a écrit:

Ce fil est pour esp32. Utilisez-vous esp8266, ou était-ce une faute de frappe?

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, affichez-le sur GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

quelqu'un ici m'aide?

Ce fil est pour un ESP32, pas un 8266. Essayez un autre dépôt.

pouvez-vous m'aider s'il vous plaît avec 8226

@vseven comment puis-je résoudre ce problème?

@ ijaz1122 regardez ici s'il y a un problème qui convient à votre problème. sinon ouvrez-en un nouveau là-bas.
vous demandez actuellement une solution sur un autre appareil. ce n'est pas le bon repo pour votre problème.

Salut à tous, enfin, ce code fonctionne pour connecter et reconnecter mon hotspot wifi / portable plusieurs fois

Merci à @ThiagoCas pour ses codes

`/ * * * * * * * * * * * *
Inclure les bibliothèques
* * * * * * * * * * * * /

comprendre

/ * * * * * * * * * * * *
Définir des constantes
* * * * * * * * * * * * /

define WIFISSID "== Votre SSID Wifi ==" // Mettez votre WifiSSID ici

define PASSWORD "== Votre mot de passe ==" // Mettez votre mot de passe wifi ici

// les constantes ne changeront pas. Utilisé ici pour définir un numéro de broche:
const int ledPin = 2; // le numéro de la broche LED

/ * * * * * * * * * * * *
Définir des variables
* * * * * * * * * * * * /
// Les variables changeront:
int ledState = LOW; // ledState utilisé pour régler la LED

intervalle int = 100; // intervalle auquel clignoter (millisecondes)

// En général, vous devez utiliser "unsigned long" pour les variables qui contiennent du temps
// La valeur deviendra rapidement trop grande pour qu'un int puisse être stocké
unsigned long previousMillis = 0; // stockera la dernière fois que la LED a été mise à jour

/ * * * * * * * * * * * *
Fonctions auxiliaires
* * * * * * * * * * * * /
void WIFI_Connect ()
{
WiFi.disconnect ();
Serial.println ("Connexion au WiFi ...");
WiFi.mode (WIFI_AP_STA);
WiFi.begin (WIFISSID, MOT DE PASSE);

pour (int i = 0; i <60; i ++)
{
if (WiFi.status ()! = WL_CONNECTED)
{
retard (250);
digitalWrite (ledPin, LOW);
Serial.print (".");
retard (250);
digitalWrite (ledPin, HIGH);
}
}
si (WiFi.status () == WL_CONNECTED)
{
Serial.println ("");
Serial.println ("WiFi connecté");
Serial.println ("Adresse IP:");
Serial.println (WiFi.localIP ());
}
digitalWrite (ledPin, 0);
}

/ * * * * * * * * * * * *
Fonctions principales
* * * * * * * * * * * * /

void setup()
{
Serial.begin (115200);

// définit la broche numérique comme sortie:
pinMode (ledPin, OUTPUT);
WIFI_Connect ();
}

boucle vide ()
{
non signé long currentMillis = millis ();

if (currentMillis - previousMillis> = intervalle)
{
if (WiFi.status ()! = WL_CONNECTED)
{
Serial.println ("wifi déconnecté");
WIFI_Connect ();
}
// enregistre la dernière fois que vous avez fait clignoter la LED
previousMillis = currentMillis;
// si la LED est éteinte, allumez-la et vice-versa:
si (ledState == LOW)
{
ledState = HAUT;
intervalle = 100;
}
autre
{
ledState = LOW;
intervalle = 2500;
}
// régler la LED avec le ledState de la variable:
digitalWrite (ledPin, ledState);
}
} `

Un nouveau firmware semble aider, va fermer ça.

@vseven par un firmware plus récent ... voulez-vous dire la dernière version du maître de cette bibliothèque? Je ne vois pas de nouveaux commits à maîtriser depuis le 26 septembre, alors demandez-vous si vous faites référence à autre chose.

Merci pour la clarification
Gaston

Je l'ai ouvert il y a plus d'un an maintenant, donc oui, plus récent que ces derniers mois.

Génial. Merci pour la clarification. Je ne sais pas quand j'ai mis à jour la dernière (il y a 2 mois?) Mais je n'ai jamais vu cette erreur après la dernière mise à jour (et cela se produisait une fois tous les deux mois). Je pensais avoir de la chance mais je vois maintenant que c'était plus que de la chance. ;)

Bon travail.
Gaston

Cela semble également aider:

    esp_wifi_set_ps(WIFI_PS_NONE);

@vseven

Un nouveau firmware semble aider, va fermer ça.

Bonjour,
J'ai toujours pensé que platformio en mettant à jour la bibliothèque arduino-esp32 était également capable de mettre à jour ce que vous avez appelé le firmware. Ai-je tort? Je souffre toujours de ce problème!

@vseven
Un nouveau firmware semble aider, va fermer ça.

Bonjour,
J'ai toujours pensé que platformio en mettant à jour la bibliothèque arduino-esp32 était également capable de mettre à jour ce que vous avez appelé le firmware. Ai-je tort? Je souffre toujours de ce problème!

Pareil ici. Voudrais avoir un pointeur sur la façon de mettre à jour le micrologiciel par platformio pour contourner moi-même le problème de déconnexion ...

@vseven
Les instructions de configuration et de mise à jour de Platform IO sont traitées ici
https://github.com/espressif/arduino-esp32/blob/master/docs/platformio.md

un petit peu cependant: sur Arduino et Platform IO, lorsque j'utilise git pour mettre à jour le SDK, j'ai parfois trouvé que la mise à jour n'était pas complète et avait des problèmes.

Renommez le dossier esp32 et réinstallez à partir d'un nouveau git et j'ai toujours eu une mise à jour propre.
Suivez simplement leurs instructions.

@mickeypop : eh bien, ma platformio est sur la dernière version stable, mais j'ai toujours le problème de déconnexion. Proposez-vous plutôt d'utiliser la version stage ou amont? L'écurie a été mise à jour il y a seulement quelques jours, d'ailleurs.

@ Miq1 ce problème existe-t-il si vous utilisez uniquement l'exemple IDF?

Je dois avouer que j'utilise l'Arduino uniquement dans l'environnement Platformio - je n'ai jamais traité avec l'IDF. Je vais l'examiner aujourd'hui pour voir si je peux y installer une version de base de mon application.

Juste pour les informations: j'ai trouvé que la solution de contournement avec disconnect () et begin () subséquente fonctionne pour moi si je fais un mode (WIFI_OFF) et un mode (WIFI_STA) entre les deux. J'essaye actuellement la reconnexion 5 fois de suite et ferais un esp.restart () si toutes les tentatives échouaient, mais jusqu'à présent, aucun redémarrage n'était nécessaire.

J'ai observé quelques redémarrages entre-temps, donc la solution de contournement ne semble pas être aussi efficace.

Y a-t-il une mise à jour sur ce bogue?

FWIW Je vois cela souvent sur les unités ESP8266 aussi - exactement les mêmes symptômes. J'ai trouvé que je pouvais changer la connexion assez radicalement simplement en orientant l'unité différemment - cela semble donc être lié à la façon dont les unités (ESP8266 et ESP32) réagissent au mauvais signal.

Étant donné que j'utilise NonOS et un ESP8266, le dénominateur commun semble être le réseau de bas niveau en dessous de lwIP

(Utilisation de la version 1.0.4 d'Arduino-esp32)

J'ai eu le même problème ici (en utilisant ESP32). J'ai constaté que le redémarrage du routeur résout le problème ... une fois . Autrement dit, après le redémarrage, l'ESP32 est capable de se connecter au point d'accès, d'obtenir une adresse IP et de rester connecté, mais si quelque chose provoque l'échec de la connexion (comme le redémarrage de l'ESP32), l'ESP32 ne pourra jamais se connecter au AP à nouveau_.

Le routeur est un TP-Link TL-MR2030 que je garde pour les tests Ethernet filaire et dont le firmware est désespérément obsolète depuis des années et aucun firmware officiel plus récent n'existe.

Cependant, si j'essaie d'utiliser d'autres points d'accès, comme certaines unités Ubiquiti tout à fait nouvelles au bureau, le problème ne se produit tout simplement pas du tout. J'ai même soulevé des soupçons sur le personnel informatique en forçant la carte à redémarrer et à se reconnecter délibérément à plusieurs reprises aussi vite que possible pendant des heures ... et aucun problème du tout.

_Ainsi, à la fin, s'il est possible que quelque chose ne va pas ou soit incomplet dans les bibliothèques de l'ESP32, je suis prêt à mettre tout le blâme sur le firmware de l'ancien routeur._ Il est temps d'obtenir un nouveau routeur pour les tests, pas de TP-LINK , toutefois.

Je soupçonne généralement DNS pour des choses comme ça. Ou parfois le routeur pense toujours que vous êtes connecté et ne vous permet jamais de vous reconnecter

Non, le routeur n'est pas à blâmer. Au moins dans mon cas. Bien sûr, ce n'est pas le plus récent (wnr2200) mais avec un DD-WRT à jour installé et plusieurs appareils Android, Linux et Windows fonctionnant sans problèmes.

Pour enfin résoudre ce problème par moi-même, j'ai recommencé avec une toute nouvelle implémentation, basée sur WiFiClientEvents.ino - donc basée sur les événements. J'ai également lu les derniers messages de commit d'arduino-esp32 qui ont révélé des commits très récents mais pertinents. J'ai dû faire un débogage dans WiFiGeneric.cpp et j'ai constaté que le mode ne faisait pas toujours ce que j'attendais (https://github.com/espressif/arduino-esp32/issues/1306).

Résultat final: avec un petit patch sur WiFiGeneric.cpp (voir fin de fichier), j'ai pu me connecter et me déconnecter plusieurs fois de / vers mon AP - hourra :)

Faites-moi savoir si vous voyez quelque chose à améliorer.

/*
 * This is a very stable example of repeated connecting and disconnecting to/from a wifi access point on STA32
 * Unfortunately, it needs patching of the WiFiGeneric.cpp library file
 * Author: Daniel Alder, based on the example WiFiClientEvents.ino
 * Tested with Arduino 1.8.5 and 1.8.10 with ESP library from Nov 11 2019 (cec3fca4) + patch
*/

#include <WiFi.h>   

#include "HomeWifiConfig.h" // use an extra include or uncomment the following 2 lines
//const char* ssid     = "myssid"; // your network SSID (name of wifi network)
//const char* password = "****";   // your network password

typedef enum {
  MYSTATE_OFFLINE = 0,
  MYSTATE_CONNECTING,
  MYSTATE_ONLINE,
  MYSTATE_DISCONNECTING
} mystate_t;
mystate_t mystate = MYSTATE_OFFLINE;
long state_since = 0;

#define TIMEOUT_ONLINE     20  // reconnect after this [s] offline time
#define TIMEOUT_OFFLINE    20  // disconnect after this [s] online time
#define TIMEOUT_CONNECTING 20  // cancel connecting after this [s] without success

////////////////////////////////////////////////////////////////////////////////

long getUptime() {
  return esp_timer_get_time() / 1000000L;
}

void changeState(mystate_t state) {
  mystate = state;
  state_since = getUptime();
}

void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
{
    Serial.printf("[WiFi-event] event: %d\n", event);

    switch (event) {
        case SYSTEM_EVENT_WIFI_READY: 
            Serial.println("WiFi interface ready");
            break;
        case SYSTEM_EVENT_SCAN_DONE:
            Serial.println("Completed scan for access points");
            break;
        case SYSTEM_EVENT_STA_START:
            Serial.println("WiFi client started");
            break;
        case SYSTEM_EVENT_STA_STOP:
            Serial.println("WiFi client stopped");
            changeState(MYSTATE_OFFLINE);
            break;
        case SYSTEM_EVENT_STA_CONNECTED:
            Serial.println("Connected to access point");
            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            Serial.println("Disconnected from WiFi access point");
            break;
        case SYSTEM_EVENT_STA_AUTHMODE_CHANGE:
            Serial.println("Authentication mode of access point has changed");
            break;
        case SYSTEM_EVENT_STA_GOT_IP:
            Serial.print("Obtained IP address: ");
            //Serial.println(WiFi.localIP());
            //Serial.println("WiFi connected");
            //Serial.print("IP address: ");
            Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));

            changeState(MYSTATE_ONLINE);

            break;
        case SYSTEM_EVENT_STA_LOST_IP:
            Serial.println("Lost IP address and IP address is reset to 0");
            //changeState(MYSTATE_OFFLINE);
            break;
        case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:
            Serial.println("WiFi Protected Setup (WPS): succeeded in enrollee mode");
            break;
        case SYSTEM_EVENT_STA_WPS_ER_FAILED:
            Serial.println("WiFi Protected Setup (WPS): failed in enrollee mode");
            break;
        case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:
            Serial.println("WiFi Protected Setup (WPS): timeout in enrollee mode");
            break;
        case SYSTEM_EVENT_STA_WPS_ER_PIN:
            Serial.println("WiFi Protected Setup (WPS): pin code in enrollee mode");
            break;
        case SYSTEM_EVENT_AP_START:
            Serial.println("WiFi access point started");
            break;
        case SYSTEM_EVENT_AP_STOP:
            Serial.println("WiFi access point  stopped");
            break;
        case SYSTEM_EVENT_AP_STACONNECTED:
            Serial.println("Client connected");
            break;
        case SYSTEM_EVENT_AP_STADISCONNECTED:
            Serial.println("Client disconnected");
            break;
        case SYSTEM_EVENT_AP_STAIPASSIGNED:
            Serial.println("Assigned IP address to client");
            break;
        case SYSTEM_EVENT_AP_PROBEREQRECVED:
            Serial.println("Received probe request");
            break;
        case SYSTEM_EVENT_GOT_IP6:
            Serial.println("IPv6 is preferred");
            break;
        case SYSTEM_EVENT_ETH_START:
            Serial.println("Ethernet started");
            break;
        case SYSTEM_EVENT_ETH_STOP:
            Serial.println("Ethernet stopped");
            break;
        case SYSTEM_EVENT_ETH_CONNECTED:
            Serial.println("Ethernet connected");
            break;
        case SYSTEM_EVENT_ETH_DISCONNECTED:
            Serial.println("Ethernet disconnected");
            break;
        case SYSTEM_EVENT_ETH_GOT_IP:
            Serial.println("Obtained IP address");
            break;
        default: break;
    }
}

#include "esp_wifi.h" // only for fixWifiPersistencyFlag()
/**
 * Disable persistent mode, see https://github.com/espressif/arduino-esp32/issues/1393
 */
void fixWifiPersistencyFlag() {
  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  Serial.printf("cfg.nvs_enable before: %d\n", cfg.nvs_enable);
  cfg.nvs_enable = 0;
}

////////////////////////////////////////////////////////////////////////////////

void setup()
{
  Serial.begin(115200);
  Serial.println("-----------------------------------------");
  Serial.println("THIS IS: newWifiImplementationUsingEvents");
  Serial.println("-----------------------------------------");

  WiFi.persistent(false);
  fixWifiPersistencyFlag();

  //Serial.setDebugOutput(true); 
  //WiFi.printDiag(Serial); 

  // delete old config
  WiFi.disconnect(true);

  state_since = getUptime();

  delay(1000);

  // warning: only the last defined event handler gets events!
  WiFi.onEvent(WiFiEvent);

  Serial.println("End of setup");
}

bool firstTime = true;

void loop()
{
  long uptime = getUptime();
  if (mystate == MYSTATE_ONLINE && state_since + TIMEOUT_ONLINE < uptime) {
    Serial.println("Disconnecting NOW");
    changeState(MYSTATE_DISCONNECTING);
    WiFi.disconnect(true);
    WiFi.mode(WIFI_OFF);
  } else if (mystate == MYSTATE_OFFLINE && state_since+TIMEOUT_OFFLINE < uptime) {
    Serial.println("Connecting NOW");
    changeState(MYSTATE_CONNECTING);
    if (firstTime) {
      Serial.println("(firstTime)");
      WiFi.begin(ssid, password);
      firstTime = false;
    } else {
      // doesn't work without WiFiGeneric.cpp patch below
      WiFi.mode(WIFI_STA);
      WiFi.reconnect();
    }
  } else if (mystate == MYSTATE_CONNECTING && state_since+TIMEOUT_CONNECTING < uptime) {
    Serial.println("Cancelling NOW after no connect success");
    changeState(MYSTATE_DISCONNECTING);
    WiFi.disconnect(true);
    WiFi.mode(WIFI_OFF);
  }

  delay(1000);
  if (uptime % 10 == 0) {
    Serial.printf("uptime %d\n", uptime);
  }
}

/* PATH FOR LIBRARY
diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp
index e562921..aab5805 100644
--- a/libraries/WiFi/src/WiFiGeneric.cpp
+++ b/libraries/WiFi/src/WiFiGeneric.cpp
@@ -483,8 +483,10 @@ void WiFiGenericClass::enableLongRange(bool enable)
 bool WiFiGenericClass::mode(wifi_mode_t m)
 {
     wifi_mode_t cm = getMode();
+    log_d("mode() cm=%d, m=%d", cm, m);
     if(cm == m) {
-        return true;
+        log_d("HACK: skip return true");
+        //return true;
     }
     if(!cm && m){
         if(!wifiLowLevelInit(_persistent)){
*/


/* ISSUES:
 *  
 * 1) The example WiFiClientEvents.ino says:
 * 
 *   WiFi.onEvent(WiFiEvent);
 *   WiFi.onEvent(WiFiGotIP, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);
 *   
 *   but the WiFiEvent function never receives a SYSTEM_EVENT_STA_GOT_IP!
 *   
 * 2) I used code from https://github.com/espressif/arduino-esp32/issues/1393 to fix the persistent config issue
 * 
 * 3) The list of events in WiFiClientEvents.ino (comment block) is missing an event. Same bug as fixed in 188560e7f33
 * 
 * 4) Without pathing of WiFiGeneric.cpp, the mode() function doesn't do anything anymore once WiFi it was initialized (not even connected)
 * 
 *   see also: https://github.com/espressif/arduino-esp32/issues/1306 (but the this patch is not yet mentioned there)
 * 
 * 5) just a note: there is a STA_LOST_IP event, 2 minutes after disconnecting. 
 *   So if you want to make your code stable, you should also test with TIMEOUT_OFFLINE > 130
 */

Quelqu'un a-t-il demandé cela?

J'ai eu un problème similaire avec un arduino wifi rev 2 (matériel différent, mais les problèmes de négociation entre l'ap et l'appareil étaient étrangement similaires.)

https://github.com/arduino/nina-fw/issues/14

@mrarmyant Qu'attendez-vous de voir en utilisant WireShark? Je pense que nous parlons de problèmes sur les couches OSI 1 et 2. Autrement dit: pas de SSID, pas de fréquence, pas de paquets

Mon code (au-dessus de votre message) est stable depuis que je l'ai publié. Mais je ne pense pas que le problème soit portable sur quelque chose de différent des puces ESP * car il résout les problèmes du SDK ESP, pas d'Arduino

Je blâme des problèmes comme celui-ci sur l'alimentation électrique

Je ne blâmerais pas le PS, c'est très peu probable à moins que vous n'ayez une offre vraiment faible, cela ne se produira pas.

Wireshark est vraiment inutile ici.

Pour comprendre, vous devez creuser profondément dans les bibliothèques RTOS où le vrai travail est fait, pas dans les bibliothèques Arduino car elles sont un wrapper.

Si vous utilisez WiFi.reconnect () au lieu de WiFi.begin (), vous devez connaître certaines choses.

WiFi.begin () commence par définir tous les registres nécessaires sur la puce wifi et les états RTOS avant de se connecter, reconnect () ne le fait pas.
Cela a été rapporté il y a plus de 2 ans.

WiFi.reconnect () n'effectue souvent que la moitié de la connexion, établissant une connexion MAC au niveau de la puce avec UDP mais n'établissant jamais la connexion TCP / IP car ce sont des protocoles séparés. Cela est dû au fait que les états nécessaires ne sont pas prédéfinis par reconnect (), il suppose simplement qu'ils sont là.
C'est pourquoi certains d'entre vous n'obtiennent pas le SYSTEM_EVENT_STA_GOT_IP lors de la reconnexion.

Rappelles toi; une reconnexion est nécessaire car les états ont déjà changé.

Je reconnecte TOUJOURS avec WiFi.begin () et je n'ai jamais échoué.

======
quant à une réinitialisation ne se connectant pas et disant qu'il y a déjà une connexion, vous devez connaître DHCP.
L'adresse IP DHCP est généralement rétablie toutes les 15 secondes.
Maintenant, disons 2 secondes après le rétablissement, vous appuyez sur la réinitialisation.
Le serveur DHCP ne va pas libérer l'adresse IP pendant 13 secondes supplémentaires et en essayant de se connecter, il le signalera en cours d'utilisation.

Un simple délai au démarrage avant la connexion a résolu ce problème à chaque fois.
Si vous configurez plusieurs autres bibliothèques, définissez-les toutes avant WiFi.begin ().

Une bonne minuterie de démarrage aidera ici.
prendre un long var = millis (); dans la première ligne de setup () et Serial.print (millis () - var); juste avant WiFi.begin () et découvrez à quelle vitesse vous démarrez réellement. Puis ajustez en conséquence.

J'utilise l'ESP32 depuis plus de 6 ans et cela a toujours fonctionné.

METTRE À JOUR; Je vois beaucoup de WiFiEvent utilisé et pour le débogage, mais pour simplement détecter le wifi en panne et reconnecter l'IF / ELSE ci-dessous fonctionne de manière fiable à chaque fois.

cela fonctionne car il faut environ 18 secondes entre le début et le signalement du changement WL_CONNECTED, ce qui donne au serveur DHCP le temps de libérer l'adresse IP pour une reconnexion fiable plus tard.

Cela fonctionne depuis plus de 6 ans et ça compte.

loop()
{
  if ( WiFi.status() ==  WL_CONNECTED ) 
  {
    // WiFi is UP,  do what ever
  } else
  {
    // wifi down, reconnect here
   WiFi.begin(  );
    int WLcount = 0;
    while (WiFi.status() != WL_CONNECTED && WLcount < 200 ) 
    {
      delay( 100 );
         Serial.printf(".");
         if (UpCount >= 60)  // just keep terminal from scrolling sideways
         {
            UpCount = 0;
               Serial.printf("\n");
         }
         ++UpCount;
      ++WLcount;
    }
  }
} // END loop()

jetez un œil au code squelette que j'ai posté sur https://github.com/espressif/arduino-esp32/issues/1100

même si c'était pour la configuration avec SmartConfig, cela fonctionne.

@mrarmyant Qu'attendez-vous de voir en utilisant WireShark? Je pense que nous parlons de problèmes sur les couches OSI 1 et 2. Autrement dit: pas de SSID, pas de fréquence, pas de paquets

Mon code (au-dessus de votre message) est stable depuis que je l'ai publié. Mais je ne pense pas que le problème soit portable sur quelque chose de différent des puces ESP * car il résout les problèmes du SDK ESP, pas d'Arduino

Je ne faisais pas vraiment référence à arduino, mais au socle wifi qui est à bord de cette unité particulière. Il avait des problèmes de reconnexion en raison du fait qu'il était sympa avec DHCP. Quelqu'un a signalé que le redémarrage de son routeur l'a corrigé, ce qui est le problème que nous avons eu (bien redémarrer un serveur Windows DHCP). Il y avait un problème avec la façon dont il reconnaissait s'il avait été déconnecté ou non. Je pensais juste que cela pourrait aider avec ces problèmes là-haut, car aucune des deux unités ne s'afficherait jamais comme connectée sur les reconnexions, et WireShark nous a montré pourquoi. Les adresses IP statiques n'ont eu aucun problème. Il a fini par être le firmware wifi soc qui a dû être corrigé pour gérer le délai mentionné pour les problèmes DHCP. Tous ont été découverts via WireShark.

Cette page vous a été utile?
5 / 5 - 1 notes