ESP32-Arduino-开发实例-WiFi事件处理

WiFi事件处理

NodeMCU-32S 最强的ESP32 开发板非盗版或副厂的CH340 WiFi 蓝牙ESP-32 可用Arduino IDE

ESP32-S 是一款通用型WiFi-BT-BLE MCU模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和MP3解码等。

此款模组的核心是ESP32芯片,具有可扩展、自适应的特点。两个CPU核可以被单独控制或上电。时钟频率的调节范围为80 MHz到240 MHz。用户可以切断CPU的电源,利用低功耗协处理器来不断地监测外设的状态变化或某些模拟量是否超出阈值。ESP32还集成了丰富的外设,包括电容式触摸传感器、霍尔传感器、低噪声传感放大器,SD卡介面、以太网接口、高速SDIO/SPI、UART、I2S 和I2C 等。下面将详细讲解使用Arduino IDE开发ESP32的环境搭建。

通过前面的实例:

在处理WiFi网络扫描、连接时,使用是的主动轮询方式,这种方式在数据处理密集里,显得效率低下了。下面将介绍ESP32的WiFi事件处理方式。

ESP32可以处理以下所有Wi-Fi事件:

标识 描述
0 SYSTEM_EVENT_WIFI_READY ESP32Wi-Fi准备就绪
1 SYSTEM_EVENT_SCAN_DONE ESP32完成对AP的扫描
2 SYSTEM_EVENT_STA_START ESP32在Station模式下完成启动
3 SYSTEM_EVENT_STA_STOP ESP32在Station模式下停止
4 SYSTEM_EVENT_STA_CONNECTED ESP32在Station模式下连接到AP
5 SYSTEM_EVENT_STA_DISCONNECTED ESP32在Station模式下与AP断开连接
6 SYSTEM_EVENT_STA_AUTHMODE_CHANGE ESP32在Station模式下连接的AP的auth模式已更改
7 SYSTEM_EVENT_STA_GOT_IP ESP32在Station模式下从连接的AP获得IP
8 SYSTEM_EVENT_STA_LOST_IP ESP32在Station模式下丢失IP并将IP重置为0
9 SYSTEM_EVENT_STA_WPS_ER_SUCCESS ESP32在Station模式下wps注册模式成功
10 SYSTEM_EVENT_STA_WPS_ER_FAILED ESP32在Station模式下wps注册模式失败
11 SYSTEM_EVENT_STA_WPS_ER_TIMEOUT ESP32在Station模式下wps注册模式超时
12 SYSTEM_EVENT_STA_WPS_ER_PIN ESP32在Station模式下WPS密码在注册模式下
13 SYSTEM_EVENT_AP_START ESP32 soft-AP 启动
14 SYSTEM_EVENT_AP_STOP ESP32 soft-AP 停止
15 SYSTEM_EVENT_AP_STACONNECTED 连接到ESP32 soft-AP的站点
16 SYSTEM_EVENT_AP_STADISCONNECTED 站与ESP32 soft-AP断开连接
17 SYSTEM_EVENT_AP_STAIPASSIGNED ESP32 soft-AP为连接的站分配IP
18 SYSTEM_EVENT_AP_PROBEREQRECVED 在soft-AP接口中接收探测请求数据包
19 SYSTEM_EVENT_GOT_IP6 首选ESP32站或ap或以太网接口v6IP地址
20 SYSTEM_EVENT_ETH_START ESP32以太网启动
21 SYSTEM_EVENT_ETH_STOP ESP32以太网停止
22 SYSTEM_EVENT_ETH_CONNECTED ESP32以太网物理链接
23 SYSTEM_EVENT_ETH_DISCONNECTED ESP32以太网物理链接断开
24 SYSTEM_EVENT_ETH_GOT_IP ESP32从以太网从连接的AP获得IP
25 SYSTEM_EVENT_MAX

