从零开始的ESP8266探索(15)-WiFi其他方法和WiFi事件响应

目的

WiFi在使用过程中并非会一直如希望般稳定运行的,为了应对这些情况就需要能够了解WiFi状态,并对WiFi突发事件作出响应。

WiFi其他方法

  • WiFi.status()
    返回STA模式下WiFi状态,返回值如下:
    0 : WL_IDLE_STATUS 正在WiFi工作模式间切换;
    1 : WL_NO_SSID_AVAILin 无法访问设置的SSID网络;
    3 : WL_CONNECTED 连接成功;
    4 : WL_CONNECT_FAILED 密码不正确;
    6 : WL_DISCONNECTED if module is not configured in station mode(实际测试下来有点看不懂);
  • WiFi.persistent(bool persistent)
    该方法设置是否将WiFi参数保存于Flash中,默认为true,即在每次调用WiFi.begin()WiFi.softAP()WiFi.disconnectWiFi.softAPdisconnect方法时都会将相关数据写入到Flash中;
    如果使用该方法设置为false时,以上动作将不会把数据写入Flash中,仅仅改变内存中的WiFi设置;
  • WiFi.mode(m)
    设置WiFi工作模式,参数可填写WIFI_APWIFI_STAWIFI_AP_STAWIFI_OFF
  • WiFi.getMode()
    返回当前WiFi工作模式;
  • bool setSleepMode (WiFiSleepType_t type, int listenInterval=0)
    设置WiFi节电模式,该方法在esp8266-arduino core v2.5.0中有改动,详细可以参考下文链接;

WiFi事件响应

如目的所述WiFi在使用过程中并不是一直稳定的,在出现变化时会触发WiFi事件,我们就可以针对不同情况作出处理。不同的WiFi变化有不同的事件(WiFiEventHandler),所有事件都需要在注册后使用。

事件列表

onStationModeConnected (std::function< void(const WiFiEventStationModeConnected &)>)
onStationModeDisconnected (std::function< void(const WiFiEventStationModeDisconnected &)>)
onStationModeAuthModeChanged (std::function< void(const WiFiEventStationModeAuthModeChanged &)>)
onStationModeGotIP (std::function< void(const WiFiEventStationModeGotIP &)>)
onStationModeDHCPTimeout (std::function< void(void)>)
onSoftAPModeStationConnected (std::function< void(const WiFiEventSoftAPModeStationConnected &)>)
onSoftAPModeStationDisconnected (std::function< void(const WiFiEventSoftAPModeStationDisconnected &)>)

注册事件

使用WiFiEventHandler需要先声明,然后注册对应事件并加入事件触发时执行的操作:

//声明事件
WiFiEventHandler myEvent;

//事件触发时执行的操作
void myHandler(const WiFiEventStationModeConnected& event)
{
	//TODO
}

//注册事件
myEvent = WiFi.onStationModeConnected(myHandler);

使用示例

使用下面代码上传至模块中:

#include <ESP8266WiFi.h>

const char *ssid = "********";
const char *password = "********";

WiFiEventHandler STAConnected;
WiFiEventHandler STADisconnected;
WiFiEventHandler STAGotIP;

void ConnectedHandler(const WiFiEventStationModeConnected &event)
{
    Serial.println(WiFi.status());
    Serial.println("模块连接到网络");
}

void DisconnectedHandler(const WiFiEventStationModeDisconnected &event)
{
    Serial.println(WiFi.status());
    Serial.println("模块从网络断开");
}

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

    STAConnected = WiFi.onStationModeConnected(ConnectedHandler);
    STADisconnected = WiFi.onStationModeDisconnected(DisconnectedHandler);
    STAGotIP = WiFi.onStationModeGotIP([](const WiFiEventStationModeGotIP &event) {
        Serial.println(WiFi.status());
        Serial.println("模块获得IP");
    });

    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    Serial.println(WiFi.status());
}

void loop()
{
    delay(5000); //等待5秒
    WiFi.disconnect(); //断开当前网络连接
}

代码运行后可以看到下面效果:
在这里插入图片描述

总结

上面介绍的内容可以用来增加开发者对于设备的掌控,这对于开发稳定的产品是比较有帮助的。
参考链接:
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html#diagnostics
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/generic-examples.html
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/generic-class.html
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值