
Как настроить mDNS на ESP32
Если у вас в сети один ESP32, вы можете подключиться к нему, используя его IP-адрес (например, 192.168.1.128). Но представьте, что у вас несколько ESP32, разбросанных по всему дому. Вам внезапно придётся запоминать множество IP-адресов. Ужасно затратно по времени и совсем не весело. На помощь приходит mDNS.
mDNS позволяет получить доступ к веб-серверу, работающему на вашем ESP32, используя удобное имя хоста, например «esp32.local», вместо возни с IP-адресом. И вот самое лучшее — даже если IP-адрес вашего ESP32 изменится, mDNS автоматически разрешит новый IP-адрес в то же имя хоста. Это означает, что вы можете продолжать использовать то же имя хоста, не беспокоясь об отслеживании изменений IP-адресов.
Впечатляет, правда? В этом руководстве вы пошагово узнаете, как настроить mDNS на ESP32. Но сначала давайте поговорим о том, что такое mDNS.
Что такое mDNS?
Тридцать лет назад, когда Интернет ещё находился в зачаточном состоянии, если вы хотели посетить веб-сайт, вам нужно было знать его IP-адрес. Это потому, что компьютеры могут и могли общаться только с помощью чисел.
Рассмотрим IP-адрес вроде 127.33.54.200: он длинный, трудно запоминается и определённо не удобен для пользователя. Нам нужен был способ преобразовать эти машиночитаемые IP-адреса в нечто более понятное.
В начале 1980-х годов Пол Мокапетрис представил революционную систему, которая сопоставляла IP-адреса с более запоминающимися доменными именами — и так родилась Система доменных имён (DNS). Эта система остаётся основой современного интернета.
Когда вы вводите доменное имя, например google.com, в браузер, он спрашивает серверы имён, есть ли у них DNS-записи для этого домена. DNS-запись — это просто файл, который говорит: «этот домен» соответствует «этому IP-адресу», а сервер имён — это специализированный сервер, который хранит такие DNS-записи. Например, доменное имя google.com может быть связано с IP-адресом вроде 142.250.189.174.
Система доменных имён является одной из основ работы интернета; без неё мы не смогли бы с лёгкостью просматривать интернет.
Но что насчёт локальной домашней сети? В такой среде, где устройства часто включаются и выключаются, подключаются к сети и отключаются от неё, и часто имеют динамические IP-адреса, эта система становится непрактичной, потому что развёртывание выделенного сервера только для разрешения имён хостов в IP-адреса — не самое практичное решение. Есть ли более простой способ? Да, конечно — он называется Multicast DNS, сокращённо mDNS.
mDNS — это децентрализованный одноранговый протокол, специально разработанный для небольших сетей. Он позволяет устройствам обнаруживать IP-адреса друг друга. Он работает, позволяя каждому устройству транслировать своё имя и IP-адрес всем остальным устройствам в сети. Очевидно, такой подход не подошёл бы для интернета в целом, но локальные сети достаточно малы, чтобы эти накладные расходы не представляли проблемы.
Ключевые особенности и преимущества mDNS:
Удобные имена хостов: Устройства в сети могут быть доступны по легко запоминающимся именам хостов, таким как «esp32.local», вместо IP-адресов.
Обработка динамических IP: Даже если IP-адрес устройства изменится, mDNS позаботится о разрешении нового IP-адреса с тем же именем хоста.
Нулевая конфигурация: Нет необходимости в дополнительной настройке DNS, так как mDNS работает автономно в локальных сетях.
Независимость от платформы: mDNS может использоваться на различных устройствах и операционных системах, что делает интеграцию бесшовной.
Давайте пошагово рассмотрим, как настроить mDNS на ESP32.
Шаг 1 — Настройка Arduino IDE
Мы будем использовать Arduino IDE для программирования ESP32, поэтому, пожалуйста, убедитесь, что у вас установлено дополнение ESP32, прежде чем продолжить:
Микроконтроллер ESP32 быстро стал одной из самых популярных плат среди любителей, инженеров и людей, интересующихся Интернетом вещей (IoT)…
Шаг 2 — Подключение ESP32 к компьютеру
Используйте кабель micro-USB для подключения платы ESP32 к компьютеру.
Шаг 3 — Определение сетевых учётных данных
Перед загрузкой приведённого ниже скетча необходимо внести одно важное изменение. Обновите следующие две переменные, указав фактическое имя и пароль вашей сети Wi-Fi.
const char* ssid = "YourNetworkName"; // Enter SSID here
const char* password = "YourPassword"; //Enter Password here
Шаг 4 — Загрузка кода
Вот простой скетч, демонстрирующий настройку mDNS на плате ESP32. Этот код подключается к сети Wi-Fi, запускает службу mDNS и создаёт HTTP-сервер для обслуживания простой веб-страницы. После загрузки вы должны иметь возможность получить доступ к веб-серверу, перейдя по адресу http://esp32.local/ в веб-браузере.
Попробуйте этот скетч.
#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>
/*Put your SSID & Password*/
const char* ssid = "YourNetworkName"; // Enter SSID here
const char* password = "YourPassword"; //Enter Password here
WebServer server(80);
void setup() {
Serial.begin(115200);
delay(100);
Serial.println("Connecting to ");
Serial.println(ssid);
//connect to your local wi-fi network
WiFi.begin(ssid, password);
//check wi-fi is connected to wi-fi network
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected..!");
// Initialize mDNS
if (!MDNS.begin("esp32")) { // Set the hostname to "esp32.local"
Serial.println("Error setting up MDNS responder!");
while(1) {
delay(1000);
}
}
Serial.println("mDNS responder started");
server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
void handle_OnConnect() {
server.send(200, "text/html", "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\"></head><body><h1>Hey there!</h1></body></html>");
}
void handle_NotFound(){
server.send(404, "text/plain", "Not found");
}
Шаг 5 — Тестирование кода
После загрузки кода откройте монитор порта и установите скорость 115200 бод. Затем нажмите кнопку EN на ESP32. Подключение к сети может занять несколько секунд, после чего будут отображены сообщения «mDNS responder started» и «HTTP server started».
Далее откройте веб-браузер и перейдите по адресу http://esp32.local/. ESP32 должен отобразить веб-страницу с приветственным сообщением.
Объяснение кода
Скетч начинается с подключения необходимых библиотек: WiFi.h для подключения к сети WiFi, WebServer.h для настройки HTTP-сервера и ESPmDNS.h для служб mDNS.
#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>
Далее определяются две константы, ssid и password. Это заполнители для имени (SSID) и пароля вашей сети Wi-Fi.
const char* ssid = "YourNetworkName"; // Enter SSID here
const char* password = "YourPassword"; //Enter Password here
Следующая строка создаёт объект веб-сервера, который прослушивает порт 80 (порт HTTP по умолчанию).
WebServer server(80);
В функции setup() мы сначала инициализируем последовательную связь с ПК.
Serial.begin(115200);
Затем ESP32 пытается подключиться к сети WiFi с помощью функции WiFi.begin(), которая принимает SSID (имя сети) и пароль в качестве аргументов.
WiFi.begin(ssid, password);
Пока ESP32 пытается подключиться к сети, мы можем проверить состояние подключения с помощью функции WiFi.status().
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Далее мы просто вызываем метод begin() для внешней переменной с именем MDNS, чтобы запустить службу mDNS. Эта переменная MDNS является экземпляром класса MDNSResponder, который предоставляет всю функциональность разрешения адресов.
Вызов ранее упомянутого метода begin() показан ниже. В качестве аргумента метода мы передаём желаемое имя хоста (которое будет использоваться в URL). Важно отметить, что имя хоста не должно быть длиннее 63 символов.
if (!MDNS.begin("esp32")) { // Set the hostname to "esp32.local"
Serial.println("Error setting up MDNS responder!");
while(1) {
delay(1000);
}
}
Следующий блок кода просто настраивает обработчик для корневого URL. Когда кто-то обращается к корневому URL, вызывается handle_OnConnect(). Также настраивается обработчик, который вызывается, когда запрашиваемый URL не найден на сервере.
server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);
Наконец, для запуска сервера мы вызываем метод begin() для объекта сервера.
server.begin();
Функция loop() непрерывно проверяет входящие запросы клиентов и обрабатывает их, вызывая метод handleClient() для объекта сервера.
void loop() {
server.handleClient();
}
handle_OnConnect() — это функция, которая отправляет HTML-ответ клиенту при обращении к корневому URL (/). Она отправляет простую HTML-страницу с приветственным сообщением, используя метод server.send().
Метод server.send() принимает в качестве аргументов код HTTP-ответа, тип контента и сам контент. В нашем случае мы отправляем код 200 (один из кодов состояния HTTP), который соответствует ответу OK (указывающему, что запрос был успешно обработан). Затем мы указываем тип контента как «text/html». Наконец, у нас есть длинная строка, которая представляет собой не что иное, как HTML-код, создающий простую веб-страницу, которая отображает сообщение «Hey there!».
void handle_OnConnect() {
server.send(200, "text/html", "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\"></head><body><h1>Hey there!</h1></body></html>");
}
Если сервер получает запрос на URL, которого не существует на сервере, handle_NotFound() отправляет ответ 404 Not Found.
void handle_NotFound(){
server.send(404, "text/plain", "Not found");
}