MAC Detector ESP32 - AZ-Delivery

Bonjour,

Aujourd'hui, nous voulons vous présenter un projet que nous avons reçu avec une demande de client. Nous vous montrerons un détecteur d'adresse MAC avec notre ESP32 Dev Board C.

Il n'est pas nécessaire de disposer de matériel plus matériel que ce panneau. Le détecteur Mac recherche les adresses dans le code et les émet dans le moniteur série chaque fois qu'un périphérique se rapproche. Pour ce faire, nous utilisons le mode Promiscuous de la mode ESP32 bien plus facile à utiliser que dans le prédécesseur ESP8266. La reconnaissance de la présence est très fiable, mais il est important de noter que le scanneur ne produit que des informations lorsque le dispositif WiFi est "wach" et communique. Cela peut prendre un certain temps avant que l'adresse ne s'affiche dans le moniteur série. En fonction du dispositif utilisé et de sa configuration, ces derniers économisent de l'énergie et les éteignent de manière inexploitées. Plusieurs iPhones se sont révélés particulièrement avérés de communication.

Vous pouvez entrer les adresses de votre choix dans la liste des adresses de votre choix.

Voici le code:

 

#include <WiFi.h>
#include <Wire.h>

#include "esp_wifi.h"


Chaîne maclist[64][3]; 
int listcount = 0;

