08.ESP8266STA库的使用


 Station模式又叫做站点工作模式,类似于无线终端。

而处于Station模式下的ESP8266,可以使用DHCP Client的方式,由上级路由分配的ip,或者设置成静态ip。
    如果是采用DHCP分配的方式,获取的ip是动态的,在一些需要知道设备ip才能通信的场合下,就需要通过其他手段来获取ip(一种思路是通过访问webserver去获取模块信息);
    如果是采用设置静态ip的方式,那么就有一个要求前提,要求连接AP设置的网段和静态的要一致,在不能固定AP网段的情况下,这种方式不可取。
    Station模式下的WiFi模块,有几个特点,以便用来管理WiFi连接:

  1. 当最近使用的可接入点连接断开,但后面重新可用,那么ESP8266会自动去重新连接它(名词解析,最近使用的可接入点,就是ESP8266 最后连接的WiFi热点);
  2. 第一点说到的情况,对于ESP8266模块重新启动也一样适用;
  3. 这两点实现的原理就是:ESP8266会把最近使用的可接入点的校验信息(ssid账号和psw密码)会存到flash 存储中。使用保存在flash中的校验信息,ESP8266就可以重新连接到最近使用的可接入点,尽管你再次改变代码烧写进去,只要你不改变WiFi原来的工作模式和校验信息(说简单点就是,如果你烧写代码不擦除所有flash空间并且设置了自动连接,那么在仍然是station模式下就会自动连接wifi热点,不过在这里,博主建议大家在begin之前先调用 WiFi.disconnect(),可以避免一些奇怪的连接问题)。

SAT库有四个部分

  1. 第一部分方法,和一个接入点(Access Point,wifi热点)建立连接;
  2. 第二部分方法,管理第一部分方法建立的连接;
  3. 第三部分方法,提供一些关于这个连接的信息,包括MAC地址、IP地址等;
  4. 第四部分方法,提供一些备用方法去连接WiFi-Protected Setup(WPS)以及智能配置方法(SmartConfig);

建立连接

建立连接,ESP8266模块切换工作模式为Station模式。

/**
* 切换工作模式到STA模式,并自动连接到最近接入的wifi热点
* @param void
* @return void
* @note 调用这个方法就会切换到STA模式,并且连接到最近使用的接入点(会从flash中读取之前存储的配置信息)
*       如果没有配置信息,那么这个方法基本上没有什么用。
*/
wl_status_t begin()
 