完整的演示代码如下:

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
* WiFi Events
0 SYSTEM_EVENT_WIFI_READY < ESP32 WiFi ready
1 SYSTEM_EVENT_SCAN_DONE < ESP32 finish scanning AP
2 SYSTEM_EVENT_STA_START < ESP32 station start
3 SYSTEM_EVENT_STA_STOP < ESP32 station stop
4 SYSTEM_EVENT_STA_CONNECTED < ESP32 station connected to AP
5 SYSTEM_EVENT_STA_DISCONNECTED < ESP32 station disconnected from AP
6 SYSTEM_EVENT_STA_AUTHMODE_CHANGE < the auth mode of AP connected by ESP32 station changed
7 SYSTEM_EVENT_STA_GOT_IP < ESP32 station got IP from connected AP
8 SYSTEM_EVENT_STA_LOST_IP < ESP32 station lost IP and the IP is reset to 0
9 SYSTEM_EVENT_STA_WPS_ER_SUCCESS < ESP32 station wps succeeds in enrollee mode
10 SYSTEM_EVENT_STA_WPS_ER_FAILED < ESP32 station wps fails in enrollee mode
11 SYSTEM_EVENT_STA_WPS_ER_TIMEOUT < ESP32 station wps timeout in enrollee mode
12 SYSTEM_EVENT_STA_WPS_ER_PIN < ESP32 station wps pin code in enrollee mode
13 SYSTEM_EVENT_AP_START < ESP32 soft-AP start
14 SYSTEM_EVENT_AP_STOP < ESP32 soft-AP stop
15 SYSTEM_EVENT_AP_STACONNECTED < a station connected to ESP32 soft-AP
16 SYSTEM_EVENT_AP_STADISCONNECTED < a station disconnected from ESP32 soft-AP
17 SYSTEM_EVENT_AP_STAIPASSIGNED < ESP32 soft-AP assign an IP to a connected station
18 SYSTEM_EVENT_AP_PROBEREQRECVED < Receive probe request packet in soft-AP interface
19 SYSTEM_EVENT_GOT_IP6 < ESP32 station or ap or ethernet interface v6IP addr is preferred
20 SYSTEM_EVENT_ETH_START < ESP32 ethernet start
21 SYSTEM_EVENT_ETH_STOP < ESP32 ethernet stop
22 SYSTEM_EVENT_ETH_CONNECTED < ESP32 ethernet phy link up
23 SYSTEM_EVENT_ETH_DISCONNECTED < ESP32 ethernet phy link down
24 SYSTEM_EVENT_ETH_GOT_IP < ESP32 ethernet got IP from connected AP
25 SYSTEM_EVENT_MAX
*/

#include <WiFi.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* pwd= "REPLACE_WITH_YOUR_PASSWORD";

