Если в вашей сети есть один 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, поэтому, прежде чем продолжить, убедитесь, что у вас в данной IDE установлено дополнение для работы с ESP32.
Шаг 2. Подключите ESP32 к компьютеру
Для подключения платы ESP32 к компьютеру используйте кабель micro-USB.
Шаг 3. Настройка сетевых учетных данных
Перед загрузкой скетча ниже вам необходимо внести одно существенное изменение. Обновите следующие две переменные, указав ваш фактический SSID и пароль WiFi.
1 2 |
const char* ssid = "YourNetworkName"; // Enter SSID here const char* password = "YourPassword"; //Enter Password here |
Шаг 4. Загрузите код
Вот простой скетч, демонстрирующий настройку mDNS на плате ESP32. Этот код подключается к сети Wi-Fi, запускает службу mDNS и создает HTTP-сервер для обслуживания простой веб-страницы. После загрузки вы сможете получить доступ к веб-серверу, перейдя по адресу http://esp32.local/ в веб-браузере.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#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.
1 2 3 |
#include <WiFi.h> #include <WebServer.h> #include <ESPmDNS.h> |
Далее определяются две константы ssid
и password
. Это заполнители для имени вашей сети Wi-Fi (SSID) и пароля.
1 2 |
const char* ssid = "YourNetworkName"; // Enter SSID here const char* password = "YourPassword"; //Enter Password here |
Следующая строка создает объект веб-сервера, который прослушивает порт 80 (порт HTTP по умолчанию).
1 |
WebServer server(80); |
В функции setup() мы сначала инициализируем последовательную связь с ПК.
1 |
Serial.begin(115200); |
Затем ESP32 пытается подключиться к сети WiFi, используя функцию WiFi.begin()
, которая принимает SSID (имя сети) и пароль в качестве аргументов.
1 |
WiFi.begin(ssid, password); |
Пока ESP32 пытается подключиться к сети, мы можем проверить состояние подключения с помощью функции WiFi.status()
.
1 2 3 4 |
while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } |
Далее мы просто вызываем метод begin()
для внешней переменной с именем MDNS
для запуска службы mDNS. Эта MDNS
переменная является экземпляром класса MDNSResponder, который предоставляет всю функциональность разрешения адресов.
Вызов ранее упомянутого метода begin()
показан ниже. В качестве аргумента метода мы передаем желаемое имя хоста (которое будет использоваться в URL). Важно отметить, что имя хоста не должно быть длиннее 63 символов.
1 2 3 4 5 6 |
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 не найден на сервере.
1 2 |
server.on("/", handle_OnConnect); server.onNotFound(handle_NotFound); |
Наконец, чтобы запустить сервер, мы вызываем метод begin()
на объекте сервера.
1 |
server.begin(); |
Функция loop() непрерывно проверяет входящие клиентские запросы и обрабатывает их, вызывая метод handleClient()
на объекте сервера.
1 2 3 |
void loop() { server.handleClient(); } |
Это функция handle_OnConnect()
, которая отправляет HTML-ответ обратно клиенту при доступе к корневому URL («/»). Она отправляет простую HTML-страницу с приветственным сообщением, используя метод server.send()
.
Метод server.send()
принимает в качестве аргументов код ответа HTTP, тип контента и сам контент. В нашем случае мы отправляем код 200 (один из кодов статуса HTTP), который соответствует ответу OK (указывающему на то, что запрос был успешно обработан). Затем мы указываем тип контента как «text/html». Наконец, у нас есть длинная строка, которая представляет собой не что иное, как HTML-код, который создает простую веб-страницу, которая будет отображать сообщение «Привет!».
1 2 3 |
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.
1 2 3 |
void handle_NotFound(){ server.send(404, "text/plain", "Not found"); } |