美文网首页ESP8266 Arduino物联网开发之旅
ESP8266开发之旅 网络篇③ Soft-AP——ESP826

ESP8266开发之旅 网络篇③ Soft-AP——ESP826

作者: 单片机菜鸟博哥 | 来源:发表于2019-02-13 15:06 被阅读81次

    1.1 前言

        在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识。并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式:

    1. Station模式,也叫站点模式;
    2. Soft-Access Point模式,也叫Soft-AP模式,可以理解为WiFi热点模式;
    3. 以上两种的集合模式,Station 兼Soft-Access Point,也是Mesh NetWork的实现基础;

        任何基于ESP8266的WiFi功能开发,都是基于上面其中一种工作模式来进行开发。所以,它们是我们WiFi基础学习的重点。
        本篇章将讲解Soft-Ap模式。

    1.2 回顾Soft-AP模式 —— 谁想连上我

        AP是Access Point简称,也就是访问接入点,是网络的中心节点。一般家庭的无线路由器就是一个AP,众多站点(STA)加入到它所组成的无线网络,网络中的所有的通信都通过AP来转发完成。
        其实生活中,类Soft-Access Point模式还是应用非常广泛的。
        比如你去网购,你和商家就是STA,快递公司就是AP,负责把你下单的东西从商家传送到你手上。
        比如你在口碑买一个奶茶,你和奶茶店就是STA,跑腿平台就是AP,负责把你的奶茶从奶茶店送到你手上。
        老规矩,看看图结构:

    image
        软AP也叫做Soft-AP,硬件部分是一块标准的无线网卡比如ESP8266,但其通过驱动程序使其提供与AP一样的信号转换、路由等功能。
        与传统AP相比,它的成本很低,功能上也能凑合。在基本功能上,Soft AP与AP并没有太大的差别,不过因为用软件来实现AP功能,SoftAP的接入能力和覆盖范围远不如AP。
        注意点:一般能同时连接到Soft-AP 的station的个数上线到8个,但是一般默认是4个。(至于为什么是4个,待会博主告诉你)

    1.3 ESP8266WiFiAP库

        有了前面的理论基础,那么我们开始详解一下ESP8266 soft-AP模式的专用库——ESP8266WiFiAP库,大家使用的时候不需要

    #include <ESP8266WiFiAP.h>
    

        只需要引入

    #include<ESP8266WiFi.h>
    

        至于原因,敬请回顾 ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库
        首先,对于AP类库的描述,可以拆分为三个部分:

    1. 第一部分方法,建立AP网络(Access Point,wifi热点);
    2. 第二部分方法,管理第一部分方法建立的连接;
    3. 第三部分方法,获取AP的信息,包括MAC地址、IP地址等;

        讲解之前,先浏览一下博主整理的百度脑图,以便有个整体认识:


    image

    1.3.1 第一部分方法——建立AP网络

    1.3.1.1 softAP —— 启动免密码wifi网络

    函数讲解:

    /**
     * 建立一个AP热点
     * @param ssid              SSID账号 (max 63 char,最大63个字符).
     * @param passphrase        密码(对于WPA2加密类型最少8个字符,对于开放网络设置为NULL)
     * @param channel           WiFi 通道数字, 1 - 13.默认是1
     * @param ssid_hidden       WiFI是否需要隐藏 (0 = broadcast SSID, 1 = hide SSID),通过它设置别人是否能看到你的WiFi网络
     * @param max_connection    最大的同时连接数  1 - 4.当超过这个数,再多的station想连接也只能等待
     * @param bool 返回设置soft-AP的结果
     */
    bool softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0, int max_connection = 4);
    

    应用实例:

    //实例代码 这只是部分代码 不能直接使用
    //开放网络(所谓开放网络也就是,不需要密码,只需要知道AP名字就可以了)
    WiFi.softAP(ssid);
    
    1.3.1.2 softAP —— 启动校验式wifi网络

    函数说明:

    /**
     * 建立一个AP热点
     * @param ssid              SSID账号 (max 63 char,最大63个字符).
     * @param passphrase        密码(对于WPA2加密类型最少8个字符,对于开放网络设置为NULL)
     * @param channel           WiFi 通道数字, 1 - 13.默认是1
     * @param ssid_hidden       WiFI是否需要隐藏 (0 = broadcast SSID, 1 = hide SSID),通过它设置别人是否能看到你的WiFi网络
     * @param max_connection    最大的同时连接数  1 - 4.当超过这个数,再多的station想连接也只能等待
     * @param bool 返回设置soft-AP的结果
     */
    bool softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0, int max_connection = 4);
    

    应用实例:

    //开放网络(所谓开放网络也就是,不需要密码,只需要知道AP名字就可以了)
    WiFi.softAP(ssid);
    //校验式网络(需要输入账号密码),通道为1,wifi不隐藏,最大连接数=4
    WiFi.softAP(ssid, password);
    //校验式网络(需要输入账号密码),通道为2,wifi隐藏,最大连接数=4
    WiFi.softAP(ssid, password,2,1);
    

    注意点:

    • SSID账号 最大63个字符;
    • 密码,对于WPA2加密类型最少8个字符,对于开放网络设置为NULL
    • 账号密码尽量都是英文字符;
    1.3.1.3 softAPConfig —— 配置AP网络信息

    函数说明:

    /**
     * 配置AP信息
     * @param local_ip      AP ip地址
     * @param gateway       网关IP地址
     * @param subnet        子网掩码
     * @note soft-AP 建立的网络,默认的IP地址是192.168.4.1.
     */
    bool softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet);
    

    1.3.2 第二部分方法——管理网络

    1.3.2.1 softAPgetStationNum —— 获取连接到AP上的station数目

    函数说明:

    /**
     * 获取连接到当前softAP的station或者client的数目
     * @return Stations 数目
     */
    uint8_t softAPgetStationNum();
    

    应用实例:

    //实例代码 这只是部分代码 不能直接使用
    Serial.printf("Stations connected to soft-AP = %d\n", WiFi.softAPgetStationNum());
    
    1.3.2.2 softAPdisconnect —— 关闭AP模式

    函数说明:

    /**
     * 关闭AP
     * @param wifioff disable mode? true会调用 WiFi.enableAP(false);
     * @return one value of wl_status_t enum
     */
    bool softAPdisconnect(bool wifioff = false);
    

    函数源码:

    /**
     * Disconnect from the network (close AP)
     * @param wifioff disable mode?
     * @return one value of wl_status_t enum
     */
    bool ESP8266WiFiAPClass::softAPdisconnect(bool wifioff) {
        bool ret;
        struct softap_config conf;
        /**清除最近配置的账号密码*/
        *conf.ssid = 0;
        *conf.password = 0;
        conf.authmode = AUTH_OPEN;
        ETS_UART_INTR_DISABLE();
        if(WiFi._persistent) {
            ret = wifi_softap_set_config(&conf);
        } else {
            ret = wifi_softap_set_config_current(&conf);
        }
        ETS_UART_INTR_ENABLE();
    
        if(!ret) {
            DEBUG_WIFI("[APdisconnect] set_config failed!\n");
        }
    
        if(ret && wifioff) {
            //禁止AP
            ret = WiFi.enableAP(false);
        }
    
        return ret;
    }
    
    

    1.3.3 第三部分方法——获取信息

    1.3.3.1 softAPIP —— 获取AP的ip地址

    函数说明:

    /**
     * 获取softAP的ip地址
     * @return IPAddress softAP IP
     */
    IPAddress softAPIP();
    

    应用实例:

    //实例代码 这只是部分代码 不能直接使用
    Serial.print("Soft-AP IP address = ");
    Serial.println(WiFi.softAPIP());
    //Soft-AP IP address = 192.168.4.1
    
    1.3.3.2 softAPmacAddress —— 获取AP的mac地址

    函数说明:

    /**
     * 获取softAP MAC 地址.
     * @param mac   pointer to uint8_t array with length WL_MAC_ADDR_LENGTH
     * @return      pointer to uint8_t*
     */
    uint8_t* softAPmacAddress(uint8_t* mac);
    
    /**
     * 获取softAP MAC 地址.
     * @return String mac
     */
    String softAPmacAddress(void);
    

    应用实例:

    //实例代码1 这只是部分代码 不能直接使用
    uint8_t macAddr[6];
    WiFi.softAPmacAddress(macAddr);
    Serial.printf("MAC address = %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
    //MAC address = 5e:cf:7f:8b:10:13
    
    //实例代码2 这只是部分代码 不能直接使用
    Serial.printf("MAC address = %s\n", WiFi.softAPmacAddress().c_str());
    
    1.3.3.3 softAPSSID —— 获取AP的SSID

    函数说明:

    /**
     * Get the configured(Not-In-Flash) softAP SSID name.
     * @return String SSID.
     */
    String softAPSSID() const;
    
    1.3.3.4 softAPPSK —— 获取AP的PSK

    函数说明:

    /**
     * Get the configured(Not-In-Flash) softAP PSK or PASSWORD.
     * @return String psk.
     */
    String softAPPSK() const;
    

    1.4 实例操作

        上面讲了一堆方法理论的东西,下面我们开始讲解操作实例,博主尽量都在代码中注释,直接看代码就好。

    1.4.1 实例源码

    /**
     * Demo:
     *    AP模式下,演示AP 函数方法的使用
     * @author 单片机菜鸟
     * @date 2019/09/02
     */
    #include <ESP8266WiFi.h>
     
    #define AP_SSID "AP_Test_博哥" //这里改成你的AP名字
    #define AP_PSW  "12345678" //这里改成你的AP密码 8位以上
    //以下三个定义为调试定义
    #define DebugBegin(baud_rate)    Serial.begin(baud_rate)
    #define DebugPrintln(message)    Serial.println(message)
    #define DebugPrint(message)    Serial.print(message)
     
    IPAddress local_IP(192,168,4,22);
    IPAddress gateway(192,168,4,9);
    IPAddress subnet(255,255,255,0);
     
    void setup(){
      //设置串口波特率,以便打印信息
      DebugBegin(115200);
      //延时2s 为了演示效果
      delay(2000);
      DebugPrint("Setting soft-AP configuration ... ");
      //配置AP信息
      WiFi.mode(WIFI_AP);
      DebugPrintln(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
      //启动AP模式,并设置账号和密码
      DebugPrint("Setting soft-AP ... ");
      boolean result = WiFi.softAP(AP_SSID, AP_PSW);
      if(result){
        DebugPrintln("Ready");
        //输出 soft-ap ip地址
        DebugPrintln(String("Soft-AP IP address = ") + WiFi.softAPIP());
        //输出 soft-ap mac地址
        DebugPrintln(String("MAC address = ") + WiFi.softAPmacAddress().c_str());
      }else{
        DebugPrintln("Failed!");
      }
      DebugPrintln("Setup End");
    }
     
    void loop() {
      //不断打印当前的station个数
      DebugPrintln(String("Stations connected =") + WiFi.softAPgetStationNum());
      delay(3000);
    }
    

    1.4.2 实例结果

    image

    1.5 总结

        本节主要是基于ESP8266WiFiAP库来讲解AP模式下的函数使用,并且给大家提供了一个实例,至于更多例子我就不继续举例,只能说引导大家入门使用。
    STA篇和AP篇是基础,重中之重,所以请认真翻阅。

    博哥ESP8266 qq交流群:869920142

    image

    相关文章

      网友评论

        本文标题:ESP8266开发之旅 网络篇③ Soft-AP——ESP826

        本文链接:https://www.haomeiwen.com/subject/ncldeqtx.html