ESP8266 mac scan

Chip ESP8266 là chip WiFi giá rẻ có nhiều tính năng hữu dụng, một trong những tính năng đó là lắng nghe

Ngày nay đa số mọi người đều có smartphone, dĩ nhiên là phải có WiFi, các smartphone này thường phải scan liên tục để tìm mạng Wifi hiện hữu, hoặc trao đổi dữ liệu với các AP đã kết nối. Tất cả các thao tác trên đều phát ra địa chỉ MAC (duy nhất) của điện thoại.

Như vậy là bạn đã có thể hình dung được, nếu ESP8266 có thể lắng nghe bất kỳ gói tin nào thì nó cũng có thể phát hiện bất kỳ thiết bị hỗ trợ WiFi nào ở gần.


Mộ ứng dụng kiểu như: Phát hiện một người nào đó tới gần 1 địa điểm nào đó – ví dụ vui, bạn sẽ dễ dàng biết được bố/mẹ hay ai đó trong gia đình sắp bước vô nhà.

Lưu ý, ở một số nước có luật pháp hà khắc, thì cả việc scan và collect địa chỉ MAC nơi công cộng cũng bị cấm.

Đoạn code dưới đây cho Arduino dùng để scan MAC address và in nó ra cổng Serial

#include <Ticker.h>

// External library files of Espressif SDK
extern "C" {
#include "user_interface.h"
#include "ets_sys.h"
#include "osapi.h"
#include "gpio.h"
#include "os_type.h"
#include "mem.h"
#include "user_config.h"
}

//Ticker for channel hopping
Ticker ts;

//Promiscuous callback structures for storing package data, see Espressif SDK handbook
struct RxControl {
  signed rssi: 8;
  unsigned rate: 4;
  unsigned is_group: 1;
  unsigned: 1;
  unsigned sig_mode: 2;
  unsigned legacy_length: 12;
  unsigned damatch0: 1;
  unsigned damatch1: 1;
  unsigned bssidmatch0: 1;
  unsigned bssidmatch1: 1;
  unsigned MCS: 7;
  unsigned CWB: 1;
  unsigned HT_length: 16;
  unsigned Smoothing: 1;
  unsigned Not_Sounding: 1;
  unsigned: 1;
  unsigned Aggregation: 1;
  unsigned STBC: 2;
  unsigned FEC_CODING: 1;
  unsigned SGI: 1;
  unsigned rxend_state: 8;
  unsigned ampdu_cnt: 8;
  unsigned channel: 4;
  unsigned: 12;
};
struct LenSeq {
  uint16_t length;
  uint16_t seq;
  uint8_t  address3[6];
};
struct sniffer_buf {
  struct RxControl rx_ctrl;
  uint8_t buf[36];
  uint16_t cnt;
  struct LenSeq lenseq[1];
};
struct sniffer_buf2 {
  struct RxControl rx_ctrl;
  uint8_t buf[112];
  uint16_t cnt;
  uint16_t len;
};

// Function for printing the MAC address i of the MAC header
void printMAC(uint8_t *buf, uint8 i)
{
  Serial.printf("\t%02X:%02X:%02X:%02X:%02X:%02X", buf[i + 0], buf[i + 1], buf[i + 2], buf[i + 3], buf[i + 4], buf[i + 5]);
}

// Promiscuous callback function: is executed whenever package is received by ESP 8266
void promisc_cb(uint8_t <em>buf, uint16_t len)
{
  uint8_t</em> buffi;
  if ((len == 12)) {
    return; // Nothing to do for this package, see Espressif SDK documentation.
  }
  if (len == 12) {
    return;
  }
  else if (len == 128) {
    struct sniffer_buf2 <em>sniffer = (struct sniffer_buf2</em>) buf;
    buffi = sniffer->buf;
    Serial.printf("RSSI=%d ", sniffer->rx_ctrl.rssi);
  }
  else {
    struct sniffer_buf <em>sniffer = (struct sniffer_buf</em>) buf;
    buffi = sniffer->buf;
    Serial.printf("RSSI=%d ", sniffer->rx_ctrl.rssi);
  }
  Serial.printf("ch=%02d,len=%d", wifi_get_channel(), len);
  printMAC(buffi,  4); // Print address 1, station
  printMAC(buffi, 10); // Print address 2, ap
  printMAC(buffi, 16); // Print address 3
  if ((bitRead(buffi[1], 7) == 1) && (bitRead(buffi[1], 6) == 1)) printMAC(buffi, 24); // Print address 4
  Serial.print(" ");
  Serial.print(bitRead(buffi[1], 7));
  Serial.print(bitRead(buffi[1], 6));
  Serial.printf(" ");

Serial.printf("\n");
}

// Change the WiFi channel
void channelCh(void)
{
  // Change the channels by modulo operation
  uint8 new_channel = wifi_get_channel() % 12 + 1;
  Serial.printf("** Hop to %d **\n", new_channel);
  wifi_set_channel(new_channel);
}

// Setup procedure
void setup()
{
  // Set baudrate UART
  Serial.begin(115200);
  // Sniffer works only in station mode
  wifi_set_opmode(STATION_MODE);
  // Set the promiscuous related options
  wifi_promiscuous_enable(0);
  wifi_set_promiscuous_rx_cb(promisc_cb);
  wifi_promiscuous_enable(1);
  // Change the channel every 0.5 seconds, change for different frequency
  ts.attach(0.5, channelCh);
}

void loop()
{
  delay(1000);
}

Nếu bạn cần board để thử nghiệm thì đây: https://iotmaker.vn/esp8266-iot-wifi-uno.html

Gửi phản hồi