En esta entrada vamos a ver cómo emplear el multicast DNS (mDNS) para acceder a un ESP32 de nuestra red local por su nombre sin tener que conocer su dirección IP.
El ejemplo está orientado a ESP32. En muchos casos también puede adaptarse a ESP8266 cambiando librerías y algunos detalles de pines.
Una vez conectados a la red, normalmente la primera necesidad será encontrar nuestro dispositivo en la red local.
Una forma de resolverlo es configurar una IP estática. Otra alternativa es emplear un escáner de red. Sin embargo, también es posible emplear mDNS para localizar el dispositivo por su nombre, que suele ser mucho más cómodo.
Los servidores DNS (unicast Domain Name System) contienen tablas que convierten nombres y dominios a una dirección IP. Estamos acostumbrados a su uso en Internet. Aunque es posible configurar un servidor DNS local, muchas redes locales pequeñas no disponen de un servidor DNS, por lo que sólo podemos acceder por su dirección IP.
Afortunadamente hay otra forma, el protocolo multicast DNS, que resuelve nombres de dominio que emplean ‘.local’ como sufijo. Por ejemplo, http://esp32.local
mDNS es un servicio Zeroconf que, esencialmente, emplea un funcionamiento similar a las DNS. Este protocolo fue publicado originalmente como RFC 6762, y usa multicast de paquetes UDP.
Los servicios Zeroconf (zero-configuration) son un conjunto de tecnologías que permiten crear una red automáticamente sobre protocolo TCP/IP sin configuración o servidores especiales
Cuando un cliente mDNS necesita resolver un nombre envía un mensaje multicast preguntando a los equipos de la red que se identifiquen. Los dispositivos que soporten mDNS responden con un mensaje que incluye su dirección IP.
Sin embargo, no todo es tan bonito como parece. mDNS no funciona de forma nativa en todos los sistemas operativos.
- Mac OSX soporta mDNS a través de su servicio Bonjour.
- Linux también lo soportan de forma nativa en muchas distribuciones.
- Windows soporta parcialmente mDNS, pero sólo para impresoras. Puede hacerse funcionar instalando el servicio Bonjour de Apple.
- Android implementa mDNS internamente, pero no resuelve los nombres mDNS de forma nativa.
mDNS en el ESP32
ESP32 soporta mDNS a través de la librería ESPmDNS.h. Su uso es muy sencillo, podemos configurarlo con la instrucción MDNS.begin(...). Aquí tenemos un ejemplo.
#include <WiFi.h>
#include <ESPmDNS.h>
const char* ssid = "ssid";
const char* password = "password";
void setup()
{
Serial.begin(115200);
delay(10);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(200); }
// Iniciar mDNS a direccion esp32.local
if (!MDNS.begin("esp32"))
{
Serial.println("Error iniciando mDNS");
}
Serial.println("mDNS iniciado");
}
void loop()
{
}
En ESP8266 la librería equivalente se llama ESP8266mDNS. El uso básico es muy parecido.
La implementación de la librería es muy interesante. Echarle un ojo si queréis aprendes más sobre el protocolo mDNS.
Ejemplo resumido
Siguiendo la filosofía que estamos teniendo en estos tutoriales, vamos a simplificar el código dividiéndolo. A los ficheros que ya teníamos, ‘config.h’ y ‘ESP_Utils.hpp’, añadimos un fichero llamado ‘ESP_Utils_mDNS.hpp’.
El código queda reducido a
#include <WiFi.h>
#include <ESPmDNS.h>
#include "config.h" // Sustituir con datos de vuestra red
#include "ESP32_Utils.hpp"
#include "ESP32_Utils_mDNS.hpp"
void setup()
{
Serial.begin(115200);
ConnectWiFi_STA();
InitMDNS();
}
void loop()
{
}
Añadimos un nuevo fichero llamado ‘ESP_Utils_mDNS.hpp’ que contenga
void InitMDNS()
{
if (!MDNS.begin(hostname))
{
Serial.println("Error iniciando mDNS");
}
Serial.println("mDNS iniciado");
}
Así de fácil, podemos acceder a nuestro ESP8266 a través de la URL ‘http://esp8266.local’. Por supuesto, podemos cambiar el nombre y la dirección al que nosotros queramos, cambiándolo en la función ‘MDNS.begin(…)’.
No obstante, y no es por echar un jarro de agua fría, la resolución de mDNS no es totalmente fiable. Casi seguro que en algún momento os acabará dando dificultades.
Para tener una solución realmente fiable, es mejor configurar una IP estática y, opcionalmente, configurar un DNS en nuestra red local. Sin embargo, el mDNS es una solución cómoda, y una alternativa a considerar.
Hasta aquí la configuración básica de red del ESP8266. Con STA, AP, IP estática y mDNS ya tenemos una buena base para construir clientes, servidores y dispositivos conectados bastante apañados.
Descarga el código
Todo el código de esta entrada está disponible para su descarga en Github.
Versión para el ESP8266: https://github.com/luisllamasbinaburo/ESP8266-Examples
Versión para el ESP32: https://github.com/luisllamasbinaburo/ESP32-Examples

