ESP8266WiFiSTAClass 、ESP8266WiFiScanClass 、ESP8266WiFiAPClass 可以访问 ESP8266WiFiGenericClass的private和protected成员
整体上来说,方法可以分为两类:
- 第一类方法,管理WIFi事件(WiFiEvent);
- 第二类方法,与WiFi模式相关;
管理WIFi事件(WiFiEvent)
首先我们需要了解一下有哪些WiFi事件,请打开源码中的 ESP8266WiFiType.h 文件,里面有关于WiFi事件的定义:
typedef enum WiFiEvent { WIFI_EVENT_STAMODE_CONNECTED = 0, //STA模式下连接上网络 WIFI_EVENT_STAMODE_DISCONNECTED,//STA模式下断开网络 WIFI_EVENT_STAMODE_AUTHMODE_CHANGE,//STA模式下校验模式改变 WIFI_EVENT_STAMODE_GOT_IP,//STA模式下模块获取到IP地址 WIFI_EVENT_STAMODE_DHCP_TIMEOUT,//STA模式下DHCP分配IP超时 WIFI_EVENT_SOFTAPMODE_STACONNECTED,//AP模式下有station连接进来 WIFI_EVENT_SOFTAPMODE_STADISCONNECTED,//AP模式下有station断开连接 WIFI_EVENT_SOFTAPMODE_PROBEREQRECVED,//AP模式下收到探针请求 WIFI_EVENT_MAX, WIFI_EVENT_ANY = WIFI_EVENT_MAX, WIFI_EVENT_MODE_CHANGE //源码中已经去掉 } WiFiEvent_t;
WiFiEventHandler onStationModeConnected(ConnectedHandler); station连接上网络时
ConnectedHandler 是回调函数名称
WiFiEventStationModeConnected 事件信息:
// WiFiEventStationModeConnected事件信息
struct WiFiEventStationModeConnected
{
String ssid;// station的ssid,理解为名字
uint8 bssid[6];//station的mac地址
uint8 channel;//station连到的信道
};
WiFiEventHandler onStationModeDisconnected(DisconnectedHandler); station断开连接时
DisconnectedHandler 是回调函数名称
WiFiEventStationModeDisconnected 事件信息:
// WiFiEventStationModeDisconnected 事件信息
struct WiFiEventStationModeDisconnected
{
String ssid;// station的ssid,理解为名字
uint8 bssid[6];//station的mac地址
WiFiDisconnectReason reason;//断开连接原因
};
//断开连接原因
enum WiFiDisconnectReason
{
WIFI_DISCONNECT_REASON_UNSPECIFIED = 1,
WIFI_DISCONNECT_REASON_AUTH_EXPIRE = 2,
WIFI_DISCONNECT_REASON_AUTH_LEAVE = 3,
WIFI_DISCONNECT_REASON_ASSOC_EXPIRE = 4,
WIFI_DISCONNECT_REASON_ASSOC_TOOMANY = 5,
WIFI_DISCONNECT_REASON_NOT_AUTHED = 6,
WIFI_DISCONNECT_REASON_NOT_ASSOCED = 7,
WIFI_DISCONNECT_REASON_ASSOC_LEAVE = 8,
WIFI_DISCONNECT_REASON_ASSOC_NOT_AUTHED = 9,
WIFI_DISCONNECT_REASON_DISASSOC_PWRCAP_BAD = 10, /* 11h */
WIFI_DISCONNECT_REASON_DISASSOC_SUPCHAN_BAD = 11, /* 11h */
WIFI_DISCONNECT_REASON_IE_INVALID = 13, /* 11i */
WIFI_DISCONNECT_REASON_MIC_FAILURE = 14, /* 11i */
WIFI_DISCONNECT_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, /* 11i */
WIFI_DISCONNECT_REASON_GROUP_KEY_UPDATE_TIMEOUT = 16, /* 11i */
WIFI_DISCONNECT_REASON_IE_IN_4WAY_DIFFERS = 17, /* 11i */
WIFI_DISCONNECT_REASON_GROUP_CIPHER_INVALID = 18, /* 11i */
WIFI_DISCONNECT_REASON_PAIRWISE_CIPHER_INVALID = 19, /* 11i */
WIFI_DISCONNECT_REASON_AKMP_INVALID = 20, /* 11i */
WIFI_DISCONNECT_REASON_UNSUPP_RSN_IE_VERSION = 21, /* 11i */
WIFI_DISCONNECT_REASON_INVALID_RSN_IE_CAP = 22, /* 11i */
WIFI_DISCONNECT_REASON_802_1X_AUTH_FAILED = 23, /* 11i */
WIFI_DISCONNECT_REASON_CIPHER_SUITE_REJECTED = 24, /* 11i */
WIFI_DISCONNECT_REASON_BEACON_TIMEOUT = 200,
WIFI_DISCONNECT_REASON_NO_AP_FOUND = 201,
WIFI_DISCONNECT_REASON_AUTH_FAIL = 202,
WIFI_DISCONNECT_REASON_ASSOC_FAIL = 203,
WIFI_DISCONNECT_REASON_HANDSHAKE_TIMEOUT = 204,
};
WiFiEventHandler onStationModeAuthModeChanged(std::function<void(const WiFiEventStationModeAuthModeChanged&)>); STA模式下校验模式改变
WiFiEventStationModeAuthModeChanged 事件信息:
// WiFiEventStationModeAuthModeChanged 事件信息
struct WiFiEventStationModeAuthModeChanged
{
uint8 oldMode;
uint8 newMode;
};
验证模式:
typedef enum _auth_mode {
AUTH_OPEN = 0,
AUTH_WEP,
AUTH_WPA_PSK,
AUTH_WPA2_PSK,
AUTH_WPA_WPA2_PSK,
AUTH_MAX
} AUTH_MODE;
WiFiEventHandler onStationModeGotIP(std::function<void(const WiFiEventStationModeGotIP&)>); STA模式下模块获取到IP地址
WiFiEventStationModeGotIP 事件信息:
// WiFiEventStationModeGotIP 事件信息
struct WiFiEventStationModeGotIP
{
IPAddress ip;//IP地址
IPAddress mask;//子网掩码
IPAddress gw;//网关
};
WiFiEventHandler onStationModeDHCPTimeout(std::function<void(void)>); STA模式下DHCP分配IP超时
WiFiEventHandler onSoftAPModeStationConnected(&onStationConnected); AP模式下有station连接进来
onStationConnected 回调函数名
这个事件会向回调函数传递一个WiFiEventSoftAPModeStationConnected类型参数,通过这个参数可以获得接入者的mac地址和序号
// WiFiEventSoftAPModeStationConnected 参数信息
struct WiFiEventSoftAPModeStationConnected
{
uint8 mac[6];//station mac地址
uint8 aid;// station的序号
};
WiFiEventHandler onSoftAPModeStationDisconnected(&onStationDisconnected); AP模式下有station断开连接时
onStationDisconnected 是回调函数名称
这个事件会向回调函数传递一个WiFiEventSoftAPModeStationDisconnected类型的参数,通过这个参数可以获得离开者的mac地址和序号
// WiFiEventSoftAPModeStationDisconnected 事件信息
struct WiFiEventSoftAPModeStationDisconnected
{
uint8 mac[6];//station mac地址
uint8 aid;// station 名字
};
WiFiEventHandler onSoftAPModeProbeRequestReceived(&onProbeRequestPrint); AP模式下收到探针请求
onStationDisconnected 是回调函数名称
这个事件会向回调函数传递一个WiFiEventSoftAPModeProbeRequestReceived类型的参数,通过这个参数可以获得请求者的mac地址和信号强度
struct WiFiEventSoftAPModeProbeRequestReceived
{
int rssi;//信号强度
uint8 mac[6];//mac地址
};
与WiFi配置模式相关
void persistent(bool persistent); 是否保存wifi设置到flash中
//默认为true
该方法设置是否将WiFi参数保存于Flash中,默认为true,即在每次调用 WiFi.begin()、WiFi.softAP()、WiFi.disconnect、WiFi.softAPdisconnect 方法时都会将相关数据写入到Flash中
如果使用该方法设置为false时,以上动作将不会把数据写入Flash中,仅仅改变内存中的WiFi设置
bool mode(WiFiMode_t); 设置wifi工作模式
WiFi工作模式:
typedef enum WiFiMode
{
WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3
} WiFiMode_t;
WiFiMode_t getMode(); 获取当前wifi工作模式
bool enableSTA(bool enable); 设置为STA模式
返回值:bool 是否设置成功
注意点:底层代码其实是调用mode()方法;
bool enableAP(bool enable); 设置为AP模式
返回值:bool 是否设置成功
bool setSleepMode(WiFiSleepType_t type); 设置睡眠模式
返回值:bool 是否设置成功
WiFiSleepType_t 睡眠模式:
typedef enum WiFiSleepType
{
WIFI_NONE_SLEEP = 0,//非睡眠模式
WIFI_LIGHT_SLEEP = 1,//轻度睡眠
WIFI_MODEM_SLEEP = 2//深度睡眠
} WiFiSleepType_t;
实例:-------AP模式事件
#include <ESP8266WiFi.h> #define AP_ssid "AP_明哥" #define password "lm654321" WiFiEventHandler stationConnectedHandler; //实例化WIFI事件对象 WiFiEventHandler stationDisconnectedHandler; WiFiEventHandler probeRequestPrintHandler; WiFiEventHandler probeRequestBlinkHandler; void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); WiFi.persistent(false); // 不保存任何wifi配置到flash WiFi.mode(WIFI_AP); bool result=WiFi.softAP(AP_ssid, password); if(result){ Serial.println("账号密码设置成功"); } stationConnectedHandler = WiFi.onSoftAPModeStationConnected(&onStationConnected); //AP模式下有station连接进来 //onStationConnected 回调函数名 //这个事件会向回调函数传递一个WiFiEventSoftAPModeStationConnected类型参数,通过这个参数可以获得接入者的mac地址和序号 stationDisconnectedHandler = WiFi.onSoftAPModeStationDisconnected(&onStationDisconnected);//AP模式下有station断开时 //onStationDisconnected 回调函数名称 //这个事件会向回调函数传递一个WiFiEventSoftAPModeStationDisconnected类型的参数,通过这个参数可以获得离开者的mac地址和序号 probeRequestPrintHandler = WiFi.onSoftAPModeProbeRequestReceived(&onProbeRequestPrint); //AP模式下收到探针请求时 //onProbeRequestPrint 回调函数 //这个事件会向回调函数传递一个WiFiEventSoftAPModeProbeRequestReceived类型的参数,通过这个参数可以获得请求者的mac地址和信号强度 } void loop() { } void onProbeRequestPrint(const WiFiEventSoftAPModeProbeRequestReceived& evt) { //AP模式下收到探针请求时的回调函数 Serial.print("请求者的mac地址: "); Serial.print(macToString(evt.mac)); Serial.print(" 请求者的信号强度: "); Serial.println(evt.rssi); } void onStationDisconnected(const WiFiEventSoftAPModeStationDisconnected& evt) { //AP模式下有station断开时的回调函数 Serial.print("Station离开者: "); Serial.println(macToString(evt.mac)); } void onStationConnected(const WiFiEventSoftAPModeStationConnected& evt) { //AP模式下有station连接进来时的回调函数 Serial.print("Station接入者的mac地址: "); Serial.println(macToString(evt.mac));//调用mac转换成字符串的自定义函数 Serial.print("Station接入者的序号: "); Serial.println(evt.aid); } 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); }
实例:----STA模式事件
#include <ESP8266WiFi.h> const char *ssid = "jia"; //热点账号 const char *password = "lm654321"; //热点密码 WiFiEventHandler STAConnected; //实例化WIFI事件句柄 WiFiEventHandler STADisconnected; WiFiEventHandler STAGotIP; void ConnectedHandler(const WiFiEventStationModeConnected &event) //station连接上网络时的回调函数 { Serial.println("模块连接到网络"); Serial.print("现在的网络状态是: "); Serial.println(WiFi.status()); } void DisconnectedHandler(const WiFiEventStationModeDisconnected &event) //station断开连接时的回调函数 { Serial.println("模块从网络断开"); Serial.print("现在的网络状态是: "); Serial.println(WiFi.status()); } void StationModeGotIP(const WiFiEventStationModeGotIP &event){ //STA模式下模块获取到IP地址的回调函数 Serial.println("模块获得IP"); Serial.print("现在的网络状态是: "); Serial.println(WiFi.status()); } void setup() { Serial.begin(115200); Serial.println(); STAConnected = WiFi.onStationModeConnected(ConnectedHandler); //station连接上网络时 //ConnectedHandler 回调函数名称 STADisconnected = WiFi.onStationModeDisconnected(DisconnectedHandler); // station断开连接时 //DisconnectedHandler 是回调函数名称 STAGotIP = WiFi.onStationModeGotIP(StationModeGotIP); //STA模式下模块获取到IP地址 WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED){ delay(500); Serial.print("."); } Serial.println("网络连接成功"); Serial.print("现在的网络状态是: "); Serial.println(WiFi.status()); } void loop() { }
天子骄龙