• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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();
}
 
Сверху Снизу