四、ESP32单片机wifi的AP与STA模式使用
关于WIFI的AP与STA简介
在ESP32的 WIFI 中有两种模式是我们今天需要认识的,我们平时的wifi也是一样,他们就是我们今天的主题,AP模式与STA模式
AP模式,指的无线接入点,创建一个无线网络的模式,家里的路由器就是最好的例子,通俗易懂的理解AP模式就是创造一个wifi然后我们用手机之类的设备去连接wifi,可以参考手机开个热点,可能不一定非常准确但是我们先这样理解
STA模式,每一个连接到热点上的手机都可以称为STA站点,也就是我们的ESP32在STA模式下工作就可以连接路由器发出的wifi
家里要有WIFI的话就需要装一个路由器,然后路由器制造一个WIFI,我们使用手机等设备去连接,在这个过程中我们可以理解为路由器处于AP模式创建无线网络,手机处于STA模式连接到路由器创建的无线网络
ESP32串口通信
打开arduino编译器,新建工程,选择对应的开发板与端口,这里看了前面的文章就不多说了
在开启wifi功能之前简单的说明一下ESP32串口功能的使用,在arduino的函数参考中有关于串口通信的两个函数需要学会使用
Serial.begin(speed)
函数功能:初始化
UART
串口,并设置通信波特率参数
speed
为波特率参数,常用的波特率有4800,9600,14400,19200,28800,38400,57600,115200
Serial.print(val)
函数功能:初始化串口功能之后,用于在串口输出数据
参数
val
为要输出的数据
下面我们新建一个每隔三秒发送一个Hello World!到串口上的程序作为演示,程序保存在资料文件中
代码如下:
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); //初始化串口并设置波特率为115200
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print("Holle World!\n"); //发送Holle World!到串口
delay(3000); //设置间隔3秒发送一次
}
其中串口的参数只需要初始化设置一次,所以放到setup函数中,发送数据为字符串类型所以加了" ",
数据中的\n为转义字符换行的意思
AP与STA模式相关函数
在开启ESP32的AP与STA模式之前我们先看到下面一些常用的函数功能介绍,也可以先跳过,等用到哪个函数查看哪个函数
AP相关
WiFi.softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden, int max_connection)
函数功能:用于设置wifi网络信息并启动AP模式
参数
ssid
为wifi网络的名称,char
类型数据
passphrase
设置wifi的密码,可以为空则设置的wifi为开放式的没有密码,int
类型数据
channel
设置wifi通道,可在1~13
之间选择,不填写参数默认1
,int
类型数据
ssid_hidden
设置wifi是否隐藏,设置为0
不隐藏,1
隐藏,不填写参数默认0
,bool
类型数据
max_connection
设置可连接到wifi上的设备最大数量,1~4,int
类型数据函数返回值为
bool
类型,启动成功返回ture
WiFi.softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet)
函数功能:设置ESP32的
IP地址
、网关地址
、子网掩码
参数
local_ip
为需要设置的网络IP地址
gateway
为需要设置的网络网关地址
subnet
为需要设置的网络子网掩码
上述参数类型均为IPAddress
类型的参数函数返回值为
bool
类型,设置成功则返回ture
WiFi.softAPdisconnect(bool wifioff)
函数功能:关闭AP模式或者开启
参数
wifioff
为bool
类型数据,输入ture
则关闭AP模式
函数返回值为
bool
类型,设置成功则返回ture
WiFi.softAPIP()
函数功能:ESP32创建一个wifi之后获取ESP32本身的IP地址并返回
函数返回值为
IPAddress
类型
WiFi.softAPmacAddress()
函数功能:获取开发板
MAC地址
函数返回值为
String
类型数据
WiFi.softAPgetStationNum()
函数功能:返回接入的无线终端的数量
函数返回值类型为
uint8_t
类型
STA相关
wifi.begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect)
函数功能:用于启动ESP32开发板的
STA无线终端模式
参数
ssid
用于设置需要连接的wifi的名称,参数为const char*
类型数据
passphrase
用于设置需要连接的wifi的密码,参数为const char*
类型数据
channel
要连接的wifi的信道,为int32_t
类型数据,可以不填
bssid
为要连接wifi的MAC地址,为const uint8_t*
数据类型,可以不填
connect
参数设置是否连接wifi,如果为ture
则使用存储的信息连接wifi,如果为false
会将信息存储到闪存中但不连接wifi,数据为bool
类型
wifi.config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1, IPAddress dns2)
函数功能:设置ESP32的
IP配置
参数
local_ip
用于配置ESP32的固定IP地址
,数据为IPAddress
类型
gateway
用于配置网关IP地址
,数据为IPAddress
类型
subnet
用于配置子网掩码
,数据为IPAddress
类型
dns1
、dns2
为可选参数,可自定义域名服务器的IP地址
WiFi.disconnect(bool wifioff, bool eraseap)
函数功能:断开网络连接
参数
wifioff
设置为ture
则会将关闭ESP32的STA模式,设置为false
则会将SSID和密码清空并且断开当前的连接,但不关闭STA模式,数据为bool
类型
eraseap
设置为ture
则清空保存在Flash中的网络参数,数据为bool
类型
WiFi.isConnected()
函数功能:判断网络是否连接
返回值为
ture
则连接成功,false
则连接失败,返回值为bool
类型
WiFi.setAutoReconnect(bool autoReconnect)
函数功能:设置网络断开后是否自动重连
参数
autoReconnect
设置为ture
模块在断开连接的时候将会尝试重新连接,设置为false
则保持断开
WiFi.localIP()
函数功能:返回当前无线终端的IP地址
数据为
IPAddress
类型
WiFi.subnetMask()
函数功能:返回当前无线终端的子网掩码
数据为
IPAddress
类型
WiFi.gatewayIP()
函数功能:返回当前网关IP
数据为
IPAddress
类型
WiFi.status()
函数功能:返回ESP32连接状态
返回值如下
0:WL_IDLE_STATUS
正在WiFi工作模式间切换;
1:WL_NO_SSID_AVAIL
无法访问设置的SSID网络;
2:WL_SCAN_COMPLETED
扫描完成;
3:WL_CONNECTED
连接成功;
4:WL_CONNECT_FAILED
连接失败;
5:WL_CONNECTION_LOST
丢失连接;
6:WL_DISCONNECTED
断开连接;
255:WL_NO_SHIELD
不用在意(兼容WiFi Shield而设计)
ESP32开启AP模式
在我们使用ESP32的AP或者STA功能的的时候都需要调用库WiFi.h,该库包含了使用wifi功能需要的库
下面我们编写一个ESP32开启AP模式创建一个wifi并通过串口输出wifi的名称和设备的IP地址,我们需要接触到两个关于AP使用的函数,也可以看上面的相关函数
WiFi.softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden, int max_connection)
WiFi.softAPIP()
下面我们看到代码
#include<WiFi.h> //调用包含wifi功能的库
const char *wifi_SSID="YXDZ_ESP32"; //保存AP的名称信息
const char *wifi_Password="ESP321234"; //保存AP的密码信息
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); //启动串口通信并设置波特率为115200
WiFi.softAP(wifi_SSID,wifi_Password); //设置AP模式热点的名称和密码,密码可不填则发出的热点为无密码热点
Serial.print("\n ESP32建立的wifi名称为:");
Serial.print(wifi_SSID); //串口输出ESP32建立的wifi的名称
Serial.print("\nESP32建立wifi的IP地址为:");
Serial.print(WiFi.softAPIP()); //串口输出热点的IP地址
}
void loop() {
// put your main code here, to run repeatedly:
}
看到上面代码我们会发现整个程序创建wifi涉及到的函数只有softAP()一个,其他的更多的是输出调试信息WiFi.softAPIP()也只是获取了ESP32创建wifi之后的IP地址,所以我们创建wifi的整个过程仅需调用wifi库之后往softAP()中填入需要创建的wifi的名称和密码
接下我们验证一下我们的程序是否正确
1、烧录程序
2、打开串口助手按下复位按键查看IP地址 192.168.4.1,每个人可能都不一样
3、找到名称为YXDZ_ESP32的wifi,输入我们程序中设置的密码进行连接(名称与密码都可自行调整)
4、连上wifi之后我们在cmd中ping一下IP地址和ESP32通信一下确定能通信
上面显示的已发送=4,已接收=4,丢失0%即为正常通信成功,ping 192.168.4.1中的ip地址就是我们之前获取的板子上串口输出获取到的ip地址,到了这里我们就成功打开了ESP32的AP模式并验证通信没有问题
ESP32开启STA模式
接下来我们开启STA模式,同样的需要调用wifi.h,我们下面编写一个ESP32连接手机热点并通过串口输出wifi名称和开发板IP地址等相关的调试信息
下面我们看到这个程序需要使用的几个关键性的函数
WiFi.begin()
用来设置ESP32为STA模式并配置连接的wifi的名称和密码的相关信息
WiFi.status()
用于判断wifi的连接状态
WiFi.SSID()
、WiFi.localIP()
用来在连接成功之后获取ESP32连接的wifi、名称和IP地址
贴出测试代码
#include<WiFi.h>
const char *wifi_SSID="OnePlus 8 Pro"; //设置连接的wifi名称信息
const char *wifi_Password="YXDZ1234"; //设置连接的wifi密码信息
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); //启动串口通信并设置波特率为115200
WiFi.begin(wifi_SSID,wifi_Password); //设置需要连接的wifi的名称和密码
Serial.print("\n正在连接wifi");
while(WiFi.status()!= WL_CONNECTED) //启动连接,连到之前设置信息的wifi
{
delay(500);
Serial.print(".");
}
Serial.print("\n已连接到wifi:");
Serial.print(WiFi.SSID()); //输出WIFI的连接信息
Serial.print("\nIP地址:");
Serial.print(WiFi.localIP()); //输出WiFi的IP地址信息
}
void loop() {
// put your main code here, to run repeatedly:
}
上面代码首先初始化串口方便我们做调试,初始化串口之后,开启STA模块设置连接的wif的名称和密码(WiFi.begin()函数),while语句中判断wifi是否连接成功,连接成功则调出循环,后面为输出wifi名称以及IP地址信息的代码
同样的我们像上面AP模式一样ping一下看是否可以通数据
先烧录程序确定wifi连接成功并获取IP地址,打开工具串口监视器按下ESP32的复位按键进行连接wifi
可以看到ip地址为192.168.43.1,这里因为是手机开的热点,电脑需要进行通信的话需要在同一个局域网下(也就是电脑也连一下手机wifi就好了)
同样的在cmd里面ping一下刚才获取到的IP地址进行测试
总结
本期主要讲解了有关于ESP32的AP模式与STA模式如何开启以及相关信息的输出,下一期我们将开始一起学习有关于搭建网络服务器和电脑手机进行交互,长期发布类似文章,欢迎关注,本期有关ESP32就到这里了,欢迎随时留言,需要程序或者资料也可以在下方留言喔!