ESPHome 2026.2.1
Loading...
Searching...
No Matches
mdns_esp32.cpp
Go to the documentation of this file.
2#if defined(USE_ESP32) && defined(USE_MDNS)
3
4#include <mdns.h>
6#include "esphome/core/hal.h"
7#include "esphome/core/log.h"
8#include "mdns_component.h"
9
10namespace esphome::mdns {
11
12static const char *const TAG = "mdns";
13
14static void register_esp32(MDNSComponent *comp, StaticVector<MDNSService, MDNS_SERVICE_COUNT> &services) {
15#ifdef USE_OPENTHREAD
16 // OpenThread handles service registration via SRP client
17 // Services are compiled by MDNSComponent::compile_records_() and consumed by OpenThreadSrpComponent
18#else
19 esp_err_t err = mdns_init();
20 if (err != ESP_OK) {
21 ESP_LOGW(TAG, "Init failed: %s", esp_err_to_name(err));
22 comp->mark_failed();
23 return;
24 }
25
26 const char *hostname = App.get_name().c_str();
27 mdns_hostname_set(hostname);
28 mdns_instance_name_set(hostname);
29
30 for (const auto &service : services) {
31 // Stack buffer for up to 16 txt records, heap fallback for more
32 SmallBufferWithHeapFallback<16, mdns_txt_item_t> txt_records(service.txt_records.size());
33 for (size_t i = 0; i < service.txt_records.size(); i++) {
34 const auto &record = service.txt_records[i];
35 // key and value are either compile-time string literals in flash or pointers to dynamic_txt_values_
36 // Both remain valid for the lifetime of this function, and ESP-IDF makes internal copies
37 txt_records.get()[i].key = MDNS_STR_ARG(record.key);
38 txt_records.get()[i].value = MDNS_STR_ARG(record.value);
39 }
40 uint16_t port = const_cast<TemplatableValue<uint16_t> &>(service.port).value();
41 err = mdns_service_add(nullptr, MDNS_STR_ARG(service.service_type), MDNS_STR_ARG(service.proto), port,
42 txt_records.get(), service.txt_records.size());
43
44 if (err != ESP_OK) {
45 ESP_LOGW(TAG, "Failed to register service %s: %s", MDNS_STR_ARG(service.service_type), esp_err_to_name(err));
46 }
47 }
48#endif
49}
50
51void MDNSComponent::setup() { this->setup_buffers_and_register_(register_esp32); }
52
54#ifndef USE_OPENTHREAD
55 mdns_free();
56 delay(40); // Allow the mdns packets announcing service removal to be sent
57#endif
58}
59
60} // namespace esphome::mdns
61
62#endif // USE_ESP32
const std::string & get_name() const
Get the name of this Application set by pre_setup().
void setup_buffers_and_register_(PlatformRegisterFn platform_register)
void IRAM_ATTR HOT delay(uint32_t ms)
Definition core.cpp:26
Application App
Global storage of Application pointer - only one Application can exist.