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