mDNS не работает на ESP32

Решение проблем, когда имя хоста .local на ESP32 недоступно в сети, несмотря на включение mDNS в коде.


← Назад к решению проблем

Частые причины

  • 🌐

    mDNS не поддерживается сетью

    Некоторые роутеры или сетевые среды блокируют или не пересылают multicast DNS пакеты, предотвращая разрешение имён .local.

  • 🔧

    mDNS не запущен в коде

    Если MDNS.begin("esp32") отсутствует или расположен до подключения к Wi-Fi, служба не будет объявлена в сети.

  • 🧯

    Файрвол или антивирус блокирует mDNS

    Хост-системы вроде Windows или macOS могут иметь правила файрвола, блокирующие входящие ответы mDNS на порту 5353.

  • 📱

    Ограничения мобильной точки доступа или гостевой сети

    Некоторые режимы точек доступа, хотспоты или гостевые Wi-Fi сети изолируют клиентов и блокируют multicast-трафик, включая mDNS.

Симптомы

esp32.local не найден в браузере или при пинге

Попытка открыть http://esp32.local/ завершается ошибкой, хотя ESP32 находится в той же сети.

IP-адрес работает, но имя хоста — нет

ESP32 доступен по IP-адресу, но имя .local не разрешается.

Работает на одном компьютере, но не на другом

Некоторые системы корректно разрешают mDNS, а другие нет — часто из-за различий на уровне ОС или отсутствия служб обнаружения.

Bonjour или Avahi не запущены

На системах без встроенной поддержки mDNS (Linux, Windows) необходимые фоновые службы могут отсутствовать или быть остановлены.

Решения

Убедитесь, что MDNS.begin() вызывается после подключения к Wi-Fi

Инициализируйте mDNS после успешного подключения, разместив MDNS.begin("esp32") внутри обработчика события подключения к Wi-Fi.

Установите Bonjour (Windows) или Avahi (Linux)

Добавьте или включите инструменты клиента mDNS на вашем компьютере для поддержки разрешения .local на разных платформах.

Используйте IP-адрес как запасной вариант

Если mDNS ненадёжен, используйте WiFi.localIP() для получения IP-адреса устройства и прямого подключения.

Избегайте гостевых сетей и хотспотов

Используйте обычную локальную сеть, где клиенты могут обнаруживать друг друга через multicast; избегайте функций изоляции гостей или разделения клиентов.

Подробнее

mDNS не работает на ESP32

Вы пытаетесь открыть ESP32 по адресу http://esp32.local, но браузер сообщает «сервер не найден» или пинг не проходит. При этом, когда вы вводите IP-адрес напрямую (например, http://192.168.1.104), всё работает.

Это признак того, что multicast DNS (mDNS) — система, которая делает имена .local рабочими — не функционирует корректно в вашей сети или на устройстве. Это руководство поможет вам понять, как работает mDNS на ESP32 и что делать, когда он не работает.


Что такое mDNS?

Multicast DNS позволяет устройствам в локальной сети разрешать имена вроде esp32.local без центрального DNS-сервера. Он использует multicast-трафик на порту 5353 и часто применяется в локальных сетях для обнаружения IoT-устройств, принтеров и т.д.

ESP32 поддерживает mDNS через библиотеку ESPmDNS. В коде:

#include <ESPmDNS.h>

if (!MDNS.begin("esp32")) {
  Serial.println("Ошибка запуска mDNS");
}

Это должно сделать esp32.local доступным — но только если сеть и ваша хост-система это позволяют.


Распространённые симптомы неработающего mDNS

esp32.local не разрешается

Вы можете пинговать IP-адрес ESP32 напрямую, но:

ping esp32.local

возвращает Host not found (Хост не найден).

Работает только на некоторых устройствах

mDNS может работать на одном ноутбуке (например, MacBook), но не на другом (например, ПК с Windows), что указывает на различия на уровне ОС или служб.

Работает по IP-адресу, не работает по имени хоста