/**

  • 切换工作模式到STA模式,并根据connect属性来判断是否连接wifi
  • @param ssid wifi热点名字
  • @param password wifi热点密码
  • @param channel wifi热点的通道号,用特定通信通信,可选参数
  • @param bssid wifi热点的mac地址,可选参数
  • @param connect boolean参数,默认等于true,当设置为false,不会去连接wifi热点,会建立module保存上面参数
  • @return wl_status_t wifi状态
  • @note 调用这个方法就会切换到STA模式。
  •   如果connect等于true,会连接到ssid的wifi热点。
    
  •   如果connect等于false,不会连接到ssid的wifi热点,会建立module保存上面参数。
    
    /
    wl_status_t begin(char
    ssid, char passphrase = NULL, int32_t channel = 0, const uint8_t bssid = NULL, bool connect = true

配置IP地址

/**
  • 禁止DHCP client,设置station 模式下的IP配置
  • @param local_ip station固定的ip地址
  • @param gateway 网关
  • @param subnet 子网掩码
  • @param dns1,dns2 可选参数定义域名服务器(dns)的ip地址,这些域名服务器
  •                 维护一个域名目录(如www.google.co.uk),并将它们翻译成ip地址  
    
  • @return boolean值,如果配置成功,返回true;
  •     如果配置没成功(模块没处于station或者station+soft AP模式),返回false;
    
    */
    bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)
    //有着固定IP配置地址的station,通常会更快连接上网络,原因是通过DHCP client获得IP配置这一步被跳过了。如果你把三个参数(local_ip, gateway and subnet)设置为0.0.0.0,那么它会重新启动DHCP,这时你需要重新连接wifi以拿到最新的IP。
  • 管理网络

    重新连接

    bool reconnect()
    /**
    * 使用案例
    */
    WiFi.reconnect();
    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(".");
    }
    

    断开连接网络

    /**
    * 断开wifi连接,设置当前配置SSID和pwd为null
    * @param wifioff 可选参数,设置为true,那么就会关闭Station模式
    * @return false or true 返回wl_status_t状态
    */
    bool disconnect(bool wifioff = false);
    

    是否连接到网络

    /**
    * 判断STA模式下是否连接上AP
    * @return 如果STA连接上AP,那么就返回true
    */
    bool isConnected();
    

    设置是否自动连接到最近接入点

    /**
    * 当电源启动后,设置ESP8266在STA模式下是否自动连接flash中存储的AP
    * @param autoConnect bool 默认是自动连接
    * @return 返回保存状态 true or false
    */
    bool setAutoConnect(bool autoConnect);
    

    判断是否设置了自动连接

    /**
    * 检测ESP8266 station模式下是否启动自动连接
    * @return 返回自动连接状态 true or false
    */
    bool getAutoConnect();
    

    设置是否自动重新连接到最近接入点

    /**
    * 设置当断开连接的时候是否自动重连
    * @param autoConnect bool
    * @return 返回保存状态 true or false
    */
    bool setAutoReconnect(bool autoReconnect);
    //注意:如果在网络已经断开了之后才去设置setAutoReconnect(true),这是无效的
    

    等待网络连接结果

    /**
    * 等待直到ESP8266连接AP返回结果
    * @return uint8_t 连接结果
    *         1.WL_CONNECTED 成功连接
    *         2.WL_NO_SSID_AVAIL  匹配SSID失败(账号错误)
    *         3.WL_CONNECT_FAILED psw错误
    *         4.WL_IDLE_STATUS 当wi-fi正在不同的状态中变化
    *         5.WL_DISCONNECTED 这个模块没有配置STA模式
    */
    uint8_t waitForConnectResult();
    

    连接信息

    获取mac地址

    /**
     * 获取ESP station下的Mac地址
     * @param mac   uint8_t数组的指针,数组长度为Mac地址的长度,这里为6
     * @return      返回uint8_t数组的指针
     */
    uint8_t * macAddress(uint8_t* mac);
    
    

    /**

    • 获取ESP station下的Mac地址
    • @return 返回String的Mac地址
      */
      String macAddress();

    应用实例

    //实例代码1 这只是部分代码 不能直接使用
    if (WiFi.status() == WL_CONNECTED)
    {
      uint8_t macAddr[6];
      WiFi.macAddress(macAddr);
      Serial.printf("Connected, mac address: %02x:%02x:%02x:%02x:%02x:%02x
    ", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
      //Connected, mac address: 5C:CF:7F:08:11:17
    }
    
    

    //实例代码2 这只是部分代码 不能直接使用
    if (WiFi.status() == WL_CONNECTED)
    {
    Serial.printf(“Connected, mac address: %s
    “, WiFi.macAddress().c_str());
    ////Connected, mac address: 5C:CF:7F:08:11:17
    }

    获取IP地址

    /**
     * 返回ESP8266 STA模式下的IP地址
     * @return IP地址
     */
    IPAddress localIP();
    

    获取子网掩码IP地址

    /**
     * 获取子网掩码的地址
     * @return 返回子网掩码的IP地址
     */
    IPAddress subnetMask();
    

    获取网关IP地址

    /**
     * 获取网关IP地址
     * @return 返回网关IP地址
     */
    IPAddress gatewayIP();
    

    获取dnsIP地址

    /**
     * 获取DNS ip地址
     * @param dns_no dns序列号
     * @return 返回DNS服务的IP地址
     */
    IPAddress dnsIP(uint8_t dns_no = 0);
    //应用实例
    /实例代码 这只是部分代码 不能直接使用
    Serial.print("DNS #1, #2 IP: ");
    WiFi.dnsIP().printTo(Serial);
    Serial.print(", ");
    WiFi.dnsIP(1).printTo(Serial);
    Serial.println();
    //DNS #1, #2 IP: 62.179.1.60, 62.179.1.61
    

    获取hostname

    /**
     * 获取ESP8266 station DHCP的主机名
     * @return 主机名
     */
    String hostname();
    

    设置hostname

    /**
     * 设置ESP8266 station DHCP的主机名
     * @param aHostname 最大长度:32
     * @return ok
     */
    bool hostname(char* aHostname);
    bool hostname(const char* aHostname);
    bool hostname(String aHostname);
    //实例代码 这只是部分代码 不能直接使用
    Serial.printf("Default hostname: %s
    ", WiFi.hostname().c_str());
    WiFi.hostname("Station_Tester_02");
    Serial.printf("New hostname: %s
    ", WiFi.hostname().c_str());
    //Default hostname: ESP_081117
    //New hostname: Station_Tester_02
    

    获取当前wifi连接转态

    /**
     * 返回wifi的连接状态
     * @return 返回wl_status_t中定义的其中一值,wl_status_t在 wl_definitions.h中定义
     */
    wl_status_t status();
    

    获取wifi网络名字

    /**
     * 返回当前通信网络的SSID
     * @return SSID
     */
    String SSID() const;
    //实例代码 这只是部分代码 不能直接使用
    Serial.printf("SSID: %s
    ", WiFi.SSID().c_str());
    //SSID: sensor-net
    

    获取wifi网络密码

    /**
     * 返回当前通信网络的SSID
     * @return SSID
     */
    String SSID() const;
    //实例代码 这只是部分代码 不能直接使用
    Serial.printf("BSSID: %s
    ", WiFi.BSSIDstr().c_str());
    //BSSID: 00:1A:70E:C1:68
    

    获取wifi信号强度

    /**
     * Return the current network RSSI.返回当前通信网络的信号强度,单位是dBm
     * @return  RSSI value
     */
    int32_t RSSI();
    

    应用实例

     statin模式下,创建一个连接到可接入点(wifi热点),并且打印station信息。

    /**
     * Demo3:
     *    statin模式下,创建一个连接到可接入点(wifi热点),并且打印station信息
     * @author 单片机菜鸟
     * @date 2019/09/02
     */
    #include <ESP8266WiFi.h>
     
    #define AP_SSID "TP-LINK_5344" //这里改成你的wifi名字
    #define AP_PSW  "6206908you11011010" //这里改成你的wifi密码
    //以下三个定义为调试定义
    #define DebugBegin(baud_rate)    Serial.begin(baud_rate)
    #define DebugPrintln(message)    Serial.println(message)
    #define DebugPrint(message)    Serial.print(message)
     
    void setup(){
      //设置串口波特率,以便打印信息
      DebugBegin(115200);
      //延时2s 为了演示效果
      delay(2000);
      DebugPrintln("Setup start");
      //启动STA模式,并连接到wifi网络
      WiFi.begin(AP_SSID, AP_PSW);
      //设置自动连接
      WiFi.setAutoConnect(true);
      //设置自动重连
      WiFi.setAutoReconnect(true);
      DebugPrint(String("Connecting to ")+AP_SSID);
      //判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程
      //笔者扩展:加入网络一直都连不上 是否可以做个判断,由你们自己实现
      while (WiFi.status() != WL_CONNECTED){
        delay(500);
        DebugPrint(".");
      }
      DebugPrintln("");
     
      DebugPrintln("rint Network Info:");
      if (WiFi.status() == WL_CONNECTED){
         //输出mac地址
         DebugPrintln(String("Connected, mac address: ")+WiFi.macAddress().c_str());
         
         //输出station IP地址,这里的IP地址由DHCP分配
         DebugPrintln(String("Connected, IP address: ")+WiFi.localIP().toString());
         
         //输出子网掩码地址
         DebugPrintln(String("Subnet mask: ")+WiFi.subnetMask().toString());
         
         //输出网关 IP地址
         DebugPrintln(String("Gataway IP: ")+WiFi.gatewayIP().toString());
         
         //输出hostname
         DebugPrintln(String("Default hostname: ")+WiFi.hostname());
         //设置新的hostname
         WiFi.hostname("Station_host_博哥");
         DebugPrintln(String("New hostname: ")+WiFi.hostname());
         
         //输出SSID
         DebugPrintln(String("SSID: ")+WiFi.SSID());
     
         //输出psk
         DebugPrintln(String("psk: ")+WiFi.psk());
         
         //输出BSSID
         DebugPrintln(String("BSSID: ")+WiFi.BSSIDstr());
         
         //输出RSSI
         DebugPrintln(String("RSSI: ") + WiFi.RSSI() + " dBm");
      }
      
      DebugPrintln("Setup End");
    }
     
    void loop() {
    }
    
    实际效果

    本笔记参考博哥博客,如果对你有帮助,别忘了给我几块硬币哦!


    文章作者: 小游
    版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
      目录