MCU & FPGA protocolos mDNS no ESP32 — tornando dispositivos IoT fáceis de encontrar na rede local

mDNS no ESP32 — tornando dispositivos IoT fáceis de encontrar na rede local


Como o mDNS funciona internamente

O mDNS, ou Multicast DNS, funciona como uma espécie de DNS local distribuído. Em um DNS tradicional, quando digitamos um endereço como exemplo.com, o computador consulta servidores DNS configurados na rede ou na internet para descobrir qual endereço IP corresponde àquele nome. No mDNS, a lógica muda: não existe necessariamente um servidor central. Os próprios dispositivos da rede local perguntam e respondem uns aos outros.

Quando um computador tenta acessar:

esp32-sensor.local

ele envia uma pergunta para a rede local perguntando, em termos simplificados: “Quem é esp32-sensor.local?”. O dispositivo que registrou esse nome, no nosso caso o ESP32, responde informando seu endereço IP. Essa comunicação é feita por UDP multicast, ou seja, uma mensagem enviada para um grupo especial de dispositivos dentro da rede local, não para a internet inteira. A própria documentação da Espressif define o mDNS como um serviço UDP multicast usado para descoberta local de hosts e serviços. (Espressif Systems)

O sufixo .local é uma parte importante dessa ideia. Ele indica que aquele nome deve ser resolvido dentro da rede local, usando mDNS, e não consultando servidores DNS públicos na internet. Assim, esp32-sensor.local não precisa estar registrado em nenhum provedor de domínio. Ele só precisa estar anunciado corretamente dentro da rede onde o ESP32 está conectado.

No ESP32, normalmente configuramos um hostname, que é o nome pelo qual o dispositivo será encontrado. Por exemplo, se configurarmos o hostname como:

esp32-sensor

o endereço esperado na rede local será:

esp32-sensor.local

Esse é o primeiro nível de uso do mDNS: descobrir o endereço IP de um dispositivo pelo nome. Ele já resolve grande parte dos problemas em projetos simples, como servidores HTTP embarcados, painéis de configuração, gateways locais ou dispositivos usados em bancada.

Mas o mDNS também pode fazer algo mais poderoso: anunciar serviços. Em vez de apenas dizer “este ESP32 existe”, ele também pode dizer “este ESP32 oferece um servidor HTTP na porta 80”, ou “este dispositivo oferece um serviço MQTT na porta 1883”. Na API atual do componente mDNS da Espressif, a função mdns_service_add() permite registrar um serviço informando nome da instância, tipo do serviço, protocolo, porta e itens TXT opcionais. (Espressif Systems)

A diferença entre descoberta de host e descoberta de serviço é essencial. Quando usamos apenas o hostname, queremos saber o IP de um equipamento. Quando anunciamos um serviço, queremos informar que tipo de recurso aquele equipamento oferece. Em um projeto IoT, isso permite que um aplicativo encontre automaticamente todos os dispositivos que oferecem determinado serviço na rede.

Por exemplo, um ESP32 poderia se anunciar como:

Host: esp32-sensor.local
Serviço: _http._tcp
Porta: 80

Nesse caso, um navegador poderia acessar o dispositivo pelo nome, enquanto um aplicativo mais inteligente poderia procurar na rede por todos os dispositivos que oferecem _http._tcp. Esse padrão é muito usado em impressoras, dispositivos Apple Bonjour, sistemas Linux com Avahi e vários equipamentos IoT. A documentação da Espressif também observa que o mDNS já vem instalado por padrão em muitos sistemas operacionais; no macOS ele aparece associado ao Bonjour, e no Linux costuma ser fornecido pelo Avahi. (Espressif Systems)

Outro ponto importante é que o mDNS foi pensado para redes locais. Ele não é uma solução para descobrir dispositivos pela internet. Em geral, ele funciona dentro do mesmo segmento de rede, como a mesma rede Wi-Fi ou LAN. Em redes mais complexas, com VLANs, roteadores corporativos, firewall ou isolamento entre clientes Wi-Fi, o multicast pode ser bloqueado. Isso não é uma falha do ESP32; é uma característica da infraestrutura de rede.

Para o desenvolvedor embarcado, a ideia prática é simples: depois que o ESP32 conecta no Wi-Fi e recebe um IP, inicializamos o serviço mDNS, definimos um hostname, opcionalmente definimos um nome amigável para a instância e registramos os serviços disponíveis. A partir daí, o dispositivo passa a responder consultas locais.

Em termos arquiteturais, podemos pensar o mDNS como um pequeno “catálogo vivo” dentro da rede local. Cada dispositivo anuncia quem é e o que oferece. Isso reduz acoplamento, porque o cliente não precisa saber previamente o IP do servidor. Também melhora manutenção, porque o endereço IP pode mudar sem quebrar o acesso pelo nome.

Related Post