ESP8266WiFiSTAClass 、ESP8266WiFiScanClass 、ESP8266WiFiAPClass 可以访问 ESP8266WiFiGenericClass的private和protected成员

整体上来说,方法可以分为两类:

  • 第一类方法,管理WIFi事件(WiFiEvent);
  • 第二类方法,与WiFi模式相关;

管理WIFi事件(WiFiEvent)

首先我们需要了解一下有哪些WiFi事件,请打开源码中的 ESP8266WiFiType.h 文件,里面有关于WiFi事件的定义:

typedef enum WiFiEvent
{
WIFI_EVENT_STAMODE_CONNECTED = , //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();
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[];
snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x",mac[], mac[], mac[], mac[], mac[], mac[]);
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();
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();
Serial.print(".");
} Serial.println("网络连接成功");
Serial.print("现在的网络状态是: ");
Serial.println(WiFi.status());
} void loop()
{ }

天子骄龙

ESP8266WiFiGeneric---通用库--事件和配置的更多相关文章

  1. ESP8266开发之旅 网络篇⑥ ESP8266WiFiGeneric——基础库

    1. 前言     在前面的博文中,博主介绍到ESP8266WiFi库是包含了很多功能的一个超级库.ESP8266WiFi库不仅仅局限于 ESP8266WiFi.h 和 ESP8266WiFi.cpp ...

  2. Google之Chromium浏览器源码学习——base公共通用库(一)

    Google的优秀C++开源项目繁多,其中的Chromium浏览器项目可以说是很具有代表性的,此外还包括其第三开发开源库或是自己的优秀开源库,可以根据需要抽取自己感兴趣的部分.在研究.学习该项目前的时 ...

  3. ios framework通用库的制作

    这篇文章是在史上最完整的iOS DIY framework 详细教程(一)的基础上加以修改 1.新建一个静态库工程: 2:取自己喜欢的名字: 3.删除向导所生成工程中的 Target: 3.删除Tes ...

  4. quagga源码分析--通用库thread

    quagga是开源路由器软件,提供的用户界面与思科,华为的路由器的人机接口几乎一致,非常有学习价值,尤其是开源的协议代码,简直亮瞎了我的小眼睛. quagga的介绍,我就不赘述了,有兴趣的可以找度娘或 ...

  5. 开源导入导出通用库Magicodes.ExporterAndImporter发布

    导入导出通用库 Magicodes.ExporterAndImporter为心莱团队封装的导入导出通用库,并且仍在跟随项目不断地打磨. GitHub地址: https://github.com/xin ...

  6. Google之Chromium浏览器源码学习——base公共通用库(三)

    本节将介绍base公共通用库中的containers,其包含堆栈.列表.集合.以及Most Recently Used cache(最近使用缓存模板). linked_list.h:一个简单的列表类型 ...

  7. Google之Chromium浏览器源码学习——base公共通用库(二)

    上次提到Chromium浏览器中base公共通用库中的内存分配器allocator,其中用到了三方库tcmalloc.jemalloc:对于这两个内存分配器,个人建议,对于内存,最好是自己维护内存池: ...

  8. 设计js通用库

    设计js通用库的四个步骤: 1.需求分析:分析库需要完成的所有功能. 2.编程接口:根据需求设计需要用到的接口及参数.返回值. 3.调用方法:支持链式调用,我们期望以动词方式描述接口. (ps:设计链 ...

  9. 【转】Xcode添加静态库以及编译选项配置常见问题

    原文网址:http://www.cnblogs.com/Quains/p/3276425.html 一,Xcode编译出现Link错误,出现"duplicate symbols for ar ...

随机推荐

  1. python 连接 hive数据库环境搭建

    首先需要安装以下Python 包:(我用的是Python 2) 在安装Python包之前需要安装一些依赖工具: Debian/Ubuntu: apt-get install python-dev li ...

  2. tensorflow keras导包混用

    tensoboard 导入:导入包注意 否者会报错 :keras FailedPreconditionError: Attempting to use uninitialized value trai ...

  3. 【机器学习】聚类算法:ISODATA算法

    在之前的K-Means算法中,有两大缺陷:       (1)K值是事先选好的固定的值       (2)随机种子选取可能对结果有影响 针对缺陷(2),我们提出了K-Means++算法,它使得随机种子 ...

  4. 【VS开发】模态对话框和非模态对话框

    MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box). 一.模态对话框(model dialog box) 在程 ...

  5. 小记---------FLUM负载均衡配置

    sink group允许组织多个sink到一个实体上,sink processors能够提供在组内所有sink之间实现负载均衡的能力,而且在失败的情况下能够进行故障转移从一个sink到另一个sink, ...

  6. 【挣扎失败】2019CSP-S 游记

    妈耶…… 今年是作为高中生参赛的第一年……然而…… 心痛 洛谷评分,一橙一蓝两紫两黑 我个菜鸡瑟瑟发抖 在考完后三天的信息课码的,刚写没几个字就要下课了 抽空把这个写完

  7. 【7.9校内test】T1挖地雷

    (土气的名字万里挑一丫丫) 然后这个题是个递推,lz的考场想法: 3个的最好确定,先把3个的确定下来,然后从这个点往前推,从这个点往后推这么算吧qwq 然后码长:也是很nice,最关键的是,我都写的这 ...

  8. 如何输出opencv编译信息

    本文链接:https://mangoroom.cn/opencv/how-to-print-compile-info-of-opencv.html opencv提供了一个函数,利用这个函数可以输出当前 ...

  9. 初识JavaScript(二)

    初识JavaScript(二) 我从上一篇<初识JavaScript(一)>知道和认识JavaScript的词法结构,也开始慢慢接触到了JavaScript的使用方法,是必须按照JavaS ...

  10. cmd内部命令和外部命令的区别

    内部命令 我们可以直接在CMD下就可以执行的命令,例如:telnet.ftp.dir.cd.等等,你可以在CMD下输入help进行查看 外部命令 就是cmd下不能直接运行的命令,(例如大家常用的nc) ...