ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用
1. 前言
在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识。并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式:
- Station模式,也叫站点模式;
- Soft-Access Point模式,也叫Soft-AP模式,可以理解为WiFi热点模式;
- 以上两种的集合模式,Station 兼Soft-Access Point,也是Mesh NetWork的实现基础;
任何基于ESP8266的WiFi功能开发,都是基于上面其中一种工作模式来进行开发。所以,它们是我们WiFi基础学习的重点。
本篇章将讲解Soft-Ap模式。
2. 回顾Soft-AP模式 —— 谁想连上我
AP是Access Point简称,也就是访问接入点,是网络的中心节点。一般家庭的无线路由器就是一个AP,众多站点(STA)加入到它所组成的无线网络,网络中的所有的通信都通过AP来转发完成。
其实生活中,类Soft-Access Point模式还是应用非常广泛的。
比如你去网购,你和商家就是STA,快递公司就是AP,负责把你下单的东西从商家传送到你手上。
比如你在口碑买一个奶茶,你和奶茶店就是STA,跑腿平台就是AP,负责把你的奶茶从奶茶店送到你手上。
老规矩,看看图结构:

软AP也叫做Soft-AP,硬件部分是一块标准的无线网卡比如ESP8266,但其通过驱动程序使其提供与AP一样的信号转换、路由等功能。
与传统AP相比,它的成本很低,功能上也能凑合。在基本功能上,Soft AP与AP并没有太大的差别,不过因为用软件来实现AP功能,SoftAP的接入能力和覆盖范围远不如AP。
注意点:一般能同时连接到Soft-AP 的station的个数上线到8个,但是一般默认是4个。(至于为什么是4个,待会博主告诉你)
3. ESP8266WiFiAP库
有了前面的理论基础,那么我们开始详解一下ESP8266 soft-AP模式的专用库——ESP8266WiFiAP库,大家使用的时候不需要
#include <ESP8266WiFiAP.h>
只需要引入
#include<ESP8266WiFi.h>
至于原因,敬请回顾 ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库。
首先,对于AP类库的描述,可以拆分为三个部分:
- 第一部分方法,建立AP网络(Access Point,wifi热点);
- 第二部分方法,管理第一部分方法建立的连接;
- 第三部分方法,获取AP的信息,包括MAC地址、IP地址等;
讲解之前,先浏览一下博主整理的百度脑图,以便有个整体认识:

3.1 第一部分方法——建立AP网络
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);
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
- 账号密码尽量都是英文字符;
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);
3.2 第二部分方法——管理网络
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());
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;
}
3.3 第三部分方法——获取信息
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
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());
3.3.3 softAPSSID —— 获取AP的SSID
函数说明:
/**
* Get the configured(Not-In-Flash) softAP SSID name.
* @return String SSID.
*/
String softAPSSID() const;
3.3.4 softAPPSK —— 获取AP的PSK
函数说明:
/**
* Get the configured(Not-In-Flash) softAP PSK or PASSWORD.
* @return String psk.
*/
String softAPPSK() const;
4. 实例操作
上面讲了一堆方法理论的东西,下面我们开始讲解操作实例,博主尽量都在代码中注释,直接看代码就好。
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);
}
4.2 实例结果

5. 总结
本节主要是基于ESP8266WiFiAP库来讲解AP模式下的函数使用,并且给大家提供了一个实例,至于更多例子我就不继续举例,只能说引导大家入门使用。
STA篇和AP篇是基础,重中之重,所以请认真翻阅。
ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用的更多相关文章
- ESP8266开发之旅 网络篇⑤ Scan WiFi——ESP8266WiFiScan库的使用
1. 前言 现在,通常,为了让手机连上一个WiFi热点,基本上都是打开手机设置里面的WiFi设置功能,然后会看到里面有个WiFi热点列表,然后选择你要的连接上. 基本上你只要打开手机连接WiF ...
- ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑩ UDP服务
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑬ SPIFFS——ESP8266 SPIFFS文件系统
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用
1. 前言 在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识.并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式: St ...
随机推荐
- vs加调试代码的正确姿势
为了方便,我们会在系统中加入一些调试代码,比如自动登录,这样会省掉很多精力时间,但用的姿势不对, 第一重姿势:打包注释 我看一些人在vs中加调试代码(比如自动登录),然后打包的时候注释掉,这样操作是省 ...
- 【iOS 】把一些不太重要的任务放在空时执行
-(void)idleNotificationMethod { } -(void)registerForIdleNotification { [[NSNotificationCenter defaul ...
- 使用flask-mail扩展发送邮件
使用flask-mail扩展发送电子邮件 在我们开发完web系统后,一些特定的事件发生时,系统要自动发送相关邮件至管理员,运维人员和其他相关人员.python标准库中的smtplib包也可以用在Fla ...
- SpringBootSecurity学习(01)网页版登录入门介绍
Web应用安全管理 Web应用的安全管理,主要包括两个方面的内容,一个是用户身份的认证,即用户登录的设计,二是用户授权,即一个用户在一个应用系统中能够执行哪些操作的权限管理.权限管理的设计一般使用角色 ...
- 基于Docker搭建大数据集群(五)Mlsql部署
主要内容 mlsql部署 前提 zookeeper正常使用 spark正常使用 hadoop正常使用 安装包 微云下载 | tar包目录下 mlsql-cluster-2.4_2.11-1.4.0.t ...
- JS调用activeX实现浏览本地文件夹功能 wekit内核只需要<input type="file" id="files" name="files[]" webkitdirectory/>即可,IE内核比较麻烦
研究了一天,js访问本地文件本身是不可能的,只能借助于插件.植入正题,IE仅支持ActiveX插件. function openDialog() { try { var Message = " ...
- 使用 chart 部署 skywalking
使用 chart 部署 skywalking 本文主要讲述的是如何使用 Helm Charts 将 SkyWalking 部署到 Kubernetes 集群中,相关文档可以参考skywalking-k ...
- Vim升华之树形目录插件NERDTree安装图解(ubuntu)
此文经验证:为真 http://www.linuxidc.com/Linux/2013-06/86048.htm
- SSH实现无密码登录
1.生成秘钥 : ssh-keygen -t rsa # -t 指定生成秘钥方式,生成秘钥过程需要三次回车 2.将生成的公钥传给 ssh 的对端 ssh-copy-id root@192.168.3. ...
- hash长度扩展攻击
这里面就放一张百度百科的解释吧,emmm 反正我是看不懂还是做一下题来巩固一下吧 CTF中的hash长度攻击 进入网页你会发现页面显示  我这里没有看到什么可以利用的,抓了一下包也没有什么有可以利 ...