En esta entrada vamos a ver cómo emplear el multicast DNS (mDNS) para acceder a un ESP8266 o ESP32 de nuestra red local por su nombre sin tener que conocer su dirección IP.
Haremos referencia al ESP8266, pero el mismo código es compatible para el ESP32, ajustando el nombre de las librerías. Al final tenéis el código tanto para el ESP8266 como para el ESP32.
Llevamos unas entradas viendo cómo conectar el ESP8266 en modo STA y modo AP. Una vez conectados, normalmente la primera necesidad será encontrar nuestro dispositivo en la red local.
En la entrada anterior vimos cómo resolverlo configurando una IP estática. Otra alternativa es emplear un escáner de red. Sin embargo, también es posible emplear el mDNS para localizar el dispositivo por su nombre.
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://esp8266.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 ESP8266
ESP8266 soporta mDNS a través de la librería ‘ESP8266mDNS.h’. Su uso es muy sencillo, podemos configurarlo con la instrucción MDNS.begin(...)
. Aquí tenemos un ejemplo.
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.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 esp8266.local
if (!MDNS.begin("esp8266"))
{
Serial.println("Error iniciando mDNS");
}
Serial.println("mDNS iniciado");
}
void loop()
{
}
En el caso del ESP32 la librería se llama ‘ESP8266mDNS’ se llama simplemente ‘mDNS’.
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 <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include "config.h" // Sustituir con datos de vuestra red
#include "ESP8266_Utils.hpp"
#include "ESP8266_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í, por ahora, las entradas destinadas a configurar la conexión del ESP8266. En la próxima entrada veremos cómo configurar un cliente, y en las siguientes cómo hacer que el ESP8266 actué cómo servidor. ¡Hasta pronto!
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