Имя узла mDNS с другого устройства назначается как локальное.

Вопрос или проблема

У меня странная проблема. У меня есть встроенное устройство ESP32, запускающее сервер mDNS, которому я присваиваю имя хоста. Для справки, я включил этот код для устройства ESP32 ниже.

Когда я выполняю ping этого имени хоста с моего ПК на Ubuntu в той же локальной сети, это имя хоста становится локальным, и на самом деле оно не пингует устройство. Неважно, какое имя хоста я изменяю на устройстве esp, это происходит. В данном случае я назвал его audio-server и пингую его следующим образом:

ping audio-server.local
PING audio-server.local (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.048 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.044 ms

Что именно здесь происходит?

static void mdns_delegate_hostname(void)
{
    esp_err_t err = ESP_OK;

    char *delegated_hostname = "audio-server";

    esp_netif_t *intf = esp_netif_get_default_netif();;

    while (intf == NULL)
    {
         ESP_LOGE(TAG, "ERROR ! netif is NULL");
         intf = esp_netif_get_default_netif();
         sleep(2);
    }

    mdns_ip_addr_t addr4, addr6;
    addr4.addr.type = ESP_IPADDR_TYPE_V4;
    esp_netif_ip_info_t info;
    esp_netif_get_ip_info(intf, &info);

    ESP_LOGI(TAG, "IP Address of device is : " IPSTR "\n", IP2STR(&info.ip));

    addr4.addr.u_addr.ip4 = info.ip;
    addr6.addr.type = ESP_IPADDR_TYPE_V6;
    esp_netif_get_ip6_linklocal(intf, &addr6.addr.u_addr.ip6);
    addr4.next = &addr6;
    addr6.next = NULL;

    ESP_LOGI(TAG, "Setting delegated hostname to %s\n", delegated_hostname);

    err = mdns_delegate_hostname_add(delegated_hostname, &addr4);
    if (err != ESP_OK)
    {
        ESP_LOGE(TAG, "ERROR Setting delegated hostname to %s\n", delegated_hostname);
        return;
    }

    err = mdns_service_add_for_host(NULL, "_http", "_tcp", delegated_hostname, 80, NULL, 0);
    if (err != ESP_OK)
    {
        ESP_LOGE(TAG, "ERROR adding service for host %s\n", delegated_hostname);
    }
} 

Код находит “сетевой интерфейс по умолчанию” устройства ESP32 на основе параметров маршрутизации, затем использует его IP-адрес и настроенное имя хоста, чтобы объявить о наличии устройства и доступности его HTTP-сервиса через mDNS.

Код для поиска “сетевого интерфейса по умолчанию” довольно простой, и я бы предположил, что если на устройстве ESP32 не настроен шлюз по умолчанию, код может случайно выбрать интерфейс обратной связи 127.0.0.1 в качестве “по умолчанию”, и система в итоге заявит, что она находится по этому адресу.

Поэтому: убедитесь, что устройство ESP32 действительно настроено с разумным значением шлюза по умолчанию. Если устройство в закрытой сети, не имеющей реального маршрута в интернет, используйте IP-адрес ПК на Ubuntu в качестве фиктивного “шлюза по умолчанию” для ESP32. Вам не нужно ничего особенного на ПК с Ubuntu: цель этого состоит в том, чтобы убедиться, что код, который вы вставили, видит “шлюз по умолчанию”, связанный с физическим сетевым интерфейсом ESP32, и, таким образом, выберет его IP-адрес для объявления через mDNS, а не 127.0.0.1.

Ответ или решение

Ваш вопрос связан с проблемой конфликта имен и IP-адресов, возникающей при использовании ESP32 устройства, работающего как сервер mDNS. Ваша проблема заключается в том, что при попытке пинга хоста с именем audio-server.local с локальной сети, запрос направляется на локальный IP-адрес (127.0.0.1), что неверно.

Основные ошибки и их причины:

  1. Петля обращения: На вашем Ubuntu ПК происходит разрешение имени audio-server.local в адрес 127.0.0.1 вместо адреса устройства ESP32. Это указывает на то, что хостнейм audio-server неправильно регистрируется или некорректно разрешается.

  2. Неопределенная сетевая конфигурация ESP32: Если ESP32 не имеет корректно настроенных сетевых параметров, таких как шлюз по умолчанию, интерфейс может выбрать localhost (127.0.0.1) как "правильный" адрес.

Рекомендации по устранению проблемы:

  1. Проверка конфигурации сетевых параметров ESP32:

    • Убедитесь, что в настройках сетевого интерфейса ESP32 указан корректный шлюз по умолчанию.
    • Если ваше устройство находится в закрытой сети без выхода в интернет, используйте IP-адрес вашего Ubuntu ПК как "фиктивный" шлюз по умолчанию.
  2. Детальная настройка mDNS на ESP32:

    • Проверьте правильность вызова функций mdns: mdns_delegate_hostname_add и mdns_service_add_for_host. Ваша функция конфигурации mdns_delegate_hostname должна гарантировать, что ESP32 регистрирует свое имя и IP правильно.
  3. Диагностика на Ubuntu ПК:

    • Убедитесь, что в файле /etc/hosts отсутствуют любые записи, которые могли бы перенаправлять audio-server.local на 127.0.0.1.
    • Используйте команды вроде avahi-browse или dig для диагностики работы mDNS и проверки, как именно разрешается имя на Ubuntu.
  4. Логирование и отладка:

    • Расширьте логи mdns на стороны ESP32 для мониторинга процесса регистрации хоста.

Заключение

Следуя вышеупомянутым рекомендациям, вы устраните основную причину конфликта mDNS и обеспечите корректное разрешение имени на вашем устройстве. Важно обеспечить, чтобы все сетевые настройки ESP32 были выполнены правильно и, при необходимости, использовать инструменты диагностики для проверки разрешения имен на Ubuntu. Это позволит избежать маршрутизации запросов на localhost и обеспечит стабильную связь с вашим устройством.

Оцените материал
Добавить комментарий

Капча загружается...