• ESP8266WiFiGeneric---通用库--事件和配置


    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()
    {
        
    }

    天子骄龙

  • 相关阅读:
    Redis
    Ajax和JSON
    快速幂
    欧拉函数
    约数
    质数
    二分图相关算法模板
    最小生成树模板
    最短路算法模板
    康托展开和逆康托展开
  • 原文地址:https://www.cnblogs.com/liming19680104/p/11219585.html
Copyright © 2020-2023  润新知