Все функции через IP (HTTP, OTA и т.д.) работают идеально, но .local никогда не разрешается. Это часто встречается на Windows, если Bonjour не установлен.


Основные причины и исправления

🧯 mDNS неправильно инициализирован

MDNS.begin() должен вызываться после подключения ESP32 к Wi-Fi:

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
  delay(500);
}

MDNS.begin("esp32");

Если он выполняется слишком рано (до инициализации сетевого стека), он тихо завершится неудачей.

🔒 Bonjour или Avahi не установлены

На Windows mDNS требует Apple Bonjour (поставляется с iTunes или доступен отдельно).

На Linux установите avahi-daemon и nss-mdns:

sudo apt install avahi-daemon libnss-mdns

macOS имеет встроенную поддержку mDNS через Bonjour.

🌐 Сеть не поддерживает multicast

Многие гостевые Wi-Fi сети или мобильные хотспоты блокируют трафик между клиентами или multicast-пакеты.

Исправления:

  • Используйте домашний роутер, а не телефонный хотспот
  • Отключите «Изоляцию AP» (AP Isolation) в настройках роутера
  • Убедитесь, что все устройства находятся в одной подсети

🛡 Файрвол блокирует порт 5353

На некоторых системах файрволы блокируют входящие или исходящие UDP-пакеты на порту 5353. Проверьте правила файрвола или попробуйте временно отключить его для теста.


Полный пример с mDNS и HTTP-сервером

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WebServer.h>

const char* ssid = "ВашаСеть";
const char* password = "ВашПароль";

WebServer server(80);

void handleRoot() {
  server.send(200, "text/html", "<h1>ESP32 mDNS работает!</h1>");
}

void setup() {
  Serial.begin(115200);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("\nWiFi подключён");
  Serial.print("IP-адрес: ");
  Serial.println(WiFi.localIP());
  
  // Запуск mDNS ПОСЛЕ подключения к Wi-Fi
  if (MDNS.begin("esp32")) {
    Serial.println("mDNS запущен: http://esp32.local");
    MDNS.addService("http", "tcp", 80);
  } else {
    Serial.println("Ошибка запуска mDNS!");
  }
  
  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP-сервер запущен");
}

void loop() {
  server.handleClient();
}

После загрузки этого кода ESP32 будет доступен по адресу http://esp32.local (при условии, что ваша система поддерживает mDNS).


Обходные решения и альтернативы

  • Выведите IP в Serial Monitor и используйте его:
Serial.println(WiFi.localIP());
  • Используйте Captive Portal или MQTT-брокер с фиксированным IP вместо mDNS.

  • Для продакшена рассмотрите использование статического IP или обнаружение через DHCP по известной конечной точке.

  • Если вы используете несколько ESP32, давайте каждому уникальное имя:

MDNS.begin("esp32-kitchen");   // http://esp32-kitchen.local
MDNS.begin("esp32-garage");    // http://esp32-garage.local

Заключение

mDNS на ESP32 — мощная функция, но она зависит от:

  • Правильного времени вызова в прошивке
  • Поддержки хост-ОС (Bonjour, Avahi)
  • Сетевых политик, разрешающих multicast

Если esp32.local не работает, проверьте основы:

  • Вызывается ли MDNS.begin() после подключения к Wi-Fi?
  • Поддерживает ли ваша ОС mDNS?
  • Находитесь ли вы в сети, разрешающей локальное обнаружение?

С правильной настройкой mDNS может сделать ваш ESP32 мгновенно обнаруживаемым в любой локальной сети — без необходимости запоминать IP-адреса.

Быстрая навигация

Дополнительные ресурсы

Всё ещё есть проблема с ESP32? Давайте решим её вместе.

Наш интерактивный мастер устранения неполадок проведёт вас через распространённые проблемы ESP32 и их решения шаг за шагом.

Начать устранение неполадок

Регистрация не требуется. Начните решать проблемы прямо сейчас!

Узнайте больше о нашем процессе устранения неполадок →