How to update mDNS?

mDNS en ESP8266/ESP32: La Guía Completa

28/04/2018

Valoración: 4.86 (2834 votos)

Seguramente te ha pasado: desarrollas un proyecto increíble con un ESP8266 o ESP32, le configuras una interfaz web y todo funciona de maravilla... siempre y cuando recuerdes su dirección IP. Intentas dar el siguiente paso lógico, configurar un nombre amigable como mi-proyecto.local, pero al escribirlo en el navegador, te encuentras con el temido error "Host no encontrado". Si esta situación te resulta familiar, has llegado al lugar correcto. Esta frustración es un problema común, pero la solución está en comprender y configurar correctamente el protocolo mDNS.

What is mDNS in ESP-IDF?
mDNS is a multicast UDP service that is used to provide local network service and host discovery. The ESP-IDF component mDNS has been moved from ESP-IDF since version v5.0 to a separate repository: To add mDNS component in your project, please run idf.py add-dependency espressif/mdns. The documentation can be found on the link below:

En esta guía definitiva, desglosaremos qué es el mDNS (Multicast DNS), por qué es fundamental para tus proyectos de IoT y, lo más importante, cómo implementarlo y solucionar los problemas más frecuentes tanto en el entorno de Arduino IDE como en el más avanzado ESP-IDF. Prepárate para decirle adiós a las direcciones IP y empezar a llamar a tus dispositivos por su nombre.

Índice de Contenido

¿Qué es Exactamente mDNS y Cómo Funciona?

mDNS, o Sistema de Nombres de Dominio Multicast, es un protocolo de red que permite a los dispositivos en una red local descubrirse entre sí y resolver nombres de host sin necesidad de un servidor DNS centralizado. Es una de las tecnologías clave detrás de lo que se conoce como "redes de configuración cero" (Zero-configuration networking).

Imagina una pequeña oficina sin un administrador de sistemas. En lugar de tener un servidor central que registre que "la impresora está en la IP 192.168.1.50", cada dispositivo simplemente "grita" en la red. Cuando tu ordenador quiere imprimir, pregunta a todos en la red: "¿Quién es impresora.local?". La impresora, que está escuchando, responde: "¡Soy yo, y mi IP es 192.168.1.50!".

Este proceso se realiza mediante paquetes UDP multicast, que son enviados a una dirección especial en la red local para que todos los dispositivos puedan escucharlos. Es un sistema descentralizado y eficiente para redes pequeñas.

  • En macOS y iOS: Se conoce como Bonjour y viene integrado de fábrica. Es la tecnología que permite que tu iPhone encuentre tu Apple TV o que tu Mac descubra impresoras en la red automáticamente.
  • En Linux: La implementación más común es a través del demonio Avahi, que suele venir preinstalado en la mayoría de las distribuciones modernas.
  • En Windows: El soporte no es nativo en todas las versiones. A menudo, se instala junto con software de Apple como iTunes o el instalador de "Bonjour Print Services", lo que habilita la resolución de nombres .local.

Implementando mDNS en ESP8266 con Arduino IDE

El entorno de Arduino es el punto de partida para muchos, y afortunadamente, implementar mDNS en un ESP8266 o ESP32 es bastante sencillo gracias a las librerías existentes. Abordemos el problema inicial: hacer que esp8266.local funcione.

Paso 1: Incluir las Librerías Necesarias

Para el ESP8266, necesitarás la librería ESP8266mDNS.h. Para el ESP32, la librería es ESPmDNS.h. Ambas vienen incluidas con la instalación del respectivo core para el Arduino IDE.

What is mDNS & how does it work?
mDNS is a multicast UDP service that is used to provide local network service and host discovery. mDNS is installed by default on most operating systems or is available as separate package. On Mac OS it is installed by default and is called Bonjour. Apple releases an installer for Windows that can be found on Apple’s support page.

Paso 2: Código Básico de Implementación

Aquí tienes un ejemplo de código mínimo y funcional para un ESP8266. El proceso es prácticamente idéntico para un ESP32, solo cambiando los nombres de las librerías.

