ESP32: Настройка mDNS (Arduino IDE)

Узнайте, как настроить Multicast DNS (mDNS) на ESP32, программируемом через Arduino IDE. mDNS позволяет обращаться к вашему ESP32 по удобному имени вместо IP-адреса. Например, вместо того чтобы вводить IP-адрес ESP32 для доступа к веб-серверу в браузере в вашей локальной сети, вы можете просто использовать что-то вроде http://esp32.local.

ESP32 Настройка mDNS Arduino IDE

Рекомендуемое чтение:

Что такое mDNS?

mDNS, или Multicast DNS, позволяет назначать определённые имена устройствам в вашей локальной сети, каждое из которых связано с его конкретным IP-адресом. Таким образом, вы можете обращаться к ним по этому имени вместо IP-адреса.

mDNS для ESP32

Таким образом, вместо того чтобы запоминать конкретные IP-адреса нескольких плат ESP32 в вашей сети, вы можете просто дать каждой из них имя, например esp32-room, esp32-lights. Затем вы можете получить доступ к ним в вашей сети, используя http://esp32-room.local, например, вместо того чтобы запоминать или записывать конкретный IP-адрес для каждой платы.

Как настроить mDNS на ESP32 (Arduino IDE)?

Настройка mDNS на ESP32, программируемом через Arduino IDE, довольно проста и требует добавления всего нескольких строк к вашему существующему коду.

1) Сначала подключите библиотеку ESPmDNS.

#include <ESPmDNS.h>

2) В функции setup() вашего кода, после подключения к сети, настройте mDNS с помощью следующих строк. Передайте нужное имя хоста в функцию begin() — это имя будет использоваться в URL при доступе к веб-серверу ESP32.

if (!MDNS.begin(mdnsName)) {
  Serial.println("Error setting up MDNS responder!");
  while(1) {
    delay(1000);
  }
}

3) Наконец, анонсируйте HTTP-сервис вашего ESP32 (на TCP-порту 80).

MDNS.addService("_http", "_tcp", 80);

Веб-сервер ESP32 с mDNS

Чтобы показать вам, как реализовать mDNS, мы продемонстрируем базовый веб-сервер «Hello World» с этой функцией.

Для доступа к этому веб-серверу в браузере, вместо того чтобы вводить IP-адрес ESP32, вы можете ввести http://myesp32.local

Вот пример кода.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-mdns-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// mDNS name (customize this as needed)
const char* mdnsName = "myesp32";

// Create a web server object
WebServer server(80);

// Function to handle the root URL
void handleRoot() {
  String html = "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
  html += "<link rel=\"icon\" href=\"data:,\">";
  html += "<style>";
  html += "body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: white; color: #333; margin: 20px; }";
  html += "h1 { color: #4a5568; font-weight: 300; }";
  html += "</style></head>";
  html += "<body>";
  html += "<h1>Hello World</h1>";
  html += "<p>ESP32 mDNS Demo.</p>";
  html += "</body></html>";
  server.send(200, "text/html", html);
}

void setup() {
  Serial.begin(115200);

  // Connect to Wi-Fi network
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Set mDNS
  if (!MDNS.begin(mdnsName)) {
    Serial.println("Error setting up MDNS responder!");
    while(1) {
      delay(1000);
    }
  }

  // Add service to MDNS-SD
  MDNS.addService("_http", "_tcp", 80);
  Serial.println("mDNS responder started. Access your ESP32 at http://" + String(mdnsName) + ".local");

  // Set up the web server to handle route
  server.on("/", handleRoot);

  // Start the web server
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  // Handle incoming client requests
  server.handleClient();
}

Посмотреть исходный код

Как работает код?

Для простоты мы создаём веб-сервер с помощью встроенной библиотеки WebServer из ядра ESP32.

#include <WebServer.h>

Мы уже подробно объясняли, как создавать простые веб-серверы с помощью этой библиотеки, в следующем руководстве:

Поэтому мы объясним только те части кода, которые относятся к данному руководству.

Подключение библиотеки mDNS

Как мы упоминали ранее, вам нужно подключить библиотеку ESPmDNS.

#include <ESPmDNS.h>

Сетевые учётные данные

Введите свои сетевые учётные данные в следующих строках, чтобы ESP32 мог подключиться к вашей локальной сети.

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Имя хоста mDNS

Добавьте желаемое имя хоста. В нашем случае мы назвали его myesp32, но вы можете задать другое имя.

const char* mdnsName = "myesp32";

Настройка mDNS

В функции setup(), после инициализации Wi-Fi и вывода IP-адреса платы…

// Connect to Wi-Fi network
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());

…мы настраиваем mDNS с помощью следующих строк кода:

// Set mDNS
if (!MDNS.begin(mdnsName)) {
  Serial.println("Error setting up MDNS responder!");
  while(1) {
    delay(1000);
  }
}

// Add service to MDNS-SD
MDNS.addService("_http", "_tcp", 80);
Serial.println("mDNS responder started. Access your ESP32 at http://" + String(mdnsName) + ".local");

И это всё. Вы можете использовать этот метод для любых своих IoT-проектов.

Демонстрация

Загрузите предыдущий код на вашу плату ESP32. Затем откройте монитор порта на скорости 115200 бод и нажмите кнопку RST на ESP32, чтобы он начал выполнять код.

Он выведет IP-адрес платы и ссылку для доступа к веб-серверу, используя имя хоста, которое вы указали в коде. В моём случае я буду обращаться к веб-серверу ESP32 по адресу http://myesp32.local.