Chaîne KnownMac[10][2] = {  // adresse-list   {"Chef1","8C1ABF8A6A36"},   {"Chef2","E894BA82BC83"},   {"NOM","MACADDRESS"},   {"NOM","MACADDRESS"},   {"NOM","MACADDRESS"},   {"NOM","MACADDRESS"},   {"NOM","MACADDRESS"},   {"NOM","MACADDRESS"},   {"NOM","MACADDRESS"}    };

Chaîne defaultTTL = "60"; // Maximum time (Apx seconds) elapsed before device is consirded offline

const wifi_promiscuous_filter_t filt={     .masque_filtre=WIFI_PROMIS_FILTER_MASK_MGMT|WIFI_PROMIS_FILTER_MASK_DATA
};

typedef struct {    uint8_t mac[6];
} __attribute__((packed)) MacAddr;

typedef struct {    int16_t fctl;   int16_t soif;   MacAddr da;   MacAddr sa;   MacAddr bssid;   int16_t seqctl;   unsigned char payload[];
} __attribute__((packed)) WifiMgmtHdr;    #define maxCh 13 // max Channel-> US = 11, EU = 13, Japon = 14


int curChannel = 1;


void sniffer(void* buf, wifi_promiscuous_pkt_type_t type) { // This is where packets end up after they get sniffed   wifi_promiscuous_pkt_t *p = (wifi_promiscuous_pkt_t*)buf;   int len = p->rx_ctrl.sig_len;   WifiMgmtHdr *wh = (WifiMgmtHdr*)p->payload;   len -= sizeof(WifiMgmtHdr);   if (len < 0){     série.println("Receuved 0");     return;   }   Chaîne packet;   Chaîne mac;   int fctl = ntohs(wh->fctl);   pour(int i=8;i<=8+6+1;i++){ // This reads the first of the packet of the packet. This is where you can read the whole packet replaceing the "8 + 6 + 1" with "p- > rx_ctrl.sig_len"      packet += Chaîne(p->payload[i],HEX);   }   pour(int i=4;i<=15;i++){ // This removes the 'nibble' bits from the stat and end of the data we want. C'est la seule façon de l'obtenir.     mac += packet[i];   }   mac.toUpperCase();      int added = 0;   pour(int i=0;i<=63;i++){ // checks if the MAC address has been added before     if(mac == maclist[i][0]){       maclist[i][1] = defaultTTL;       if(maclist[i][2] == "HORS LIGNE"){         maclist[i][2] = "0";       }       added = 1;     }   }      if(added == 0){ // If its new. add it to the array.     maclist[listcount][0] = mac;     maclist[listcount][1] = defaultTTL;    // Serial.println (mac) ;     listcount ++;     if(listcount >= 64){       série.println("Too many addresses");       listcount = 0;     }   }
}


void setup() {   série.begin(115200);   wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();   esp_wifi_init(&cfg);   esp_wifi_set_storage(WIFI_STORAGE_RAM);   esp_wifi_set_mode(WIFI_MODE_NULL);   esp_wifi_start();   esp_wifi_set_promiscuous(vrai);   esp_wifi_set_promiscuous_filter(&filt);   esp_wifi_set_promiscuous_rx_cb(&sniffer);   esp_wifi_set_channel(curChannel, WIFI_SECOND_CHAN_NONE);      série.println("starting!");
}

void purge(){ // This manages the TTL   pour(int i=0;i<=63;i++){     if(!(maclist[i][0] == "")){       int jjl = (maclist[i][1].toInt());       jjl --;       if(jjl <= 0){         // Serial.println ("OFFLINE:" + maclist [i] [0]) ;         maclist[i][2] = "HORS LIGNE";         maclist[i][1] = defaultTTL;       }else{         maclist[i][1] = Chaîne(jjl);       }     }   }
}

void updatetime(){ // This updates the time the device has been online for   pour(int i=0;i<=63;i++){     if(!(maclist[i][0] == "")){       if(maclist[i][2] == "")maclist[i][2] = "0";       if(!(maclist[i][2] == "HORS LIGNE")){           int timehere = (maclist[i][2].toInt());           timehere ++;           maclist[i][2] = Chaîne(timehere);       }             // Serial.println (maclist [i] [0] + " : ". + maclist [i] [2]) ;            }   }
}

void showpeople(){ // This checks if the MAC is in the Terrionized list and then displays it on the OLED and / or prints it to serial.   Chaîne forScreen = "";   pour(int i=0;i<=63;i++){     Chaîne tmp1 = maclist[i][0];     if(!(tmp1 == "")){       pour(int j=0;j<=9;j++){         Chaîne tmp2 = KnownMac[j][1];         if(tmp1 == tmp2){           forScreen += (KnownMac[j][0] + " : " + maclist[i][2] + "\n");           série.print(KnownMac[j][0] + " : " + tmp1 + " : " + maclist[i][2] + "\n -- \n");         }       }     }   }
}

void boucle() {     // Serial.println ("Changed channel:" + String (curChannel)) ;     if(curChannel > maxCh){        curChannel = 1;     }     esp_wifi_set_channel(curChannel, WIFI_SECOND_CHAN_NONE);     Délay(1000);     updatetime();     purge();     showpeople();     curChannel++;           }

 

Dans ce qui suit, nous allons essayer de convertir la reconnaissance de la présence par BLE. Pour la prochaine fois:)

Esp-32Projekte für anfänger

5 commentaires

Bas

Bas

Hans, THX! this did the trick

String packet;
String mac;
String packet3;

int fctl = ntohs(wh→fctl); for (int i = 8; i <= 8 + 6 + 1; i++) { String packet2 = String(p→payload[i], HEX); if (packet2.length() == 1) { packet3 = “0” + packet2; packet += packet3; } else { packet += packet2; } }
Hans

Hans

Bei diesem code werden nicht alle Mac-Adressen richtig erkannt.
Beispiel:
Korrekte mac-adresse vom Gerät: D4:AE:05:0D:D7:28
Der Code erkennt: D4AE5DD728
Die 0 fehlen.

Erklärung:
Hexadezimal: D4:AE:05:0D:D7:28
Dezimal: 212:174:5:13:215:1C

- Dezimal 05 ist Hexa 5. Das 0 wird gestrichen.
- Dezimal 13 ist Hexa D. Das 0 wird gestrichen.

Der fehlerhafte code-abschnitt habe ich für mich wie folgt gelöst:

String packet; String packet3; String mac; int fctl = ntohs(wh→fctl); for (int i = 8; i <= 8 + 6 + 1; i++) { String packet2 = String(p→payload[i], HEX); if (packet2.length() == 1) { packet3 = “0” + packet2; packet += packet3; } else { packet += packet2; } }
Markus Hopfner

Markus Hopfner

Guten Tag (nochmals),

wollte Sie nur nochmals darauf Aufmerksam machen das der Code nicht mit MAC-Adressen mit zwei Nullen in folge funktioniert.

mfg

Markus

Markus Hopfner

Markus Hopfner

Guten Tag,
zuerst einmal vielen dank für den Code.

Mir ist aufgefallen das er nicht funktioniert wenn die MAC eine Doppelnull hat, da wird eine verschluckt. können Sie mir sagen wieso?

Mfg Markus

Willy

Willy

Das ist ein interessantes Projekt. Kann ich auch die MAC-Adressen mit einem ESP8266 scannen?
Genauer gesagt will ich den Amazon Dash-Button im WLAN erkennen. Der ESP8266 ist der Hotspot mit dem sich der DASH-Button verbindet. Aber ich weiss nicht wie ich die MAC-Adresse erkennen kann das der Dash-Button sich verbunden hat. Die MAC-Adresse des Dash-Button kenne ich.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery