28/04/2018
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.

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.
¿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.

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 ennombre.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 Problema | Solución y Explicación |
|---|---|
| Firewall del Router o Sistema Operativo | mDNS 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 Red | Si 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 Nombre | Si 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.

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
.localdeja 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.localen 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.
