• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос ESP web сервер, работа с MAC адресами клиентов

CodeNameHawk

Moderator
Команда форума
Каким образом?
Если стандартный пример ESP8266WebServer HelloServer изменить так :
Код:
void loop(void) {
  server.handleClient();
  WiFiClient client = server.client();
  if (!client)
  {
      return;
  }
  IPAddress temp = client.remoteIP();
  Serial.println("Adress clienta : ");
  Serial.println(temp.toString());
}
то виден адрес подключившегося.
 

Алексей.

Active member
По этому remoteIP и получаем мак адрес
Код:
#include <lwip/etharp.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

#define SSID      "YourRouterSSID"
#define PASSWORD  "YourRouterPassword"

ESP8266WebServer _server;

String getMacByIp(const IPAddress& ipaddress) {
  char tmp[32] = "";
  // Удаляем все записи ARP таблицы для интерфейса
  etharp_cleanup_netif(netif_default);
  // С первого раза иногда не получалось получить ответ от хоста на ARP запрос, поэтому пробую три раза
  for (int n = 0; n < 3 && tmp[0] == 0; n++) {
    // Выполняем ARP запрос
    if (etharp_request(netif_default, ipaddress) != ERR_OK) {
      break;
    }
    // Таймаут на ответ хоста
    delay(100);
    struct eth_addr* p_eth_addr = 0; 
    const ip_addr_t* p_ip_addr_t = 0;
    // Ищем MAC в ARP таблице
    etharp_find_addr(netif_default, ipaddress, &p_eth_addr, &p_ip_addr_t);
    if (p_eth_addr != 0) {
      for (int n = 0; n < ETH_HWADDR_LEN; n++) {
        if (n > 0) {
          strcat(tmp, ":");
        }
        sprintf(&tmp[strlen(tmp)], "%02x", p_eth_addr->addr[n]);
      }
      break;
    }
  }
  return tmp;
}

void setup() {
  Serial.begin(115200);
  Serial.println();
  WiFi.persistent(false);
  WiFi.mode(WIFI_OFF);
  delay(100);
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASSWORD);
  WiFi.setAutoReconnect(true);
  Serial.println("WiFi connecting ...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.println("WiFi connected");
  // Выводим выданный нам ip адрес
  Serial.print("please open link http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
  // Добавляем обработчик запроса корня
  _server.on("/", HTTP_GET, []() {
    IPAddress a = _server.client().remoteIP();
    String mac  = getMacByIp(a);
    String s = "IP: " + a.toString() + ", MAC: ";
    if (mac.length() > 0) {
      s += mac;
    } else {
      s += "not found";
    }
    Serial.println(s);
    _server.send(200, "text/plain", s);
  });
  _server.begin(80);
}

void loop() {
  _server.handleClient();
}
 
Сверху Снизу