Où sommes nous ?

Retour

Gestion du WiFi par évenements

La magorité du code que l'on peut trouver pour connecter son ESP à un réseau utilise une boucle ...

WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
}

Sauf qu'on peut faire beaucoup mieux en utilisant ...

Les évènements

La bibliothèque WiFi vient avec un exemple .../libraries/WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino (je vous laisse regarder, les sources sont claires). En particulier, il contient la liste des évènements reconnus :

0  SYSTEM_EVENT_WIFI_READY               < ESP32 WiFi ready
1  SYSTEM_EVENT_SCAN_DONE                < ESP32 finish scanning AP
2  SYSTEM_EVENT_STA_START                < ESP32 station start
3  SYSTEM_EVENT_STA_STOP                 < ESP32 station stop
4  SYSTEM_EVENT_STA_CONNECTED            < ESP32 station connected to AP
5  SYSTEM_EVENT_STA_DISCONNECTED         < ESP32 station disconnected from AP
6  SYSTEM_EVENT_STA_AUTHMODE_CHANGE      < the auth mode of AP connected by ESP32 station changed
7  SYSTEM_EVENT_STA_GOT_IP               < ESP32 station got IP from connected AP
8  SYSTEM_EVENT_STA_LOST_IP              < ESP32 station lost IP and the IP is reset to 0
9  SYSTEM_EVENT_STA_WPS_ER_SUCCESS       < ESP32 station wps succeeds in enrollee mode
10 SYSTEM_EVENT_STA_WPS_ER_FAILED        < ESP32 station wps fails in enrollee mode
11 SYSTEM_EVENT_STA_WPS_ER_TIMEOUT       < ESP32 station wps timeout in enrollee mode
12 SYSTEM_EVENT_STA_WPS_ER_PIN           < ESP32 station wps pin code in enrollee mode
13 SYSTEM_EVENT_AP_START                 < ESP32 soft-AP start
14 SYSTEM_EVENT_AP_STOP                  < ESP32 soft-AP stop
15 SYSTEM_EVENT_AP_STACONNECTED          < a station connected to ESP32 soft-AP
16 SYSTEM_EVENT_AP_STADISCONNECTED       < a station disconnected from ESP32 soft-AP
17 SYSTEM_EVENT_AP_STAIPASSIGNED         < ESP32 soft-AP assign an IP to a connected station
18 SYSTEM_EVENT_AP_PROBEREQRECVED        < Receive probe request packet in soft-AP interface
19 SYSTEM_EVENT_GOT_IP6                  < ESP32 station or ap or ethernet interface v6IP addr is preferred
20 SYSTEM_EVENT_ETH_START                < ESP32 ethernet start
21 SYSTEM_EVENT_ETH_STOP                 < ESP32 ethernet stop
22 SYSTEM_EVENT_ETH_CONNECTED            < ESP32 ethernet phy link up
23 SYSTEM_EVENT_ETH_DISCONNECTED         < ESP32 ethernet phy link down
24 SYSTEM_EVENT_ETH_GOT_IP               < ESP32 ethernet got IP from connected AP
25 SYSTEM_EVENT_MAX

Visiblement, il existerait une API équivalente pour ESP8266 mais elle semble beaucoup plus confidentielle. La seule référence que j'ai trouvé est le fichier hardware/esp8266/<version>/tests/device/test_WiFi_events/test_WiFi_events.ino

Il faudra que j'essaie un jour ...

Les évènements interessants

Pour se connecter à un réseau en tant que client, voici les évènements qui me paraissent intéressants :

Le code

WiFi.onEvent()

La première chose à faire (avant donc même d'activer le WiFi), c'est d'enregistrer des gestionnaires d'évènements par la méthode

WiFi.onEvent( gestionnaire, signal );

Par exemple avec

WiFi.onEvent( debugWiFiEvent );
WiFi.onEvent( getConnecting, WiFiEvent_t::SYSTEM_EVENT_WIFI_READY );

l'évènement WiFiEvent_t::SYSTEM_EVENT_WIFI_READY lancera à la fois debugWiFiEvent() et getConnecting().

Démarrage du WiFi

Par le classique

WiFi.begin(ssid, password);

Gestionnaires d'évènements

Voici quelques gestionnaires interessants :

Pour l'évènement WiFiEvent_t::SYSTEM_EVENT_STA_STOP

void getStop( WiFiEvent_t event, WiFiEventInfo_t info ){
    WiFi.disconnect(true);
}

Pour se connecter à un réseau, l'adaptateur WiFi effectue un calibrage pour obtenir le meilleur signal. Pour que les connexions suivantes soient plus rapides, il stocke les informations récoltées pour éviter de devoir le faire à chaque fois.
Sauf que la connexion n'est jamais strictement identique sur un appareil mobile tel qu'une montre. Du coup, il FAUT effacer le calibrage précédent faute de quoi notre montre ne se reconnectera jamais.

Pour WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED

void getDisconnected( WiFiEvent_t event, WiFiEventInfo_t info ){
    WiFi.mode(WIFI_OFF);
}

Nous avons perdu la connexion : autant stoppé le WiFi pour économiser de la batterie. Il faut donc évidemment que l'utilisateur en soit inverti, par exemple en changeant l'icône WiFi.

Rien ne vaut un message explicite pour débugger.

static void debugWiFiEvent(WiFiEvent_t event){
    Serial.printf("[WiFi-event] event: %d ", event);
}

Associé à

WiFi.onEvent( debugWiFiEvent );

Si le code est légèrement plus complexe, utiliser les évènements présente 2 énormes avantages :


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2022
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.