Руководство по настройке mDNS на ESP32

Как настроить mDNS на ESP32

Как настроить 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 в Arduino IDE

Микроконтроллер ESP32 быстро стал одной из самых популярных плат среди любителей, инженеров и людей, интересующихся Интернетом вещей (IoT)…

/lastminuteengineers/esp32-arduino-ide-tutorial/index

Шаг 2 — Подключение ESP32 к компьютеру

Используйте кабель micro-USB для подключения платы ESP32 к компьютеру.

ESP32, подключённый к компьютеру с помощью USB-кабеля

Шаг 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».

Вывод монитора порта mDNS

Далее откройте веб-браузер и перейдите по адресу http://esp32.local/. ESP32 должен отобразить веб-страницу с приветственным сообщением.

Скриншот веб-сервера ESP32 mDNS на рабочем столе

Объяснение кода

Скетч начинается с подключения необходимых библиотек: 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");
}