Как сделать, чтобы ESP32 сам переподключался к Wi-Fi?
Обновлено Редакция GAW
Многие ждут, что ESP32 после пропадания сети подключится сам, как телефон. В ESP-IDF это не так: драйвер Wi-Fi сообщает об отключении событием, а решение — переподключаться или нет — принимает приложение.
Обработчик события
// Reconnect on WIFI_EVENT_STA_DISCONNECTED (ESP-IDF v6.1, Wi-Fi driver guide)
static bool user_disconnect; // set to true before calling esp_wifi_disconnect()
static int retries;
static void on_wifi(void *arg, esp_event_base_t base, int32_t id, void *data)
{
if (id == WIFI_EVENT_STA_DISCONNECTED && !user_disconnect) {
wifi_event_sta_disconnected_t *e = data;
ESP_LOGW("wifi", "disconnected, reason %d", e->reason);
if (++retries > 5) vTaskDelay(pdMS_TO_TICKS(10000)); // back off after 5 tries
esp_wifi_connect();
}
}
Пауза прямо в обработчике выбрана для краткости; в реальной программе её делают таймером или в отдельной задаче, чтобы не задерживать задачу событий. Счётчик попыток сбрасывают по событию IP_EVENT_STA_GOT_IP — после того как DHCP выдал адрес.
Что значит причина отключения
| Код | Имя в ESP-IDF | Что обычно означает |
|---|---|---|
| 8 | WIFI_REASON_ASSOC_LEAVE | отключились сами или по команде |
| 15 | WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT | часто неверный пароль |
| 200 | WIFI_REASON_BEACON_TIMEOUT | пропали маяки точки — слабый сигнал или точка выключена |
| 201 | WIFI_REASON_NO_AP_FOUND | сеть не найдена: имя, канал, диапазон |
| 202 | WIFI_REASON_AUTH_FAIL | аутентификация не прошла |
| 205 | WIFI_REASON_CONNECTION_FAIL | подключение не удалось |
Числа и имена — из esp_wifi_types_generic.h, расшифровка третьего столбца — наше обобщение. Код 201 при роутере на 12 или 13 канале разобран в ответе «Почему ESP32 не подключается к 12 или 13 каналу». Если модуль не отключается, а перезагружается, ищите просадку питания — ответ «Почему ESP32 перезагружается при включении Wi-Fi». Когда подключение есть, а интернета нет, проверьте адрес шлюза и DNS — ответ «Почему ESP32 со статическим IP не выходит в интернет». Модули и выводы — на странице ESP32.
Похожие вопросы
Нужно ли пересоздавать сокеты после переподключения?
Да. По описанию драйвера при событии отключения задача событий выключает сетевой интерфейс станции и очищает соединения TCP и UDP, после чего старые сокеты оказываются в неверном состоянии. Рекомендуется закрыть их и создать заново после события получения IP-адреса.
Почему ESP32 переподключается к другой точке доступа?
Если несколько точек передают один и тот же SSID, при каждом подключении драйвер выбирает лучшую из найденных. Чтобы привязаться к конкретной точке, в настройках станции задают её BSSID.
Можно ли сканировать сеть, пока идут попытки подключения?
Можно, но если программа сразу повторяет esp_wifi_connect() после каждой неудачи, сканирование может так и не завершиться. ESP-IDF советует ограничить число непрерывных попыток или вставлять паузы, чтобы между ними оставалось время на сканирование.
Источники
- Espressif Systems. ESP-IDF v6.1 Programming Guide, API Guides: Wi-Fi Driver — Overview (docs/en/api-guides/wifi-driver/overview.rst) — WIFI_EVENT_STA_DISCONNECTED возникает при вызове esp_wifi_disconnect() или esp_wifi_stop(), при неудачной попытке подключения (точка доступа не найдена, тайм-аут аутентификации) и при разрыве связи (потеря N маяков, отключение точкой доступа, смена режима аутентификации); по умолчанию задача событий выключает netif станции и очищает соединения UDP/TCP; обычная реакция — esp_wifi_connect(), но не после esp_wifi_disconnect(), различать причины — обязанность приложения
- Espressif Systems. ESP-IDF v6.1 Programming Guide, Wi-Fi Driver — Station scenarios (docs/en/api-guides/wifi-driver/station-scenarios.rst) — разд. Wi-Fi Reconnect: станция может отключиться по многим причинам, переподключение — ответственность приложения, рекомендованная стратегия — esp_wifi_connect() по событию отключения; при нескольких точках с одним SSID выбирается лучшая; сценарий s6.2: переподключиться, закрыть и при необходимости пересоздать сокеты; при постоянных попытках подключения сканирование не завершается — нужен счётчик попыток и паузы
- Espressif Systems. ESP-IDF v6.1, components/esp_wifi/include/esp_wifi_types_generic.h — wifi_err_reason_t: WIFI_REASON_ASSOC_LEAVE = 8, WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, WIFI_REASON_BEACON_TIMEOUT = 200, WIFI_REASON_NO_AP_FOUND = 201, WIFI_REASON_AUTH_FAIL = 202, WIFI_REASON_HANDSHAKE_TIMEOUT = 204, WIFI_REASON_CONNECTION_FAIL = 205
Нашли ошибку?
Смотрите также
- ESP32: выводы и GPIO34 GPIO: функции, свободные выводы, только входы, флеш-память, strapping, JTAG, токи
- Почему ESP32 перезагружается при включении Wi-Fi?Пики тока передатчика и просадка питания модуля
- Почему ESP32 со статическим IP не выходит в интернет?Шлюз не из подсети, неверная маска или нет DNS-сервера
- Почему ESP32 не подключается к Wi-Fi на 12 или 13 канале?12–14 сканируются пассивно: скрытый SSID не найдётся — канал 1–11 или политика MANUAL
- DHCPПротокол выдачи IP-адреса, маски и шлюза; аренда, DISCOVER–OFFER–REQUEST–ACK