diff --git a/esphome/components/mdns/mdns_component.cpp b/esphome/components/mdns/mdns_component.cpp index 47db92610a..3232cd3cac 100644 --- a/esphome/components/mdns/mdns_component.cpp +++ b/esphome/components/mdns/mdns_component.cpp @@ -120,7 +120,7 @@ void MDNSComponent::compile_records_(StaticVectorget_noise_ctx().has_psk(); + bool has_psk = api::global_api_server->get_noise_ctx()->has_psk(); const char *encryption_key = has_psk ? TXT_API_ENCRYPTION : TXT_API_ENCRYPTION_SUPPORTED; txt_records.push_back({MDNS_STR(encryption_key), MDNS_STR(NOISE_ENCRYPTION)}); #endif diff --git a/esphome/components/mdns/mdns_libretiny.cpp b/esphome/components/mdns/mdns_libretiny.cpp index 7b104ed2d7..986099fa1f 100644 --- a/esphome/components/mdns/mdns_libretiny.cpp +++ b/esphome/components/mdns/mdns_libretiny.cpp @@ -1,13 +1,41 @@ #include "esphome/core/defines.h" #if defined(USE_LIBRETINY) && defined(USE_MDNS) -#include +#include "esphome/components/network/ip_address.h" +#include "esphome/components/network/util.h" +#include "esphome/core/application.h" +#include "esphome/core/log.h" +#include "mdns_component.h" -#include "mdns_arduino.h" +#include namespace esphome::mdns { -void MDNSComponent::setup() { this->setup_buffers_and_register_(register_arduino_mdns); } +static void register_libretiny(MDNSComponent *, StaticVector &services) { + MDNS.begin(App.get_name().c_str()); + + for (const auto &service : services) { + // Strip the leading underscore from the proto and service_type. While it is + // part of the wire protocol to have an underscore, and for example ESP-IDF + // expects the underscore to be there, the ESP8266 implementation always adds + // the underscore itself. + auto *proto = MDNS_STR_ARG(service.proto); + while (*proto == '_') { + proto++; + } + auto *service_type = MDNS_STR_ARG(service.service_type); + while (*service_type == '_') { + service_type++; + } + uint16_t port_ = const_cast &>(service.port).value(); + MDNS.addService(service_type, proto, port_); + for (const auto &record : service.txt_records) { + MDNS.addServiceTxt(service_type, proto, MDNS_STR_ARG(record.key), MDNS_STR_ARG(record.value)); + } + } +} + +void MDNSComponent::setup() { this->setup_buffers_and_register_(register_libretiny); } void MDNSComponent::on_shutdown() {} diff --git a/esphome/components/mdns/mdns_rp2040.cpp b/esphome/components/mdns/mdns_rp2040.cpp index 59688e7b36..e4a9b60cdb 100644 --- a/esphome/components/mdns/mdns_rp2040.cpp +++ b/esphome/components/mdns/mdns_rp2040.cpp @@ -1,13 +1,41 @@ #include "esphome/core/defines.h" #if defined(USE_RP2040) && defined(USE_MDNS) -#include +#include "esphome/components/network/ip_address.h" +#include "esphome/components/network/util.h" +#include "esphome/core/application.h" +#include "esphome/core/log.h" +#include "mdns_component.h" -#include "mdns_arduino.h" +#include namespace esphome::mdns { -void MDNSComponent::setup() { this->setup_buffers_and_register_(register_arduino_mdns); } +static void register_rp2040(MDNSComponent *, StaticVector &services) { + MDNS.begin(App.get_name().c_str()); + + for (const auto &service : services) { + // Strip the leading underscore from the proto and service_type. While it is + // part of the wire protocol to have an underscore, and for example ESP-IDF + // expects the underscore to be there, the ESP8266 implementation always adds + // the underscore itself. + auto *proto = MDNS_STR_ARG(service.proto); + while (*proto == '_') { + proto++; + } + auto *service_type = MDNS_STR_ARG(service.service_type); + while (*service_type == '_') { + service_type++; + } + uint16_t port = const_cast &>(service.port).value(); + MDNS.addService(service_type, proto, port); + for (const auto &record : service.txt_records) { + MDNS.addServiceTxt(service_type, proto, MDNS_STR_ARG(record.key), MDNS_STR_ARG(record.value)); + } + } +} + +void MDNSComponent::setup() { this->setup_buffers_and_register_(register_rp2040); } void MDNSComponent::loop() { MDNS.update(); }