ESP8266-Arduino网络编程实例-WiFi连接丢失解决方法
WiFi连接丢失解决方法
在实际应用中,WiFi连接上的,有可能存在连接断开的情况。比如, ESP8266 暂时失去 Wi-Fi 信号; ESP8266 暂时不在路由器的 Wi-Fi 范围内; 路由器重启; 路由器失去互联网连接或其他情况。本文将详细介绍几种方法解决ESP8266的WiFi连接丢失处理方法。
1、设置WiFi自动重连
ESP8266 能够在 Wi-Fi 中断的情况下自动重新连接到您的路由器。 例如,如果 ESP8266 连接到您的路由器并且您突然将其关闭,当它重新打开时,ESP8266 可以自动重新连接。要在连接丢失后重新连接到 Wi-Fi,可以使用 WiFi.setAutoReconnect(true); 其次是 WiFi.persistent(true); 自动重新连接到之前连接的接入点:
1 2 3
| WiFi.setAutoReconnect(true); WiFi.persistent(true);
|
例如,在WiFi初始化时就可以设置:
1 2 3 4 5 6 7 8 9 10 11 12 13
| void initWiFi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, ssid_pwd); Serial.print("Connecting to WiFi .."); while (WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(1000); } Serial.println(WiFi.localIP()); WiFi.setAutoReconnect(true); WiFi.persistent(true); }
|
2、通过检测WiFi状态重连
另外一个方法可以通过定时检测WiFi的状态来判断ESP8266是否连接到WiFi。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <ESP8266WiFi.h>
// WiFi名称和密码 const char\* ssid = "\*\*\*\*"; const char\* ssid_pwd= "\*\*\*\*";
unsigned long previousMillis = 0; unsigned long interval = 30000;
void initWiFi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, ssid_pwd); 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.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) { Serial.print(millis()); Serial.println("Reconnecting to WiFi..."); WiFi.disconnect(); WiFi.begin(ssid, ssid_pwd); previousMillis = currentMillis; }
}
|
示例中调用如下函数:
1 2 3
| WiFi.disconnect(); WiFi.begin(ssid, ssid_pwd);
|
也可以调用WiFi.reconnect()函数,但是,该函数调用几次后,可能不会成功。
3、监听WiFi事件
ESP8266 能够处理不同的 Wi-Fi 事件。 通过 Wi-Fi 事件,您无需不断检查 Wi-Fi 状态。 当某个事件发生时,它会自动调用相应的处理函数。以下事件对于检测连接是否丢失或重新建立非常有用:
- onStationModeGotIP:当 ESP8266 到达连接的最后一步时:获取其网络 IP 地址;
- onStationModeDisconnected:当 ESP8266 不再连接到接入点时。
简单示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <ESP8266WiFi.h>
const char\* ssid = "\*\*\*\*"; const char\* ssid_pwd= "\*\*\*\*";
WiFiEventHandler wifiConnectHandler; WiFiEventHandler wifiDisconnectHandler;
void initWiFi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, ssid_pwd); Serial.print("Connecting to WiFi .."); while (WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(1000); } Serial.println(WiFi.localIP()); }
void onWifiConnect(const WiFiEventStationModeGotIP& event) { Serial.println("Connected to Wi-Fi sucessfully."); Serial.print("IP address: "); Serial.println(WiFi.localIP()); }
void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) { Serial.println("Disconnected from Wi-Fi, trying to connect..."); WiFi.disconnect(); WiFi.begin(ssid, ssid_pwd); }
void setup() { Serial.begin(115200);
// 注册事件回调函数 wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect); wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect); initWiFi(); Serial.print("RRSI: "); Serial.println(WiFi.RSSI()); }
void loop() { //delay(1000); }
|
在示例中,通过调用:
1 2 3
| wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect); wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
|
来对不同WiFi事件注册回调函数。然后在不同的事件回调函数中处理不同的功能逻辑。当检测到WiFi断开时,执行:
1 2 3
| WiFi.disconnect(); WiFi.begin(ssid, ssid_pwd);
|
文章来源: https://iotsmart.blog.csdn.net/article/details/127206222
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!