#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> const char* ssid = "TU_SSID"; const char* password = "TU_PASSWORD"; void setup() { Serial.begin(115200); // Conectar a la red WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi conectado!"); Serial.print("Dirección IP: "); Serial.println(WiFi.localIP()); // Iniciar el servicio mDNS if (!MDNS.begin("esp8266")) { // El nombre será esp8266.local Serial.println("Error al configurar el respondedor mDNS!"); while(1) { delay(1000); } } Serial.println("Respondedor mDNS iniciado"); Serial.println("Ahora puedes acceder a http://esp8266.local"); } void loop() { // Es importante llamar a MDNS.update() en el loop para que el servicio siga funcionando. // Sin embargo, en las implementaciones más recientes para ESP8266/ESP32, // el servicio corre en su propia tarea, por lo que esta llamada ya no es estrictamente necesaria, // pero no está de más incluirla por compatibilidad. MDNS.update(); }

Nota importante: El nombre que pasas a la función MDNS.begin("nombre") se convertirá automáticamente en nombre.local. Elige un nombre descriptivo y sin espacios ni caracteres especiales.

Solución de Problemas: ¿Por Qué No Funciona Mi Dirección .local?

Has subido el código, el monitor serie dice "Respondedor mDNS iniciado", pero esp8266.local sigue sin funcionar. ¡No te desesperes! Este es el obstáculo más común. Aquí están las causas principales y cómo solucionarlas.

Causa del ProblemaSolución y Explicación
Firewall del Router o Sistema OperativomDNS utiliza tráfico multicast. Muchos routers, por seguridad o para optimizar el rendimiento del WiFi, bloquean o filtran este tipo de tráfico. Busca en la configuración de tu router opciones como "Filtro Multicast", "IGMP Snooping" o "Aislamiento de AP" y asegúrate de que no estén bloqueando la comunicación. Del mismo modo, el firewall de tu PC (especialmente en Windows) podría estar bloqueando el servicio.
Soporte mDNS en el Cliente (tu PC)Como mencionamos, no todos los sistemas operativos lo soportan de forma nativa. Si usas Windows, instala Bonjour Print Services de Apple. Esto suele resolver el problema en el 90% de los casos en este sistema. En Android, el soporte es nulo a nivel de sistema operativo; necesitarás una app de terceros como "Bonjour Browser".
Segmentación de RedSi tu router crea redes separadas para las bandas de 2.4 GHz y 5 GHz, y tu ESP está en la de 2.4 GHz mientras tu PC está en la de 5 GHz, es posible que el tráfico multicast no se reenvíe entre ellas. Intenta conectar tu PC a la misma red de 2.4 GHz que el ESP. Lo mismo aplica para redes de "invitados", que casi siempre están aisladas de la red principal.
Conflictos de NombreSi otro dispositivo en la red ya está usando el nombre esp8266.local, puede haber un conflicto. Intenta usar un nombre más único, como mi-esp-proyecto.local.

mDNS Avanzado: Publicidad de Servicios

Resolver un nombre de host es solo el principio. El verdadero poder de mDNS reside en su capacidad para anunciar servicios. Esto significa que tu ESP no solo puede decir "Hola, soy mi-esp.local", sino también "...y por cierto, ofrezco un servidor web en el puerto 80 y acepto actualizaciones OTA en el puerto 3232".

Esto es increíblemente útil para aplicaciones que necesitan descubrir y comunicarse con tus dispositivos automáticamente.

Anunciando Servicios en Arduino IDE

La misma librería mDNS te permite añadir servicios de forma muy sencilla. Simplemente añade estas líneas en tu setup(), después de MDNS.begin():

// Anunciar un servicio de servidor web MDNS.addService("http", "tcp", 80); // Anunciar el servicio de actualización OTA de Arduino MDNS.addService("arduino", "tcp", 3232); // Anunciar un servicio personalizado para una app móvil MDNS.addService("_myservice", "_udp", 1234);

Ahora, cualquier cliente mDNS en la red (como una app en tu teléfono o un script en tu PC) puede buscar servicios "_http._tcp" y encontrará tu ESP, junto con su IP y el puerto 80, sin necesidad de saber nada de antemano.

How to update mDNS?
You need to add the following line to the loop () { } ; section of the code : MDNS.update (); Once you do that. it should start working. And without that there is not way to get it working. Adding this comment for anyone following and searching for a solution to this same problem.

mDNS en el Ecosistema Profesional: ESP-IDF

Si trabajas con el framework oficial de Espressif, ESP-IDF, tienes un control mucho más granular sobre el comportamiento de mDNS. La funcionalidad es más potente, aunque la configuración requiere un poco más de código.

