Récupérer l'IP d'un client qui se connecte à mon AP

Bonjour à tous,

je monte un petit réseau de ESP-01 qui exécutent les ordres d'un ESP32wroom.
Le ESP32 envoie ses ordres aux ESP-01 via espnow. Pour cela, les ESP-01 se connectent en tant que clients au ESP32 qui est un Point d'Accès (AP). Tout cela fonctionne bien.

J'aimerais que mon ESP32 affiche sur OLED quels sont les clients connectés. Pour cela, je compte intercepté - lors de la connexion de ESP-01 sur ESP32 - l'IP qui est attribué. Chaque ESP-01 se connecte au AP et réclame une IP fixe.

Dans mes recherches, je suis arrivé au point où je puis intercepter une connexion, mais je n'arrive toujours pas à connaître l'IP attribuée.

Dans la section setup()

  //Une fois l'heure internet obtenue, on ouvre un serveur web pour les bsoins locaux
  WiFi.mode(WIFI_AP);  //Mode de fonctionnement: serveur (AP), non-fonctionnel en tant que « station » - client
  WiFi.softAPConfig(APlocalIP, APgateway, APsousRes);
  WiFi.onEvent(SatelliteSeConnecte, ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED);
  WiFi.softAP(APssid, APpwsd);  //Point d'accès ... ceci servira aux ESP8266 satellites selon la syntaxe  WiFi.softAP(ssid, pwsd);
  Serial.print("Point d`accès a cette adresse : ");
  Serial.println(WiFi.softAPIP());

La fonction appelée

void SatelliteSeConnecte(WiFiEvent_t event, WiFiEventInfo_t info) {
  Serial.print   ("Satellite connecté: ");
  //Serial.println(info.connected.ip);

}

La gestion de ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED se trouve dans
WifiManager.cpp et ne comporte que les lignes suivantes:

	case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED:
		Serial.println("ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED");
		Serial.println("\n\n ESP32 station connected to AP \n\n");
		if (APMode) {
			state = apconnected;
			timeOfLastConnect = millis();
		}
		break;

Il y a certainement un retour info que je pourrais exploiter, mais je n'en trouve pas la structure.

Je ne veux pas que mes ESP-01 se mettent à émettre des informations du genre « Yoohoo, je suis là! » Mes ESP-01 sont en mode recevoir seulement et je souhaite les garder ainsi afin de

  • limiter la charge de travail des ESP-01
  • imiter la charge du ESP32
  • limiter les communications Wifi qui se mettraient à augmenter de manière exponentielle
  • bref ... garder cela simple et gérable

Avez-vous des pistes à me suggérer ?

Merci à l'avance.

Bonjour Patriboom

Il n'y a pas d'adresse IP dans une communication ESP-Now, tout se fait par les MAC adresses et tu peux récupérer celle du demandeur dans OnDataRecv

Cordialement
jpbbricole

Bonjour et merci pour cette réponse

Je crois que j'ai donc mal compris quelque chose.
Selon ce que je comprends, il faut une connexion wifi pour que ESP_nom fonctionne.

Dans mon cas, j'ai un central ESP32 et plusieurs satellites ESP-01, mais je n'ai pas de routeur. C'est pourquoi mon ESP32 est configuré en point d'accès. Selon la même logique, mes ESP-01 se connectent au point d'accès - soit le ESP32. C'est lors de cette connexion que je veux récupéré l'IP.

Si tu me dis que je n'ai pas besoin de ces connexions AP <-> STA ma question ne s'appliquera plus, mais alors pourquoi tous les exemples que je trouve incluent une connexion wifi_STA aux satellites (slaves) ?

Bonjour Patriboom

Oui, mais pas comme on l'entend habituellement, ce n'est pas une connexion Wifi "standard" qui passe par le routeur, par exemple, mais une connexion Wifi propre à l'environnement ESP-Now.
ESP-Now crée son propre réseau dont l'identification des participants se fait par la MAC adresse de l'ESP.

Cordialement
jpbbricole

Ça progresse, merci jpbbricole,

J'ai éliminé la connexion au point d'accès. Dans le fichier maître - qui sert aussi de serveur web pour l'interface avec l'usager - on ne trouve désormais que:

  WiFi.mode(WIFI_AP_STA);  //Mode de fonctionnement: serveur (AP), non-fonctionnel en tant que « station » - client
  WiFi.softAPConfig(APlocalIP, APgateway, APsousRes);
  WiFi.softAP(APssid, APpwsd);  //Point d'accès ... ceci servira aux ESP8266 satellites selon la syntaxe  WiFi.softAP(ssid, pwsd);

et dans le fichier esclave que cecI:

  WiFi.mode(WIFI_STA);

Je tâcherai donc de savoir quels esclaves sont connectés à partir de leurs MAC.

Merci.

Je n'ai que ça des 2 côtés.

Pour la récupération de lâdresse MAC, c'est dans OnDataRecv:

void OnDataRecv(const esp_now_recv_info_t *info, const uint8_t *incomingData, int len)
{
for (int p = 0; p < peerNombre; p ++)
{
		Serial.printf("\t%d %d %d %d %.2f\n", dataFromSwitch[p].onLine,
		dataFromSwitch[p].switchNum, dataFromSwitch[p].peerNum,
		dataFromSwitch[p].valeurInt, dataFromSwitch[p].valeurFloat );
}

Si tu as tes mac adresses des ESP01 dans un tableau, tu peut déterminer lequel s'est connecté.

A+
jpbbricole

Merci jpbbricole,

Voici comment je m'en sors:

  for (int x=Choix; x<8; x++) {
    lignes[x].R = Rouge;
    lignes[x].V = Verte;
    lignes[x].B = Bleue;
    if (x==3 || x==5) { lignes[++x].R = Rouge;  lignes[x].V = Verte;  lignes[x].B = Bleue; }
    recuENVOI = esp_now_send(lignes[x].MAC, (uint8_t *) &coulBandDEL, sizeof(coulBandDEL));
    lignes[x].etat = (recuENVOI == ESP_NOW_SEND_SUCCESS) ? true : false;
  }

Losrsque j'envoie un message à mon ESP-01, j'en regarde le résultat et inscris celui-ci dans le tableau décrivant diverses caractéristiques de mes ESP-01 (le tableau lignes )

Merci de ton aide.