void WiFiEvent(WiFiEvent_t event) {
Serial.printf("[WiFi-event] event: %d\n", event);

switch (event) {
case SYSTEM_EVENT_WIFI_READY:
Serial.println("WiFi interface ready");
break;
case SYSTEM_EVENT_SCAN_DONE:
Serial.println("Completed scan for access points");
break;
case SYSTEM_EVENT_STA_START:
Serial.println("WiFi client started");
break;
case SYSTEM_EVENT_STA_STOP:
Serial.println("WiFi clients stopped");
break;
case SYSTEM_EVENT_STA_CONNECTED:
Serial.println("Connected to access point");
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("Disconnected from WiFi access point");
WiFi.begin(ssid, pwd);
break;
case SYSTEM_EVENT_STA_AUTHMODE_CHANGE:
Serial.println("Authentication mode of access point has changed");
break;
case SYSTEM_EVENT_STA_GOT_IP:
Serial.print("Obtained IP address: ");
Serial.println(WiFi.localIP());
break;
case SYSTEM_EVENT_STA_LOST_IP:
Serial.println("Lost IP address and IP address is reset to 0");
break;
case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:
Serial.println("WiFi Protected Setup (WPS): succeeded in enrollee mode");
break;
case SYSTEM_EVENT_STA_WPS_ER_FAILED:
Serial.println("WiFi Protected Setup (WPS): failed in enrollee mode");
break;
case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:
Serial.println("WiFi Protected Setup (WPS): timeout in enrollee mode");
break;
case SYSTEM_EVENT_STA_WPS_ER_PIN:
Serial.println("WiFi Protected Setup (WPS): pin code in enrollee mode");
break;
case SYSTEM_EVENT_AP_START:
Serial.println("WiFi access point started");
break;
case SYSTEM_EVENT_AP_STOP:
Serial.println("WiFi access point stopped");
break;
case SYSTEM_EVENT_AP_STACONNECTED:
Serial.println("Client connected");
break;
case SYSTEM_EVENT_AP_STADISCONNECTED:
Serial.println("Client disconnected");
break;
case SYSTEM_EVENT_AP_STAIPASSIGNED:
Serial.println("Assigned IP address to client");
break;
case SYSTEM_EVENT_AP_PROBEREQRECVED:
Serial.println("Received probe request");
break;
case SYSTEM_EVENT_GOT_IP6:
Serial.println("IPv6 is preferred");
break;
case SYSTEM_EVENT_ETH_START:
Serial.println("Ethernet started");
break;
case SYSTEM_EVENT_ETH_STOP:
Serial.println("Ethernet stopped");
break;
case SYSTEM_EVENT_ETH_CONNECTED:
Serial.println("Ethernet connected");
break;
case SYSTEM_EVENT_ETH_DISCONNECTED:
Serial.println("Ethernet disconnected");
break;
case SYSTEM_EVENT_ETH_GOT_IP:
Serial.println("Obtained IP address");
break;
default: break;
}}

void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info) {
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));
}

void setup() {
Serial.begin(115200);

// delete old config
WiFi.disconnect(true);

delay(1000);

// Examples of different ways to register wifi events
WiFi.onEvent(WiFiEvent);
WiFi.onEvent(WiFiGotIP, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);
WiFiEventId_t eventID = WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info){
Serial.print("WiFi lost connection. Reason: ");
Serial.println(info.disconnected.reason);
}, WiFiEvent_t::SYSTEM_EVENT_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事件,无需经常检查Wi-Fi状态。 当某个事件发生时,它会自动调用相应的处理函数。

比如,经常对WiFi的连接、断开、获取IP这三种事件是经常使用的,下面代码如下:

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
49
50
51
#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.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, SYSTEM_EVENT_STA_CONNECTED);
WiFi.onEvent(WiFiGotIP, SYSTEM_EVENT_STA_GOT_IP);
WiFi.onEvent(WiFiStationDisconnected, SYSTEM_EVENT_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地址时连接和断开连接时:SYSTEM_EVENT_STA_CONNECTED,SYSTEM_EVENT_STA_GOT_IP和SYSTEM_EVENT_STA_DISCONNECTED。

ESP32站连接到接入点时(SYSTEM_EVENT_STA_CONNECTED事件),将调用WiFiStationConnected()函数:

1
2
WiFi.onEvent(WiFiStationConnected, SYSTEM_EVENT_STA_CONNECTED);

**WiFiStationConnected()**函数仅简单地打印ESP32成功连接到接入点(例如,路由器)的信息。 但是,可以修改该功能以执行任何其他任务(例如点亮LED指示灯以表明它已成功连接到网络)。

1
2
3
4
void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("Connected to AP successfully!");
}

ESP32获取IP地址后,WiFiGotIP()函数运行。

1
2
WiFi.onEvent(WiFiGotIP, SYSTEM_EVENT_STA_GOT_IP);

当ESP32断开与接入点(SYSTEM_EVENT_STA_DISCONNECTED)的连接时,将调用WiFiStationDisconnected()函数。

1
2
WiFi.onEvent(WiFiStationDisconnected, SYSTEM_EVENT_STA_DISCONNECTED);

该函数显示一条消息,指示连接已断开,并尝试重新连接:

1
2
3
4
5
6
7
8
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);
}

文章来源: https://iotsmart.blog.csdn.net/article/details/114239492