Importante: A partir de la versión 5.0 de ESP-IDF, el componente mDNS se movió a un repositorio separado. Debes añadirlo a tu proyecto ejecutando: idf.py add-dependency espressif/mdns.

Inicialización y Configuración del Host

En ESP-IDF, no basta con una sola línea. Debes inicializar el servicio y luego establecer sus propiedades, como el hostname y el nombre de instancia (un nombre más descriptivo).

#include "mdns.h" void start_mdns_service() { esp_err_t err = mdns_init(); if (err) { printf("Fallo al iniciar mDNS: %d\n", err); return; } // Establecer el hostname (ej: my-esp32.local) mdns_hostname_set("my-esp32"); // Establecer un nombre de instancia descriptivo mdns_instance_name_set("El ESP32 de Juan"); }

Publicidad de Servicios con Propiedades Adicionales (TXT Records)

ESP-IDF también facilita la adición de metadatos a tus servicios a través de registros TXT. Esto permite pasar información adicional, como el tipo de placa, un usuario o cualquier otro dato relevante.

void add_mdns_services() { // Añadir servicio HTTP en el puerto 80 mdns_service_add(NULL, "_http", "_tcp", 80, NULL, 0); // Opcional: Asignar un nombre de instancia único a este servicio mdns_service_instance_name_set("_http", "_tcp", "Servidor Web del ESP32 de Juan"); // Añadir metadatos (registros TXT) al servicio HTTP mdns_txt_item_t serviceTxtData[3] = { {"board", "esp32"}, {"user", "juan"}, {"version", "1.2"} }; mdns_service_txt_set("_http", "_tcp", serviceTxtData, 3); }

Preguntas Frecuentes (FAQ)

P: ¿Puedo usar cualquier nombre para mi dirección .local?
R: Técnicamente sí, pero es recomendable usar nombres de host estándar: solo letras, números y guiones. Evita espacios, guiones bajos o caracteres especiales para maximizar la compatibilidad.
P: Mi dispositivo se reinicia y el nombre .local deja de funcionar hasta que reinicio mi PC. ¿Qué pasa?
R: Esto suele ser un problema de caché en tu ordenador. Los sistemas operativos guardan las respuestas DNS por un tiempo. Al reiniciarse, el ESP puede obtener una nueva IP, pero tu PC sigue intentando contactar con la antigua. El problema se resuelve solo después de un tiempo (cuando la caché expira) o al reiniciar la interfaz de red de tu PC.
P: ¿Por qué mi teléfono Android no puede resolver la dirección .local?
R: Android, a diferencia de iOS y los sistemas de escritorio, no tiene un resolvedor de mDNS nativo a nivel de sistema. Por eso, escribir mi-esp.local en Chrome para Android no funcionará. Necesitarás usar una aplicación específica que implemente un cliente mDNS, como un "Service Browser" o "Bonjour Browser", para descubrir y conectar con tus dispositivos.
P: ¿Es seguro usar mDNS?
R: mDNS no incluye mecanismos de encriptación o autenticación. Está diseñado para redes locales de confianza. Cualquiera en la misma red puede descubrir tus dispositivos y los servicios que anuncian. Nunca expongas un dispositivo con mDNS directamente a Internet y úsalo solo en redes Wi-Fi protegidas con contraseña (WPA2/WPA3).

Conclusión

El Multicast DNS es una herramienta poderosa que eleva la usabilidad de cualquier proyecto de IoT, eliminando la barrera de tener que memorizar o buscar direcciones IP. Aunque su configuración inicial puede presentar desafíos, especialmente relacionados con el entorno de red y el sistema operativo cliente, entender sus fundamentos te permitirá diagnosticar y resolver la gran mayoría de los problemas.

Ya sea que estés dando tus primeros pasos con un ESP8266 en el Arduino IDE o desarrollando una aplicación compleja con ESP-IDF, dominar mDNS es una habilidad esencial. Te permitirá crear dispositivos más inteligentes, más fáciles de usar y que se integren de forma mucho más fluida en el ecosistema de la red local. ¡Ahora ve y libera tus proyectos de la tiranía de las direcciones IP!

Si quieres conocer otros artículos parecidos a mDNS en ESP8266/ESP32: La Guía Completa puedes visitar la categoría Juegos.

Subir