ESP8266-Arduino网络编程实例-WiFi事件处理
WiFi事件处理
ESP8266的WiFi驱动库支持自定义WiFi事件处理,本文将详细介绍如何处理WiFi处于热点(AP)模式下的的连接、断开连接等事件处理。
1、硬件准备
- ESP8266 NodeMCU开发板一块
- 数据线一条
2、软件准备
- Arduino IDE或VSCode + PlatformIO
在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:
ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:
3、代码实现
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
| #include <ESP8266WiFi.h> #include <stdio.h>
const char\* ssid = "esp8266"; const char\* password = "esp8266ef";
WiFiEventHandler stationConnectedHandler; // 连接事件 WiFiEventHandler stationDisconnectedHandler; // 连接断开事件 WiFiEventHandler probeRequestPrintHandler; // 请求打印 WiFiEventHandler probeRequestBlinkHandler; // 请求LED闪烁
bool blinkFlag;
void setup() { Serial.begin(115200);
// LED引脚配置 pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH);
// 不将WiFi配置数据保存到Flash中 WiFi.persistent(false);
// 设置为热点模式 WiFi.mode(WIFI_AP); WiFi.softAP(ssid, password);
// 注册热点模式下连接事件回调函数 stationConnectedHandler = WiFi.onSoftAPModeStationConnected(&onStationConnected); // 注册热点模式下连接断开事件回调函数 stationDisconnectedHandler = WiFi.onSoftAPModeStationDisconnected(&onStationDisconnected);
probeRequestPrintHandler = WiFi.onSoftAPModeProbeRequestReceived(&onProbeRequestPrint); probeRequestBlinkHandler = WiFi.onSoftAPModeProbeRequestReceived(&onProbeRequestBlink); }
void onStationConnected(const WiFiEventSoftAPModeStationConnected& evt) { Serial.print("Station connected: "); Serial.println(macToString(evt.mac)); }
void onStationDisconnected(const WiFiEventSoftAPModeStationDisconnected& evt) { Serial.print("Station disconnected: "); Serial.println(macToString(evt.mac)); }
void onProbeRequestPrint(const WiFiEventSoftAPModeProbeRequestReceived& evt) { Serial.print("Probe request from: "); Serial.print(macToString(evt.mac)); Serial.print(" RSSI: "); Serial.println(evt.rssi); }
void onProbeRequestBlink(const WiFiEventSoftAPModeProbeRequestReceived&) { blinkFlag = true; }
void loop() { if (millis() > 10000 && probeRequestPrintHandler) { Serial.println("Not printing probe requests any more (LED should still blink)"); probeRequestPrintHandler = WiFiEventHandler(); } if (blinkFlag) { blinkFlag = false; digitalWrite(LED_BUILTIN, LOW); delay(100); digitalWrite(LED_BUILTIN, HIGH); } delay(10); }
String macToString(const unsigned char\* mac) { char buf[20]; snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return String(buf); }
|
代码的核心逻辑如下:
首先设置WiFi的工作模式
1 2 3 4
| // 设置为热点模式 WiFi.mode(WIFI_AP); WiFi.softAP(ssid, password);
|
然后,注册事件处理函数
1 2 3 4 5 6 7 8
| // 注册热点模式下连接事件回调函数 stationConnectedHandler = WiFi.onSoftAPModeStationConnected(&onStationConnected); // 注册热点模式下连接断开事件回调函数 stationDisconnectedHandler = WiFi.onSoftAPModeStationDisconnected(&onStationDisconnected);
probeRequestPrintHandler = WiFi.onSoftAPModeProbeRequestReceived(&onProbeRequestPrint); probeRequestBlinkHandler = WiFi.onSoftAPModeProbeRequestReceived(&onProbeRequestBlink);
|
事件处理函数注册完成之后,就可以根据不同事件类型处理不同的业务逻辑了。
文章来源: https://iotsmart.blog.csdn.net/article/details/127142102
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!