前言:
在看代码前,你所需要了解的几个函数:
WiFi.onEvent()
官方文档里,该函数的描述
/**
* set callback function
* @param cbEvent WiFiEventCb
* @param event optional filter (WIFI_EVENT_MAX is all events)
*/
功能:设置回调函数
有两个参数:cbEvent(WiFiEventCb)//这个参数我没懂
event(可选过滤器,值为WIFI_EVENT_MAX 表示所有events)
wifi_event_id_t WiFiGenericClass::onEvent(WiFiProvEventCb cbEvent, system_event_id_t event)
{
if(!cbEvent){
return 0;
}
WiFiEventCbList_t newEventHandler;
newEventHandler.cb = NULL;
newEventHandler.fcb = NULL;
newEventHandler.scb = NULL;
newEventHandler.provcb = cbEvent;
newEventHandler.event = event;
cbEventList.push_back(newEventHandler);
return newEventHandler.id;
}
WiFi.removeEvent
/**
* removes a callback form event handler
* @param cbEvent WiFiEventCb
* @param event optional filter (WIFI_EVENT_MAX is all events)
*/
功能:根据事件句柄来溢出一个回调函数
有两个参数:cbEvent
event
void WiFiGenericClass::removeEvent(WiFiEventCb cbEvent, system_event_id_t event)
{
if(!cbEvent) {
return;
}
for(uint32_t i = 0; i < cbEventList.size(); i++) {
WiFiEventCbList_t entry = cbEventList[i];
if(entry.cb == cbEvent && entry.event == event) {
cbEventList.erase(cbEventList.begin() + i);
}
}
}
不知道什么是回调函数的,建议翻我前面的博客
代码
/*
* 该例程演示了WiFi event 的用法
*
*/
/*
* WiFi Events
0 SYSTEM_EVENT_WIFI_READY < ESP32 WiFi 就绪
1 SYSTEM_EVENT_SCAN_DONE < ESP32 完成扫描AP
2 SYSTEM_EVENT_STA_START < ESP32 站点模式启动
3 SYSTEM_EVENT_STA_STOP < ESP32 站点模式停止
4 SYSTEM_EVENT_STA_CONNECTED < ESP32 已连接至AP
5 SYSTEM_EVENT_STA_DISCONNECTED < ESP32 已断连 AP
6 SYSTEM_EVENT_STA_AUTHMODE_CHANGE < the auth mode of AP connected by ESP32 station changed
7 SYSTEM_EVENT_STA_GOT_IP < ESP32 从已连接的AP处分配到了ip
8 SYSTEM_EVENT_STA_LOST_IP < ESP32 失去IP 和 IP被重置为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 启动
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 station or ap or ethernet interface v6IP addr is preferred
20 SYSTEM_EVENT_ETH_START < ESP32 以太网启动
21 SYSTEM_EVENT_ETH_STOP < ESP32 以太网停止
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 = "wifi名称";
const char* 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");
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);
// 删除旧配置
WiFi.disconnect(true);
delay(1000);
// Examples of different ways to register wifi events 不同的方式以示例注册wifi events
WiFi.onEvent(WiFiEvent); //参数为上述函数名,设置WiFiEvent为回调函数
WiFi.onEvent(WiFiGotIP, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);//设置WiFiGotIP为回调函数,仅当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);
// 删除 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);
}
运行结果:
后言
个人c++一知半解,以至例程有部分代码没看懂,望大佬指教,主要是标红地段:
2020.9.18
上述代码已经弄懂了,
在onEvent()这个事件回调函数设置函数中,他的第一个参数(回调函数名)被替换为了一个匿名函数
有关匿名函数请参考:C++匿名函数
逗号即第一个参数与第二个参数的分隔符,因为结构较为复杂,当时我没看出来。
第二个参数则是正常的事件过滤器,指定为当esp32断连当前wifi时才会触发。
以上