ESP8266 и Arduino IDE. Часть 4: mDNS
Примечание
Оригинал статьи: martyncurrey.com
Этот урок объясняет, как подключиться к микроконтроллеру ESP8266 с помощью mDNS (multicast DNS) вместо использования числового IP-адреса, что делает работу более практичной для реальных проектов.
Что такое DNS?
Система доменных имён (DNS) преобразует человекочитаемые имена (например, www.google.com) в числовые IP-адреса (например, 172.217.22.78). Когда вы вводите адрес веб-сайта, ваш компьютер запрашивает DNS-сервер для получения соответствующего IP-адреса перед подключением.
Что такое mDNS?
mDNS означает «multicast DNS» и обеспечивает систему именования в стиле DNS для устройств в локальной сети, таких как ESP8266. Вместо числовых адресов mDNS использует URL-адреса с суффиксом .local (например, esp8266.local). Когда вводится адрес .local, браузер рассылает мультикаст-сигнал всем подключённым устройствам, запрашивая идентификацию у совпадающего устройства, которое отвечает своим реальным IP-адресом.
Реализация
Подключение библиотеки
Добавьте библиотеку mDNS в начале скетча:
#include <ESP8266mDNS.h>;
Инициализация
Инициализируйте mDNS в функции setup():
MDNS.begin("esp8266");
Это создаёт URL esp8266.local. Функция возвращает TRUE или FALSE, что позволяет проверять ошибки:
if (!MDNS.begin("esp8266")) {
Serial.println("Error setting up MDNS responder!");
} else {
Serial.println("mDNS responder started");
}
Скетч: ESP8266_LED_Control_05_Station_Mode_with_mDNS
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>;
char ssid[] = "MyNetwork_SSID";
char pass[] = "Network_Password";
WiFiServer server(80);
String header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
String html_1 = "<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1.0'/><meta charset='utf-8'><style>body {font-size:140%;} #main {display: table; margin: auto; padding: 0 10px 0 10px; } h2,{text-align:center; } .button { padding:10px 10px 10px 10px; width:100%; background-color: #4CAF50; font-size: 120%;}</style><title>LED Control</title></head><body><div id='main'><h2>LED Control</h2>";
String html_4 = "</div></body></html>";
String request = "";
int LED_Pin = D1;
void setup() {
pinMode(LED_Pin, OUTPUT);
Serial.begin(9600);
delay(500);
Serial.println(F("Serial started at 9600"));
Serial.print(F("Connecting to "));
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println(F("[CONNECTED]"));
Serial.print("[IP ");
Serial.print(WiFi.localIP());
Serial.println("]");
if (!MDNS.begin("esp8266")) {
Serial.println("Error setting up MDNS responder!");
} else {
Serial.println("mDNS responder started");
}
server.begin();
Serial.println("Server started");
}
void loop() {
WiFiClient client = server.available();
if (!client) {
return;
}
request = client.readStringUntil('\r');
if (request.indexOf("LEDON") > 0) {
digitalWrite(LED_Pin, HIGH);
} else if (request.indexOf("LEDOFF") > 0) {
digitalWrite(LED_Pin, LOW);
}
String html_2 = "";
if (digitalRead(LED_Pin) == HIGH) {
html_2 = "<form id='F1' action='LEDOFF'><input class='button' type='submit' value='Turn off the LED' ></form><br>";
} else {
html_2 = "<form id='F1' action='LEDON'><input class='button' type='submit' value='Turn on the LED' ></form><br>";
}
client.flush();
client.print(header);
client.print(html_1);
client.print(html_2);
client.print(html_4);
delay(5);
}
Доступ по IP-адресу:
Доступ по адресу esp8266.local:
Особенности платформ
Android
К сожалению, mDNS не реализован в веб-браузерах Android, поэтому адреса .local недоступны на устройствах Android.
Windows 10
Windows 10 требует дополнительного ПО для поддержки mDNS. Bonjour Print Services от Apple (доступен на support.apple.com) обеспечивает функциональность mDNS. После установки проверьте, что служба Bonjour работает через «Управление компьютером».
Windows 7
mDNS не работает в Windows 7 по умолчанию и требует установки Bonjour для совместимости.
Другие платформы
Скетч работает на PC и устройствах iOS. Инструменты диагностики, такие как Bonjour Scanner, помогают решать проблемы с подключением.
Важное замечание
В комментариях было отмечено: включение MDNS.update(); в функцию loop() необходимо для корректной работы на некоторых системах.