[РЕШЕНО] Повторное подключение ESP32 к Wi-Fi после потери соединения
Это краткое руководство показывает, как можно переподключить ESP32 к сети Wi-Fi после потери соединения. Это может быть полезно в следующих ситуациях: ESP32 временно теряет сигнал Wi-Fi; ESP32 временно выходит из зоны действия Wi-Fi роутера; роутер перезагружается; роутер теряет интернет-соединение или в других подобных ситуациях.
Вам также может быть интересно посмотреть WiFiMulti. Эта функция позволяет зарегистрировать несколько сетей (комбинации SSID/пароль). ESP32 подключится к сети Wi-Fi с самым сильным сигналом (RSSI). Если соединение будет потеряно, он подключится к следующей сети в списке. Читайте: ESP32 WiFiMulti: подключение к самой сильной сети Wi-Fi (из списка сетей).
Переподключение к сети Wi-Fi после потери соединения
Для переподключения к Wi-Fi после потери соединения вы можете использовать WiFi.reconnect() для попытки переподключения к ранее подключённой точке доступа:
WiFi.reconnect()
Или вы можете вызвать WiFi.disconnect() с последующим WiFi.begin(ssid, password).
WiFi.disconnect();
WiFi.begin(ssid, password);
В качестве альтернативы, вы также можете перезагрузить ESP32 с помощью ESP.restart(), когда соединение потеряно.
Вы можете добавить что-то вроде фрагмента кода ниже в loop(), который периодически проверяет, подключена ли плата, и пытается переподключиться, если соединение было потеряно.
unsigned long currentMillis = millis();
// if WiFi is down, try reconnecting
if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {
Serial.print(millis());
Serial.println("Reconnecting to WiFi...");
WiFi.disconnect();
WiFi.reconnect();
previousMillis = currentMillis;
}
Не забудьте объявить переменные previousMillis и interval. Переменная interval соответствует периоду времени между каждой проверкой в миллисекундах (например, 30 секунд):
unsigned long previousMillis = 0;
unsigned long interval = 30000;
Вот полный пример.
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/solved-reconnect-esp32-to-wifi/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
// Replace with your network credentials (STATION)
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
unsigned long previousMillis = 0;
unsigned long interval = 30000;
void initWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
initWiFi();
Serial.print("RSSI: ");
Serial.println(WiFi.RSSI());
}
void loop() {
unsigned long currentMillis = millis();
// if WiFi is down, try reconnecting every CHECK_WIFI_TIME seconds
if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {
Serial.print(millis());
Serial.println("Reconnecting to WiFi...");
WiFi.disconnect();
WiFi.reconnect();
previousMillis = currentMillis;
}
}
Этот пример показывает, как подключиться к сети и проверять каждые 30 секунд, есть ли ещё подключение. Если подключения нет, он отключается и пытается переподключиться снова.
В качестве альтернативы, вы также можете использовать Wi-Fi Events для обнаружения потери соединения и вызова функции для обработки этой ситуации (см. следующий раздел).
ESP32 Wi-Fi Events
ESP32 способен обрабатывать различные события Wi-Fi. С помощью Wi-Fi Events вам не нужно постоянно проверять состояние Wi-Fi. Когда происходит определённое событие, автоматически вызывается соответствующая функция-обработчик.
Следующие события очень полезны для обнаружения потери или восстановления соединения:
ARDUINO_EVENT_WIFI_STA_CONNECTED: ESP32 подключился в режиме станции к точке доступа/хотспоту (вашему роутеру);ARDUINO_EVENT_WIFI_STA_DISCONNECTED: ESP32 в режиме станции отключился от точки доступа.
Перейдите к следующему разделу, чтобы увидеть пример применения.
Переподключение к сети Wi-Fi после потери соединения (Wi-Fi Events)
Wi-Fi Events могут быть полезны для обнаружения потери соединения и попытки переподключения сразу после этого (используется событие ARDUINO_EVENT_WIFI_STA_DISCONNECTED). Вот пример кода:
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/solved-reconnect-esp32-to-wifi/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("Connected to AP successfully!");
}
void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("Disconnected from WiFi access point");
Serial.print("WiFi lost connection. Reason: ");
Serial.println(info.wifi_sta_disconnected.reason);
Serial.println("Trying to Reconnect");
WiFi.begin(ssid, password);
}
void setup(){
Serial.begin(115200);
// delete old config
WiFi.disconnect(true);
delay(1000);
WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED);
WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);
WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
/* Remove WiFi event
Serial.print("WiFi Event ID: ");
Serial.println(eventID);
WiFi.removeEvent(eventID);*/
WiFi.begin(ssid, password);
Serial.println();
Serial.println();
Serial.println("Wait for WiFi... ");
}
void loop(){
delay(1000);
}
Как это работает?
В этом примере мы добавили три события Wi-Fi: когда ESP32 подключается, когда получает IP-адрес и когда отключается: ARDUINO_EVENT_WIFI_STA_CONNECTED, ARDUINO_EVENT_WIFI_STA_GOT_IP и ARDUINO_EVENT_WIFI_STA_DISCONNECTED соответственно.
Когда станция ESP32 подключается к точке доступа (событие ARDUINO_EVENT_WIFI_STA_CONNECTED), вызывается функция WiFiStationConnected():
WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED);
Функция WiFiStationConnected() просто выводит сообщение о том, что ESP32 успешно подключился к точке доступа (например, вашему роутеру). Однако вы можете изменить функцию для выполнения любой другой задачи (например, зажечь светодиод для индикации успешного подключения к сети).
void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("Connected to AP successfully!");
}
Когда ESP32 получает свой IP-адрес, выполняется функция WiFiGotIP().
WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);
Эта функция просто выводит IP-адрес в монитор последовательного порта.
void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
Когда ESP32 теряет соединение с точкой доступа (ARDUINO_EVENT_WIFI_STA_DISCONNECTED), вызывается функция WiFiStationDisconnected().
WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
Эта функция выводит сообщение о потере соединения и пытается переподключиться:
void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("Disconnected from WiFi access point");
Serial.print("WiFi lost connection. Reason: ");
Serial.println(info.disconnected.reason);
Serial.println("Trying to Reconnect");
WiFi.begin(ssid, password);
}
Заключение
Это краткое руководство показывает различные способы переподключения ESP32 к сети Wi-Fi после потери соединения.
Мы рекомендуем вам ознакомиться со следующим руководством, чтобы лучше понять некоторые из наиболее часто используемых функций Wi-Fi для ESP32:
—
Источник: :doc:`[SOLVED] Reconnect ESP32 to Wi-Fi Network After Lost Connection <../solved-reconnect-esp32-to-wifi/index>` (Random Nerd Tutorials)