ESP32 Монитор порта - mDNS имя хоста

Откройте браузер в вашей локальной сети и введите http://myesp32.local или любое другое имя, которое вы задали (необходимо добавить .local в конце), и вы должны получить доступ к веб-серверу.

Пример веб-сервера ESP32 с mDNS

Это просто простой веб-сервер для тестирования, но этот подход можно применить к любым другим веб-серверам, веб-приложениям и так далее.

Несколько устройств с одинаковым именем хоста

При использовании библиотеки ESPmDNS, если вы задаёте то же имя хоста, что уже существует в локальной сети, библиотека автоматически обработает это и добавит суффикс к имени. Например, если esp32.local уже существует, она переименует его в esp32-2.local и так далее. Библиотека делает это в фоновом режиме.

Чтобы узнать, какое фактическое имя хоста было присвоено устройству, нам нужно использовать более низкоуровневые функции, такие как mdns_hostname_get(), включённые в библиотеку mdns.h из ESP-IDF.

Следующий код аналогичен предыдущему примеру, но использует функцию mdns_hostname_get() для получения фактического имени хоста, присвоенного устройству. Это полезно, если вы случайно задали одно и то же имя хоста нескольким устройствам или если в сети уже есть другое устройство с таким же именем.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-mdns-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <mdns.h>     // For low-level mDNS functions from ESP-IDF

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// mDNS name (customize this as needed)
const char* mdnsName = "myesp32";

// Create a web server object
WebServer server(80);

// Function to handle the root URL
void handleRoot() {
  String html = "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
  html += "<link rel=\"icon\" href=\"data:,\">";
  html += "<style>";
  html += "body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: white; color: #333; margin: 20px; }";
  html += "h1 { color: #4a5568; font-weight: 300; }";
  html += "</style></head>";
  html += "<body>";
  html += "<h1>Hello World</h1>";
  html += "<p>ESP32 mDNS Demo.</p>";
  html += "</body></html>";
  server.send(200, "text/html", html);
}

void setup() {
  Serial.begin(115200);

  // Connect to Wi-Fi network
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Set mDNS
  if (!MDNS.begin(mdnsName)) {
    Serial.println("Error setting up MDNS responder!");
    while(1) {
      delay(1000);
    }
  }

  delay(5000);

  // Add service to MDNS
  MDNS.addService("_http", "_tcp", 80);

  // Retrieve and print the actual (resolved) hostname - checking if there are any conflicts in the network
  char actualHostname[MDNS_NAME_BUF_LEN];  // MDNS_NAME_BUF_LEN is 64 from mdns.h
  esp_err_t err = mdns_hostname_get(actualHostname);
  if (err == ESP_OK) {
    String actualName = String(actualHostname);
    Serial.println("mDNS responder started. Given name: " + String(mdnsName));
    Serial.println("Current hostname: http://" + actualName + ".local");
    if (actualName != mdnsName) {
      Serial.println("Hostname renamed.");
    }
  } else {
    Serial.println("Failed to retrieve current hostname (error: " + String(err) + ")");
  }

  // Set up the web server to handle route
  server.on("/", handleRoot);

  // Start the web server
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  // Handle incoming client requests
  server.handleClient();
}

Посмотреть исходный код

Как работает код?

В этом коде мы подключаем библиотеку mdns.h из ESP-IDF.

#include <mdns.h>     // For low-level mDNS functions from ESP-IDF

После настройки mDNS на ESP32 мы используем функцию mdns_hostname_get() для получения фактического имени хоста, присвоенного устройству.

// Retrieve and print the actual (resolved) hostname - checking if there are any conflicts in the network
char actualHostname[MDNS_NAME_BUF_LEN];  // MDNS_NAME_BUF_LEN is 64 from mdns.h
esp_err_t err = mdns_hostname_get(actualHostname);
if (err == ESP_OK) {
  String actualName = String(actualHostname);
  Serial.println("mDNS responder started. Given name: " + String(mdnsName));
  Serial.println("Current hostname: http://" + actualName + ".local");
  if (actualName != mdnsName) {
    Serial.println("Hostname renamed.");
  }
} else {
  Serial.println("Failed to retrieve current hostname (error: " + String(err) + ")");
}

Тестирование кода

Для тестирования этого кода вам нужно оставить предыдущий код работающим на другой плате. Затем загрузите этот новый код на другую плату.

Поскольку мы пытаемся использовать имя хоста myesp32, которое уже занято предыдущим устройством, библиотека автоматически изменит имя хоста на myesp32-2.

ESP32 получение имени хоста mDNS и вывод в мониторе порта

Аналогичным образом вы можете получить доступ к веб-серверу по адресу http://myesp32-2.local в вашем веб-браузере.

Веб-сервер ESP32 mDNS

Заключение

В этом руководстве вы узнали, как использовать и настраивать mDNS на ваших платах ESP32, программируемых через Arduino IDE. mDNS позволяет назначать определённые имена хостов вашим устройствам в локальной сети. Таким образом, вы можете обращаться к ним по имени хоста, что более удобно для пользователя, вместо IP-адреса.

Используя библиотеку mDNS.h, довольно просто добавить эту функцию в ваши проекты веб-серверов ESP32.

Мы надеемся, что это руководство было вам полезно.

Узнайте больше о ESP32 с помощью наших ресурсов:


Источник: :doc:`ESP32: Set Up mDNS (Arduino IDE) <../esp32-mdns-arduino/index>` — Random Nerd Tutorials, Rui Santos & Sara Santos