授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。
快速导航
单片机菜鸟的博客快速索引(快速找到你要的)
如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。
在前面的篇章中,博主给大家讲解了ESP32的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识。并且,博主重点强调 ESP32 WiFi模块有三种工作模式:
任何基于ESP32的WiFi功能开发,都是基于上面其中一种工作模式来进行开发。所以,它们是我们WiFi基础学习的重点。
本篇章将讲解Soft-Ap模式。
AP是Access Point简称,也就是访问接入点,是网络的中心节点。一般家庭的无线路由器就是一个AP,众多站点(STA)加入到它所组成的无线网络,网络中的所有的通信都通过AP来转发完成。
其实生活中,类Soft-Access Point模式还是应用非常广泛的。
比如你去网购,你和商家就是STA,快递公司就是AP,负责把你下单的东西从商家传送到你手上。
比如你在口碑买一个奶茶,你和奶茶店就是STA,跑腿平台就是AP,负责把你的奶茶从奶茶店送到你手上。
老规矩,看看图结构:
软AP也叫做Soft-AP,硬件部分是一块标准的无线网卡比如ESP32,但其通过驱动程序使其提供与AP一样的信号转换、路由等功能。
与传统AP相比,它的成本很低,功能上也能凑合。在基本功能上,Soft AP与AP并没有太大的差别,不过因为用软件来实现AP功能,SoftAP的接入能力和覆盖范围远不如AP。
注意点:一般能同时连接到Soft-AP 的station的个数上线到8个,但是一般默认是4个。(至于为什么是4个,待会博主告诉你)
有了前面的理论基础,那么我们开始详解一下ESP32 soft-AP模式的专用库——WiFiAP库,大家使用的时候不需要
#include
只需要引入
#include
至于原因,请看源码:
首先,对于AP类库的描述,可以拆分为三个部分:
函数讲解:
/**
* 建立一个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);
函数说明:
/**
* 建立一个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);
注意点:
函数说明:
/**
* 配置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);
函数说明:
/**
* 获取连接到当前softAP的station或者client的数目
* @return Stations 数目
*/
uint8_t softAPgetStationNum();
应用实例:
//实例代码 这只是部分代码 不能直接使用
Serial.printf("Stations connected to soft-AP = %d\n", WiFi.softAPgetStationNum());
函数说明:
/**
* 关闭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 WiFiAPClass::softAPdisconnect(bool wifioff)
{
bool ret;
wifi_config_t conf;
if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){
return ESP_ERR_INVALID_STATE;
}
*conf.ap.ssid = 0;
*conf.ap.password = 0;
conf.ap.authmode = WIFI_AUTH_OPEN; // auth must be open if pass=0
ret = esp_wifi_set_config(WIFI_IF_AP, &conf) == ESP_OK;
if(wifioff) {
ret = WiFi.enableAP(false) == ESP_OK;
}
return ret;
}
函数说明:
/**
* 获取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
函数说明:
/**
* 获取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());
函数说明:
/**
* Get the softAP interface Host name.
* @return char array hostname
*/
const char * WiFiAPClass::softAPgetHostname()
{
const char * hostname = NULL;
if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){
return hostname;
}
if(tcpip_adapter_get_hostname(TCPIP_ADAPTER_IF_AP, &hostname)) {
return hostname;
}
return hostname;
}
函数说明:
/**
* Set the softAP interface Host name.
* @param hostname pointer to const string
* @return true on success
*/
bool WiFiAPClass::softAPsetHostname(const char * hostname)
{
if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){
return false;
}
return tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_AP, hostname) == ESP_OK;
}
函数说明:
/**
* Enable IPv6 on the softAP interface.
* @return true on success
*/
bool WiFiAPClass::softAPenableIpV6()
{
if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){
return false;
}
return tcpip_adapter_create_ip6_linklocal(TCPIP_ADAPTER_IF_AP) == ESP_OK;
}
函数说明:
/**
* Get the softAP interface IPv6 address.
* @return IPv6Address softAP IPv6
*/
IPv6Address WiFiAPClass::softAPIPv6()
{
static ip6_addr_t addr;
if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){
return IPv6Address();
}
if(tcpip_adapter_get_ip6_linklocal(TCPIP_ADAPTER_IF_AP, &addr)) {
return IPv6Address();
}
return IPv6Address(addr.addr);
}
上面讲了一堆方法理论的东西,下面我们开始讲解操作实例,博主尽量都在代码中注释,直接看代码就好。