aes67_mdns.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * SPDX-FileCopyrightText: 2026 DatanoiseTV
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /*
  7. * mDNS service advertisement for AES67/RAVENNA.
  8. *
  9. * Advertises this node as an AES67 device using DNS-SD/mDNS,
  10. * making it discoverable by other AES67 devices on the network.
  11. */
  12. #include "aes67_net.h"
  13. #include "aes67_config.h"
  14. #include <string.h>
  15. #include "esp_log.h"
  16. #include "mdns.h"
  17. static const char *TAG = "aes67_mdns";
  18. esp_err_t aes67_mdns_init(const char *node_name, uint16_t rtp_port)
  19. {
  20. esp_err_t err = mdns_init();
  21. if (err != ESP_OK) {
  22. ESP_LOGE(TAG, "mdns_init failed: %s", esp_err_to_name(err));
  23. return err;
  24. }
  25. err = mdns_hostname_set(node_name);
  26. if (err != ESP_OK) {
  27. ESP_LOGE(TAG, "mdns_hostname_set failed: %s", esp_err_to_name(err));
  28. return err;
  29. }
  30. err = mdns_instance_name_set(node_name);
  31. if (err != ESP_OK) {
  32. ESP_LOGW(TAG, "mdns_instance_name_set failed: %s", esp_err_to_name(err));
  33. }
  34. /* Advertise as RAVENNA/AES67 device */
  35. mdns_txt_item_t txt_items[] = {
  36. { "proto", "AES67" },
  37. { "rate", "48000" },
  38. { "ch", "2" },
  39. };
  40. err = mdns_service_add(node_name, "_ravenna", "_udp",
  41. rtp_port, txt_items, 3);
  42. if (err != ESP_OK) {
  43. ESP_LOGE(TAG, "mdns_service_add _ravenna._udp failed: %s",
  44. esp_err_to_name(err));
  45. return err;
  46. }
  47. /* Also advertise the rtsp service for SDP retrieval */
  48. err = mdns_service_add(node_name, "_rtsp", "_tcp", 554, NULL, 0);
  49. if (err != ESP_OK) {
  50. ESP_LOGW(TAG, "mdns_service_add _rtsp._tcp failed (non-critical)");
  51. }
  52. ESP_LOGI(TAG, "mDNS services registered: %s", node_name);
  53. return ESP_OK;
  54. }
  55. esp_err_t aes67_mdns_update_txt(uint32_t sample_rate, uint8_t channels)
  56. {
  57. char rate_str[12];
  58. char ch_str[4];
  59. snprintf(rate_str, sizeof(rate_str), "%lu", (unsigned long)sample_rate);
  60. snprintf(ch_str, sizeof(ch_str), "%u", channels);
  61. mdns_txt_item_t txt_items[] = {
  62. { "proto", "AES67" },
  63. { "rate", rate_str },
  64. { "ch", ch_str },
  65. };
  66. return mdns_service_txt_set("_ravenna", "_udp", txt_items, 3);
  67. }
  68. void aes67_mdns_deinit(void)
  69. {
  70. mdns_service_remove_all();
  71. mdns_free();
  72. ESP_LOGI(TAG, "mDNS services removed");
  73. }