Вопрос или проблема
У меня странная проблема. У меня есть встроенное устройство 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), что неверно.
Основные ошибки и их причины:
-
Петля обращения: На вашем Ubuntu ПК происходит разрешение имени
audio-server.local
в адрес127.0.0.1
вместо адреса устройства ESP32. Это указывает на то, что хостнеймaudio-server
неправильно регистрируется или некорректно разрешается. -
Неопределенная сетевая конфигурация ESP32: Если ESP32 не имеет корректно настроенных сетевых параметров, таких как шлюз по умолчанию, интерфейс может выбрать localhost (127.0.0.1) как "правильный" адрес.
Рекомендации по устранению проблемы:
-
Проверка конфигурации сетевых параметров ESP32:
- Убедитесь, что в настройках сетевого интерфейса ESP32 указан корректный шлюз по умолчанию.
- Если ваше устройство находится в закрытой сети без выхода в интернет, используйте IP-адрес вашего Ubuntu ПК как "фиктивный" шлюз по умолчанию.
-
Детальная настройка mDNS на ESP32:
- Проверьте правильность вызова функций mdns:
mdns_delegate_hostname_add
иmdns_service_add_for_host
. Ваша функция конфигурацииmdns_delegate_hostname
должна гарантировать, что ESP32 регистрирует свое имя и IP правильно.
- Проверьте правильность вызова функций mdns:
-
Диагностика на Ubuntu ПК:
- Убедитесь, что в файле
/etc/hosts
отсутствуют любые записи, которые могли бы перенаправлятьaudio-server.local
на127.0.0.1
. - Используйте команды вроде
avahi-browse
илиdig
для диагностики работы mDNS и проверки, как именно разрешается имя на Ubuntu.
- Убедитесь, что в файле
-
Логирование и отладка:
- Расширьте логи mdns на стороны ESP32 для мониторинга процесса регистрации хоста.
Заключение
Следуя вышеупомянутым рекомендациям, вы устраните основную причину конфликта mDNS и обеспечите корректное разрешение имени на вашем устройстве. Важно обеспечить, чтобы все сетевые настройки ESP32 были выполнены правильно и, при необходимости, использовать инструменты диагностики для проверки разрешения имен на Ubuntu. Это позволит избежать маршрутизации запросов на localhost и обеспечит стабильную связь с вашим устройством.