#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();
}