Bonjour à tous,
J'ai un petit problème avec la reconnaissance de mon ESP32 sur le réseau.
L'adresse MAC me permettrai de résoudre mon problème car elle est modifiable.
En revanche le BSSID ne peut l'être (je crois savoir) mais sous Windows >ARP -a 192.168.... renvoi le BSSID et je me retrouve sur mon réseau avec plusieurs objets avec le même.
J'aimerai pouvoir obtenir l'adresse MAC (plus facile, puisque modifiable)
Ma question: Comment obtenir l'adresse MAC depuis Windows?
Merci pour toute aide.
avez vous accès au routeur / serveur DHCP ?
Merci pour cette réponse.
Oui sans problème le réseau fonctionne correctement, mon seul soucis c'est que la commande ARP de windows ne renvoie que le BSSID et pas l'adresse MAC. Hors j'ai besoin de l'adresse MAC dans une application que je développe parallèlement.
Si vous rejoignez votre réseau WiFi par DHCP, vous pouvez voir l'adresse Mac de votre ESP32 dans l'interface d'admin DHCP
sinon l'adresse MAC est visible et dépend du monde (station ou point d'accès - il y a 1 d'écart).
#include <WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_MODE_STA);
WiFi.begin();
delay(100);
Serial.printf("MAC WiFi Station : %s\n", WiFi.macAddress().c_str());
WiFi.mode(WIFI_MODE_AP);
Serial.printf("MAC WiFi Access Point : %s\n", WiFi.softAPmacAddress().c_str());
}
void loop() {}
(code non testé mais ça devrait marcher)
Merci pour la suggestion, mon problème n'est pas d'avoir ces informations depuis l'esp32, mais plutôt de les voir depuis Windows en scannant les ip de mon réseau.
Le mode utilisé par les esp32 de mon réseau (et il y en a pas mal) est STA et IP fixe (pour la plupart) Mais à chaque interrogation en guise d'adresse MAC STA, est renvoyé le BSSID c'est à dire l'adresse MAC du mode AP de l'esp32. Je me retrouve avec plusieurs même adresse MAC (BSSID) identique et je ne peux faire la différence entre les esp32 et même le matériel de mon réseau (plusieurs routeurs, TV et autres objets connectés. Certains acheté dans le commerce ont également la même adresse MAC. Dur de s'y retrouver dans ce mélange de genre.
Vous fixez une adresse MAC dans vos codes arduinos ?
Généralement pour avoir une IP fixe pour les ESP32, c'est plus "portable" de mettre cela côté routeur (réservation DHCP) que de câbler en dur l'IP dans le code arduino.
Pour la plupart des adresses ip fixe, c'est fait coté routeur (box) mais là n'est pas le sujet, l'adresse mac renvoyé par les esp32 est celle du mode AP, comment faire pour qu'en mode STA (celui que j'utilise) ils envoient l'adresse MAC et si elle est identique à d'autres objets du reseau, je peux dans ce cas la changer avec "esp_wifi_set_mac(WIFI_IF_STA, newMACAddress);"
À la connaissance (cf mon code de test) ils présentent bien une adresse Mac différente suivant s’ils sont en AP ou STA.
Oui ce code donne les deux, mais seulement depuis l'esp32, éventuellement dans la fenêtre série d’Arduino (ou autre) mais pas depuis Windows.
Depuis une fenêtre "PowerShell" en tapant: ARP -a 192.168.xxx.xxx (adresse de l'objet connecté) on a l'adresse BSSID (Adresse mac AP de l'esp32) et pas la vrai adresse MAC du mode STA et cela même si on est en mode STA du coté de l'esp.
Les développeur de la librairie n'ont sans doute pas juger utile de donner l'adresse MAC correspondant au mode utilisé par l'esp et ont simplifié en donnant l'adresse AP dans tous les cas.
Je pourrais modifier la librairie, mais après, quoi? Dès la première mise à jour tout s'en va?
Je n'ai pas de vrai solution, enfin si je vais modifier tous mes objets connectés (dur, dur) pour leur ajouter une variable global et ceci:
server.on("/mac", []() {
if (MAC == "") {
uint8_t mac[6];
WiFi.macAddress(mac);
MAC = macToStr(mac);
}
server.send(200, "text/plain", MAC);
});
Mon appli Windows au moment de prendre l'adresse MAC d'un objet, demandera à celui-ci son adresse mac et s'il s'agit un autre type d'objet (TV, Aspirateur etc...) il n'y aura pas de réponse, alors on prendra l'adresse MAC réseau.
Voila ma conclusion à ce problème, et un très grand merci pour l'aide apporté.
si je charge ce code
#include <WiFi.h>
const char* ssid = "xxx";
const char* password = "xxx";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_MODE_AP);
Serial.printf("MAC WiFi Access Point : %s\n", WiFi.softAPmacAddress().c_str());
WiFi.mode(WIFI_MODE_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.write(".");
}
Serial.println("\nConnected to WiFi");
Serial.printf("MAC WiFi Station : %s\n", WiFi.macAddress().c_str());
Serial.printf("IP WiFi Station : %s\n", WiFi.localIP().toString().c_str());
}
void loop() {}
sur mon ESP32 et que je le lance pour rejoindre mon réseau (avec bien sûr mon SSID et identifiant correct), le moniteur série me dit
MAC WiFi Access Point : 24:0A:C4:0F:93:05
..
Connected to WiFi
MAC WiFi Station : 24:0A:C4:0F:93:04
IP WiFi Station : 10.116.1.22
une fois connecté, si je fais un arp -a dans un terminal (je suis sur macOS) je vois bien l'adresse IP de mon ESP et son adresse MAC de station parmi la liste
? (10.116.1.22) at 24:a:c4:f:93:4 on en0 ifscope [ethernet]
C'est donc bien l'adresse MAC correspondant au mode STA qui a été présentée lorsque j'ai rejoint mon réseau par DHCP.
la doc ESPRESSIF explique les différentes adresses MAC
Alors là ! Je devrais donc arrêter d'utiliser un PC Windows ?
Bref, Windows serait le fautif dans ce cas, ARP renvoi bien l'adresse MAC AP et jamais l'adresse STA.
J'ai essayé en vidant la table avec ARP -d, elle se vide bien, et se remplie rapidement, mais toujours avec l'adresse AP.
Le guide (déjà parcouru) dit aussi que l'adresse MAC STA est modifiable mais pas l'adresse AP pourquoi ??? Surement pour alléger la librairie, car ils disent aussi que les adresses MAC ne sont là que pour la compatibilité en quelques sortes et ne leurs paraissent pas importante au point d'alourdir la librairie souvent utilisée avec de petit processeurs et peu de mémoire.
Je suis condamné à faire comme je l'ai dit, là au moins je suis sûr d'avoir la bonne adresse MAC.
Dans l'absolu je dirai oui (je suis très Apple - j'utilise pas Windows) ![]()
Mais sur ce coup là, je ne vois pas pourquoi Windows serait incriminé. arp -a affiche uniquement les adresses IP et MAC des appareils qui ont récemment communiqué avec l'ordinateur et dont les informations sont stockées dans sa table ARP.
Lorsqu'un appareil redémarre, comme l'ESP32, il connaît son adresse MAC et obtient son adresse IP via DHCP (ou elle est statique). Puis, pour que les autres appareils du réseau local puissent communiquer avec lui, l'ESP32 envoie une requête ARP pour savoir si quelqu'un d'autre possède déjà l'adresse IP qu'il utilise.
Cette requête ARP est envoyée en broadcast, et est reçue par tous les appareils sur le réseau local. Les autres appareils, comme votre PC, reçoivent cette requête. Le PC, en recevant cette requête, met alors à jour sa table ARP avec l'adresse MAC de l'ESP32 associée à son adresse IP. C'est ainsi que l'entrée ARP pour l'ESP32 réapparaît dans la table ARP du PC après un redémarrage de l'ESP32.
Je ne vois donc pas comment le PC pourrait avoir l'adresse MAC AP alors que l'ESP32 a émis l'adresse MAC STA dans sa requête ARP de présentation.
Vous êtes sûr que votre code sur l'ESP32 ne contient pas une définition statique du genre WiFi.macAddress() ??
Oui je suis sûr de ce que j'avance, je suis très loin de débuter en programmation et à en croire ce que je trouve sur le net sur ce sujet, je ne suis pas le seul à m'en plaindre, il n'y a qu'a regarder au bas de cette page les sujets proposés, quelle que soit la langue, on a le même problème.
Je suis bien d'accord avec tout ce que vous dites, c'est aberrant, mais je ne fais que dire ce que je vois.
Je suis en train d'essayer d'utiliser une API Windows pour vérifier que j'ai la même chose, ou au contraire avoir la bonne adresse MAC.
Merci beaucoup pour toutes ces suggestions et aides.
OK - oui je vois que vous n'êtes pas un débutant.... C'est louche, et je ne sais pas trop ce qu'il se passe.
Mon test a été effectué avec la version 2.x du framework Espressif, peut-être est-ce un bug de la 3 ?
Merci beaucoup, mais je n'ai pas d'explication valable, je continu mes recherches avec les API on ne sait jamais. Pour l'instant pas de grandes avancées, des pistes tout au plus.
Merci encore.
Pourriez vous faire un test?
Videz la table ARP du PC avec un ARP -d
faire juste un arp -a sans autres paramètres pour vérifier que ça a été effectué
chargez ce code dans un ESP32
#include <WiFi.h>
const char* ssid = "xxx";
const char* password = "xxx";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_MODE_AP);
Serial.printf("MAC WiFi Access Point : %s\n", WiFi.softAPmacAddress().c_str());
WiFi.disconnect(true);
WiFi.mode(WIFI_MODE_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.write(".");
}
Serial.println("\nConnected to WiFi");
Serial.printf("MAC WiFi Station : %s\n", WiFi.macAddress().c_str());
Serial.printf("IP WiFi Station : %s\n", WiFi.localIP().toString().c_str());
}
void loop() {}
et ensuite depuis le PC faire juste un arp -a sans autres paramètres
postez le résultat de la console série Arduino et de votre terminal où vous faites les commande arp.
C'est super étonnant, si Windows n'a pas la bonne adresse MAC, la trame ethernet ne sera pas bonne ?
Du coup j'ai peut être loupé, mais tu as fait quoi pour connaitre l'adresse MAC de ton ESP32?
Classiquement on obtient après avoir défini le mode et s'être connecté l'adresse MAC du mode en cours.
WiFi.macAddress(mac);
Merci, mais déjà fait et testé.
Quelques infos pour ceux qui se pose la question:
WiFi.BSSID => Adresse MAC AP
WiFi.macAddress(Variable) => Mets l'adresse MAC STA dans la variable indexée