ESP32 WIFI.AP Récupérer la liste des appareils connectés sur votre router (avec AID, IP, Mac et RSSI) sur V.5

Bonjour à tous.

Pour des raisons qui me sont propres, j'en entrepris de coder un ESP32 afin qu'il me serve de router internet.

N'étant pas très familier avec les class WIFI des esp, quel galère ça a été! J'ai remarqué qu'il y avait eu beaucoup de changement dans les class WIFI au fil du temps et des évolutions de la librairie.
Entre le soft.ap qui est remplacé par le AP (mais toujours là pour compatibilité), et d'autre dépendances qui sont devenue obsolètes ou qui ont disparues ou ne sont plus compatible avec les modules récents, j'ai pas mal mouliné, d'autant plus que pas mal de tuto sont un peu anciens et proposent encore d'utiliser ces anciennes fonctions inutilisable (ou qui ne seront peut être plus utilisable à la prochaine Maj).
Du coup pour éviter à d'autre de passer autant de temps à lire et chercher dans les docs, à passer des heures à tester, raté, réessayer, je vous propose quelque bouts de code récents qui fonctionneront avec les derniers modules.

Celui qui m'a le plus pris le bec, c'est la méthode pour récupérer la liste des IP des appareils qui sont connecté sur mon router WIFI.AP.
Pour ce faire dans les tutos que l'ont trouve sur le net et ici dans le forum, ça passe principalement par l'utilisation des listes 'wifi_sta_list_t' (qui elle est toujours fonctionnelle) pour les adresse mac, et pour les adresses IP 'tcpip_adapter_list_t' qui lui n'existe plus, il migré vers ' esp_netif_list_t' qui lui même a disparu des radars avec la V.4 . Pour l'AID, je n'avais rien trouvé sur le sujet.

Voici donc une fonction qui vous permettra de récupérer la liste des devices connectés sur l'AP de votre ESP, avec leur adresse IP attribués, leur adresses mac, leur RSSI et leur AID. Code qui fonctionne parfaitement aujourd'hui sur la V.5.4

Un simple appel n'importe où dans votre code pour récupérer ces données ( AnalyseConnecte(); ) , à condition bien sûr que le WIFI.AP soit démarré et que votre router soit créé.
Ne pas oublier de déclarer #include <esp_wifi_ap_get_sta_list.h> qui, je ne sais pour quel raison, n'est pas inclus dans les class espWIFI

En espérant que cela puisse aider!

#include <WiFi.h>
#include <esp_wifi.h>
#include <esp_wifi_ap_get_sta_list.h>  //Ne pas oublier de le déclarer, je ne sais pour quel raison, n'est pas inclus dans les class espWIFI


void AnalyseConnecte()
  {
  wifi_sta_list_t wifi_sta_list;
  memset(&wifi_sta_list, 0, sizeof(wifi_sta_list));     //Les 2 memset sont là au cas où vous ayez besoin de placer ce code dans une boucle, il permet de supprimer les données de la dernière itération.
  esp_wifi_ap_get_sta_list(&wifi_sta_list);

  wifi_sta_mac_ip_list_t wifi_sta_ip_mac_list;
  memset(&wifi_sta_ip_mac_list, 0, sizeof(wifi_sta_ip_mac_list));
  esp_wifi_ap_get_sta_list_with_ip(&wifi_sta_list, &wifi_sta_ip_mac_list);

  //Renvoi une liste avec tous les appareils connectés sur votre Router.
  //On fait une boucle sur cette liste pour obtenir pour chaque appareil connecté, son IP, son Mac, son Aids et le RSSI.
  //Libre à vous d'utiliser' ces données à votre convenance avec du code.



    Serial.print  ("                 - Nombre d'appareils connectés:  ");  Serial.println(wifi_sta_list.num);
    Serial.println("-------------------------------------------------------------------------------------");

  for (int i =0; i < wifi_sta_list.num ; i++)
    { 
    wifi_sta_info_t station = wifi_sta_list.sta[i];
    esp_netif_pair_mac_ip_t station2 = wifi_sta_ip_mac_list.sta[i];
    uint16_t aidDevice;  esp_wifi_ap_get_sta_aid(station.mac, &aidDevice);

    char mac[20];
    for (int j=0; j<6; j++) {sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", station.mac[0], station.mac[1], station.mac[2], station.mac[3], station.mac[4], station.mac[5] );}


        Serial.print("                 - AID:           ");  Serial.println (aidDevice);
        Serial.print("                 - Mac Adresse:   ");  Serial.println (mac);
        Serial.print("                 - IP attribuée:  ");  Serial.println (IPAddress (station2.ip.addr) );
        Serial.print("                 - RSSI:          ");  Serial.println (station.rssi);
        Serial.println("-------------------------------------------------------------------------------------");
        Serial.println();
        Serial.println();
    }
  } 

merci du partage

une petite note :

ce ne sont pas tous les appareils, le type wifi_sta_list_t

a une taille limitée pour conserver la liste des équipements à ESP_WIFI_MAX_CONN_NUM entrées

cf

Avec grand plaisir, si je peux apporter ma pierre à l'édifice!
J'ai tellement perdu de temps à chercher à récupérer les IP des devices connectés à mon router, entre les anciens modules obsolètes, leur remplaçant qui ont disparu sans laisser de traces, et la fonction "esp_wifi_ap_get_sta_list_with_ip" qui est cachée et pas très documentée, si cela peut facilité le travail à d'autre, alors tant mieux!

Je ne comprend pas trop votre remarque.
Effectivement, la taille de wifi_sta_list_t est limitée par le "max connexion" de l'EspWifi, mais ça renverra forcement la liste de tous les devices connectés sur mon AP, puisque le nombre de ces devices est lui aussi limité par la même variable "max connexion", il n'y aura donc jamais plus de device que ce que la liste peut contenir.
A moins que j'ai mal compris votre intervention?

Je me suis mal exprimé - c’est la liste à un instant T, et pas un historique des connexions comme on peut trouver dans les routeurs.

(Votre post est clair - c’est moi qui ai lu trop vite)

Ok On est d'accord!

Effectivement pour avoir l'historique, il faudrait faire une boucle sur cette fonction, et enregistrer chaque changement dans un tableau. Mais ce serai surement plus simple de le faire avec la fonction Event de la classe WIFI.

L'avantage de cette liste, c'est surtout de savoir qui est connecté à l'instant, avec quel IP/Mac/RSSI/Aid, au moment même ou on lance la fonction. Les events sont limité en ce sens, car on ne peut obtenir ces infos qu'au moment de la connexion/déconnexion/attriibution de l'IP.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.