Перейти к содержанию

Как сделать, чтобы 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Что обычно означает
8WIFI_REASON_ASSOC_LEAVEотключились сами или по команде
15WIFI_REASON_4WAY_HANDSHAKE_TIMEOUTчасто неверный пароль
200WIFI_REASON_BEACON_TIMEOUTпропали маяки точки — слабый сигнал или точка выключена
201WIFI_REASON_NO_AP_FOUNDсеть не найдена: имя, канал, диапазон
202WIFI_REASON_AUTH_FAILаутентификация не прошла
205WIFI_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 советует ограничить число непрерывных попыток или вставлять паузы, чтобы между ними оставалось время на сканирование.

Источники

  1. 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(), различать причины — обязанность приложения
  2. 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: переподключиться, закрыть и при необходимости пересоздать сокеты; при постоянных попытках подключения сканирование не завершается — нужен счётчик попыток и паузы
  3. 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

Нашли ошибку?