Как настроить пул DHCP для ESP-WIFI-MESH?

Я создаю сетку с помощью комплектов разработчика ESP32 (ESP32-DevKitC V4), используя расширение ESP-IDF VS Code и пример проекта ip_internal_network. Код для примера, общие компоненты проекта и API связан. Когда узлы сети включаются и создают сеть, они используют сеть 10.0.0.0. Как изменить внутреннюю ячеистую сеть?

Мои операционные предположения:

  • Корневой узел получает внешний IP-адрес от внешнего DHCP. сервер.
  • Корневой узел действует как внутренний DHCP-сервер для узлов сети.
  • Корневой узел выполняет преобразование сетевых адресов.
  • Его сервер DHCPv4 работает на стеке TCP/IP lwIP.
  • Внутренние IP-адреса арендуются из пула, управляемого корнем. узел (но возможно, что узлы запрашивают конкретный адрес у эта сеть и сервер предоставляют следующую доступную; Я не уверен).
  • Сетевой адрес — 10.0.0.0/8 (я определил маску подсети; это может быть что угодно).

Очевидно, первое, что я попробовал — это поискать этот сетевой адрес в файлах. В рабочей области проекта ничего не было, а в репозитории было слишком много обращений, чтобы это было полезно. Я пробовал десятичные и шестнадцатеричные числа, но безуспешно.

Я также попытался отследить функцию, которая выводит IP-адрес на последовательный терминал, чтобы найти переменную IP, и поработать в обратном направлении, чтобы найти оператор, который инициализирует эту переменную. Я все еще читаю документацию по API обработчика событий, поэтому здесь мне тоже не удалось добиться быстрого прогресса.

Интерфейс программирования разделен на файлы заголовков компонентов ESP-IDF, системы сборки (CMake и Ninja?), параметры KConfig и инструменты хоста (idf.py?). C, FreeRTOS и системы сборки для меня новы, поэтому я был бы признателен, если бы кто-нибудь с большим опытом высказал свое мнение. Спасибо.

, 👍3


1 ответ


Лучший ответ:

2

Я понял это; это в mesh_netif.c:43. Я не уверен, почему я сначала пропустил этот файл, но это вызвало много ненужной головной боли. Соответствующая структура такова:

const esp_netif_ip_info_t g_mesh_netif_subnet_ip = {
    .ip = { .addr = ESP_IP4TOADDR( 192, 168, 0, 1) },
    .gw = { .addr = ESP_IP4TOADDR( 192, 168, 0, 1) },
    .netmask = { .addr = ESP_IP4TOADDR( 255, 255, 255, 0) },
};

Я изменил сеть 10.0.0.0/16 на 192.168.0.0/24. Корневой узел принимает адрес в .ip. Я предполагаю, что дочерние узлы проверяют таблицу ARP и увеличивают ее до тех пор, пока не станет доступен адрес, а затем отправляют DHCPREQUEST для этого адреса root. Я говорю «предположим». потому что, хотя root использует lwIP, я не уверен, что дочерние узлы используют lwIP (они могут просто обмениваться данными в кадрах ESP-WIFI-MESH уровня 2).

Убедитесь, что ваш DHCP-сервер публикует DNS-адрес IPv4, иначе ESP_ERROR_CHECK(esp_netif_set_dns_info(netif, ESP_NETIF_DNS_MAIN, &dns)) (mesh_netif.c:70) произойдет сбой и приведет к выключению и включению платы. . Чтобы обойти эту проблему, включите Использовать глобальный DNS-IP в менюconfig. Глобальное поле DNS имеет шестнадцатеричный формат, поэтому 10.32.64.128 записывается как 0x0A204080.

Внутренние IP-сообщения сети публикуются с помощью MQTT, поэтому имя/адрес .broker.address.uri в mqtt_app.c:74 должно быть доступно с маршрутизатора.

,