Очень медленное подключение к WiFi с ESP32 (минуты, а не секунды)

У меня возникли некоторые проблемы с подключением к WiFi с помощью платы ESP32. Она очень медленная. Первые несколько раз, когда я пробовал, я оставлял ее в покое на 20 минут, и она все равно не могла подключиться. Поэтому я подумал, что это не работает. Поэтому я попробовал использовать MicroPython и ESP-IDF, и они оба сработали, хотя MicroPython был немного медленным (~10-20 секунд), но ESP-IDF был мгновенным. Затем я вернулся к Arduino, и на этот раз она в конечном итоге подключилась через 260 секунд (> 4 минуты). Другая попытка заняла 420 секунд (7 минут). Кто-нибудь еще сталкивался с подобными проблемами?

Что я пробовал:

  • Попробовал другую плату той же модели, чтобы убедиться, что она не бракованная.
  • Попробовал другую точку доступа WiFi с тем же результатом.

Хотя MicroPython и фреймворк ESP-IDF работают отлично, я все же надеюсь остановиться на Arduino из-за его простоты и моей ненависти к Python, но не держите на меня зла, если он вам нравится :-).

Моя доска: ESP-WROOM-32(https://www.amazon.com/gp/product/B0B764963C). В Arduino IDE я выбираю «ESP32-WROOM-DA Module». Я также пробовал «uPesy ESP32 Wroom DevKit» с теми же результатами.

Основная версия — «esp32 by Espressif Systems» 2.0.11.

Мои сетевые настройки: TP-Link EAP225, работает как выделенная точка доступа, а не маршрутизатор. Мой маршрутизатор — Linksys WRT1900ACS, работающий на OpenWrt 19.07.2 r10947-65030d81f3.

Другая настройка, которую я попробовал, — это D-Link DIR-842, работающий и как точка доступа, и как маршрутизатор, хотя я не подключал восходящий порт.

Мой код:

#include <WiFi.h>

const char* ssid = "delingtest";
const char* password = "XxxxxYyyy00";

void setup() {
  Serial.begin(115200);
  Serial.println(millis()); // Для измерения времени соединения
  Serial.print("Connecting to WiFi network ");
  Serial.print(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  do {
    Serial.print(".");
    delay(5000);
  } while (!WiFi.isConnected());

  Serial.println("done.");
  Serial.println(millis()); // Для измерения времени соединения
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
}

Дополнительная информация:

  • Когда я использовал MicroPython, я подключался интерактивно. Ссылка: https://docs.micropython.org/en/latest/esp8266/tutorial/network_basics.html
  • Для ESP-IDF я использовал пример кода здесь: https://github.com/espressif/esp-idf/tree/master/examples/wifi/getting_started/station
  • Я проверил журнал на DHCP-сервере (работающем под управлением OpenWRT), время между получением DHCP-запроса и предложением IP-адреса было коротким (см. ниже).
Wed Mar 13 16:57:55 2024 daemon.info dnsmasq-dhcp[13394]: DHCPDISCOVER(br-lan) 40:22:d8:78:7a:38
Wed Mar 13 16:57:55 2024 daemon.info dnsmasq-dhcp[13394]: DHCPOFFER(br-lan) 192.168.1.145 40:22:d8:78:7a:38
Wed Mar 13 16:57:55 2024 daemon.info dnsmasq-dhcp[13394]: DHCPREQUEST(br-lan) 192.168.1.145 40:22:d8:78:7a:38
Wed Mar 13 16:57:55 2024 daemon.info dnsmasq-dhcp[13394]: DHCPACK(br-lan) 192.168.1.145 40:22:d8:78:7a:38 esp32-787A38

Редактировать:

Я добавил код для отправки ping-запроса на шлюз после установления соединения:

  IPAddress ip (192, 168, 1, 1);
  bool ret = Ping.ping(ip);

И засек время. Каждый пинг занимал около 4-5 секунд. Так что это не просто медленное подключение к сети WiFi, это также очень медленное выполнение пинга, и, вероятно, все остальное.

Правка при редактировании: После включения подробного ведения журнала я понял, что на самом деле ping делает то же самое, что и ping -c 5, с 1 секундой между пингами. Так что, это занимает 4 секунды, несмотря ни на что. Изначально я думал, что он отправляет только один пинг за вызов.

, 👍2


1 ответ


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

4

Хм, я только что попробовал третью плату и, кажется, нашел первопричину. Если плата вставлена в макетную плату. Она медлееееедленно или вообще не может подключиться. Но если я ее вытащу, она, кажется, подключается за несколько секунд. Так что, полагаю, проблема действительно в том, что макетная плата мешает встроенной антенне. Мне, вероятно, понадобится 32U с разъемом для внешней антенны для конечного продукта.

,