Usando registros TXT no mDNS para descrever o dispositivo
Até agora, usamos o mDNS para duas coisas principais: dar um nome local ao ESP32, como esp32-sensor.local, e anunciar que ele oferece um serviço HTTP em _http._tcp. Isso já é suficiente para muitos projetos, mas o mDNS permite ir um pouco além por meio dos registros TXT.
Os registros TXT são pequenos pares de texto associados a um serviço anunciado. Eles funcionam como metadados. Em vez de o ESP32 apenas dizer “eu tenho um servidor HTTP na porta 80”, ele também pode informar detalhes como versão do firmware, tipo do dispositivo, modelo da placa, local lógico de instalação ou recursos disponíveis.
Por exemplo, um ESP32 poderia anunciar o serviço HTTP com informações como:
board=esp32
fw_version=1.0.0
device_type=sensor
location=laboratorio
api=/api/v1
Esses dados não substituem uma API REST, um arquivo JSON de configuração ou um protocolo de gerenciamento. Eles servem para descoberta rápida. Um aplicativo cliente pode procurar dispositivos _http._tcp na rede e, antes mesmo de acessar a página web, filtrar quais dispositivos são sensores, atuadores, gateways ou painéis de controle.
A própria documentação oficial da Espressif apresenta o mDNS como um serviço UDP multicast usado para descoberta local de hosts e serviços; nas versões atuais do ESP-IDF, o componente fica separado do repositório principal e deve ser adicionado ao projeto como dependência espressif/mdns. (Espressif Systems) O registro oficial do componente espressif/mdns também o descreve como serviço para descoberta local de hosts e serviços. (Espressif Components)
No ESP-IDF, podemos declarar os registros TXT usando o tipo mdns_txt_item_t. Um exemplo prático seria:
#include "mdns.h"
/**
* @brief Lista de metadados TXT anunciados pelo serviço HTTP.
*
* Cada item é composto por uma chave e um valor textual.
* Esses dados ajudam aplicações clientes a identificar
* características do dispositivo antes de acessá-lo diretamente.
*/
static const mdns_txt_item_t service_txt_data[] = {
{"board", "esp32"},
{"fw_version", "1.0.0"},
{"device_type", "sensor"},
{"location", "laboratorio"},
{"api", "/api/v1"}
};
Agora podemos modificar a função de inicialização do mDNS para anunciar o serviço HTTP com esses metadados:
/**
* @brief Inicializa mDNS e anuncia o servidor HTTP com registros TXT.
*
* Após esta configuração, o ESP32 poderá ser encontrado como:
*
* http://esp32-sensor.local
*
* Além disso, clientes compatíveis poderão descobrir informações
* adicionais do serviço por meio dos registros TXT.
*
* @return ESP_OK em caso de sucesso.
*/
static esp_err_t app_mdns_start_http_service(void)
{
esp_err_t err;
err = mdns_init();
if (err != ESP_OK) {
ESP_LOGE(TAG, "Falha ao inicializar mDNS: %s", esp_err_to_name(err));
return err;
}
err = mdns_hostname_set("esp32-sensor");
if (err != ESP_OK) {
ESP_LOGE(TAG, "Falha ao definir hostname: %s", esp_err_to_name(err));
return err;
}
err = mdns_instance_name_set("ESP32 Sensor Ambiental");
if (err != ESP_OK) {
ESP_LOGE(TAG, "Falha ao definir nome da instância: %s", esp_err_to_name(err));
return err;
}
err = mdns_service_add(
"ESP32 Web Server",
"_http",
"_tcp",
80,
service_txt_data,
sizeof(service_txt_data) / sizeof(service_txt_data[0])
);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Falha ao anunciar serviço HTTP: %s", esp_err_to_name(err));
return err;
}
ESP_LOGI(TAG, "mDNS ativo: http://esp32-sensor.local");
ESP_LOGI(TAG, "Serviço _http._tcp anunciado com registros TXT");
return ESP_OK;
}
A linha mais importante é esta:
service_txt_data,
sizeof(service_txt_data) / sizeof(service_txt_data[0])
O primeiro argumento passa o vetor de metadados. O segundo informa quantos itens existem nesse vetor. Esse cálculo é uma prática comum em C para evitar escrever manualmente o número de elementos, reduzindo o risco de erro quando adicionamos ou removemos itens.
Em um produto real, os registros TXT podem ser usados de forma estratégica. Um aplicativo de instalação poderia procurar todos os dispositivos _http._tcp, mas mostrar ao usuário apenas os que possuem device_type=sensor. Uma ferramenta de manutenção poderia destacar dispositivos com fw_version antiga. Um sistema de laboratório poderia separar placas por location. Um gateway poderia localizar automaticamente nós compatíveis com uma determinada versão de API.
Também podemos usar registros TXT para indicar capacidades:
static const mdns_txt_item_t service_txt_data[] = {
{"board", "esp32"},
{"fw_version", "1.2.3"},
{"device_type", "gateway"},
{"mqtt", "yes"},
{"http", "yes"},
{"ota", "yes"}
};
Esse tipo de descrição ajuda especialmente quando a rede contém vários dispositivos parecidos. Em vez de depender apenas de nomes como esp32-01, esp32-02 e esp32-03, o cliente pode olhar os metadados e entender melhor o papel de cada nó.
Mas existe um cuidado importante: os registros TXT não devem carregar informações sensíveis. Não coloque senhas, tokens, chaves privadas, dados pessoais ou credenciais de API nesses campos. O mDNS opera na rede local e foi projetado para descoberta, não para sigilo. Qualquer dispositivo autorizado a participar daquela rede pode, em princípio, observar os anúncios mDNS.
Portanto, a boa prática é usar TXT para informações públicas e úteis: tipo do dispositivo, versão, nome do produto, rota base da API, capacidades e localização lógica. Para dados sensíveis, use autenticação, criptografia, TLS quando aplicável e mecanismos próprios da aplicação.
Com isso, o mDNS deixa de ser apenas um resolvedor de nomes locais e passa a funcionar como uma pequena camada de inventário dinâmico da rede. Em sistemas IoT com vários ESP32, essa capacidade pode simplificar instalação, diagnóstico e integração entre dispositivos.