@[toc]
目的
使用 ESP32 一般是用它的 WIFI 功能,使用 WIFI 功能大概就是建立网络、连接网络、搜索网络等基础操作。
建立网络(AP)
基础使用
下面是 wifi 连接最基础的代码。将代码烧入模块中,便能在 wifi 列表中搜索到名为 “ESP32_WIFI_AP” 的无密码 WIFI。
#include <WiFi.h>
void setup()
{
WiFi.softAP("ESP32_WIFI_AP");
}
void loop()
{
}
主要函数
-
bool WiFi.softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden, int max_connection)
使用此方法开启 AP 模式,在成功开启后会返回 ture
参数 | 介绍 |
---|---|
ssid |
AP 网络的名称,至少需一个字节,最大一般不超过32字节 |
passphrase |
所建立AP网络的密码,可以为 NULL(无密码)或不小于8字节且不大于63字节的密码 |
channel |
WiFi网络信道,可选值1~13 |
ssid_hidden |
是否对外隐藏SSID,0-不隐藏,1-隐藏 |
max_connection |
最大可接入数,可选值1~4 |
-
bool softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet)
设置 AP 地址
参数 | 介绍 |
---|---|
local_ip | 本地地址,默认为 192.168.4.1 |
gateway | 网关地址,默认为 192.168.4.1 |
subnet | 子网掩码,默认为 255.255.255.0 |
-
bool softAPdisconnect(bool wifioff = false)
关闭当前AP,若wifioff为true则还将还原网络设置 -
uint8_t softAPgetStationNum()
返回连接到 AP 的客户端数量 -
IPAddress softAPIP()
返回当前模块IP -
bool softAPsetHostname(const char * hostname)
设置主机名字 -
const char * softAPgetHostname()
返回主机名字 -
uint8_t* softAPmacAddress(uint8_t* mac) String softAPmacAddress(void)
返回 mac 地址
使用示例
将下方代码烧入模块中测试
#include <WiFi.h>
IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,22);
IPAddress subnet(255,255,255,0);
const char *ssid = "ESP32_AP_TEST";
const char *password = "12345678";
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_AP); //设置工作在AP模式
WiFi.softAPConfig(local_IP, gateway, subnet); //设置AP地址
while(!WiFi.softAP(ssid, password)){}; //启动AP
Serial.println("AP startup success");
Serial.print("IP address: ");
Serial.println(WiFi.softAPIP()); // 打印IP地址
WiFi.softAPsetHostname("myHostName"); //设置主机名
Serial.print("HostName: ");
Serial.println(WiFi.softAPgetHostname()); //打印主机名
Serial.print("mac Address: ");
Serial.println(WiFi.softAPmacAddress()); //打印mac地址
}
void loop()
{
delay(1000);
Serial.println(WiFi.softAPgetStationNum()); //打印客户端连接数
}
连接网络(STA)
基础使用
将下方代码烧入板子中就可连接指定的网络
#include <WiFi.h>
const char *ssid = "********"; //你的网络名称
const char *password = "********"; //你的网络密码
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.begin(ssid, password); //连接网络
while (WiFi.status() != WL_CONNECTED) //等待网络连接成功
{
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); //打印模块IP
}
void loop()
{
}
主要函数
-
wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true)
该方法用来接入网络; -
bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)
设置网络地址; -
bool disconnect(bool wifioff = false, bool eraseap = false)
断开网络连接,若wifioff为true则还将还原网络设置,若eraseap为true则将清除保存于flash中的网络参数; -
bool isConnected()
返回是否已接入网络; -
bool setAutoReconnect(bool autoReconnect)
设置断网自动重连接; -
bool getAutoReconnect()
返回是否自动重连接; -
IPAddress localIP()
返回模块地址; -
IPAddress subnetMask()
返回子网掩码; -
IPAddress gatewayIP()
返回网关地址; -
IPAddress dnsIP(uint8_t dns_no = 0)
返回DNS地址; -
uint8_t * macAddress(uint8_t* mac)
and
String macAddress()
返回MAC地址; -
const char * getHostname()
返回主机名字; -
bool setHostname(const char * hostname)
设置主机名字; -
wl_status_t status()
返回联网状态,状态如下:
返回值 | 含义 |
---|---|
255 | WL_NO_SHIELD不用在意(兼容WiFi Shield而设计) |
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断开连接; |
使用示例
#include <WiFi.h>
const char *ssid = "*****"; //你的网络名称
const char *password = "*****"; //你的网络密码
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA); //设置工作在STA模式
WiFi.begin(ssid, password); //连接网络
while (!WiFi.isConnected()) //等待网络连接成功
{
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //打印模块IP
Serial.print("subnetMask: ");
Serial.println(WiFi.subnetMask()); //打印子网掩码
Serial.print("gateway: ");
Serial.println(WiFi.gatewayIP()); //打印网关地址
Serial.print("dns: ");
Serial.println(WiFi.dnsIP()); //打印DNS地址
Serial.print("mac Address: ");
Serial.println(WiFi.macAddress()); //打印mac地址
WiFi.setHostname("myHostName"); //设置主机名
Serial.print("HostName: ");
Serial.println(WiFi.getHostname()); //打印主机名
Serial.println(WiFi.status());
WiFi.disconnect(); //断开当前网络
delay(1000);
Serial.println(WiFi.status());
}
void loop()
{
}
搜索网络
有时候在实际操作中,都要先搜索周围环境的 wifi 后再进行下一步的操作。下面用的是异步搜索,异步搜索相较于同步搜索不会阻塞程序的运行
主要函数
-
int16_t scanNetworks(bool async = false, bool show_hidden = false, bool passive = false, uint32_t max_ms_per_chan = 300)
启动搜索,各项参数如下:
参数 | 介绍 |
---|---|
async | 异步扫描,该值为true时将启动异步扫描,该方法将不阻塞 |
show_hidden | 是否扫描不广播的网络 |
passive | 影响扫描速度,该值为true时扫描速度较快(不确定) |
max_ms_per_chan | 每通道扫描时间 |
-
int16_t scanComplete()
异步模式下用于获取扫描到的网络数量,如果返回值为-1,表示还在进行扫描,如果返回值为-1,表示未进行扫描或扫描失败 -
void scanDelete()
删除内存中的扫描结果 -
String SSID(uint8_t networkItem)
返回扫描到的网络名称 -
wifi_auth_mode_t encryptionType(uint8_t networkItem)
返回扫描到的网络加密类型 -
int32_t RSSI(uint8_t networkItem)
返回扫描到的网络信号强度 -
int32_t channel(uint8_t networkItem)
返回扫描到的网络信道号
使用示例
#include <WiFi.h>
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA); //设置为STA模式
WiFi.disconnect(); //断开当前可能的连接
delay(100);
Serial.println("Strat scanning");
WiFi.scanNetworks(true); //启动异步扫描
}
void loop()
{
delay(1000);
int n = WiFi.scanComplete(); //获取扫描状态
if (n >= 0)
{
Serial.println("Scan over");
for (int i = 0; i < n; ++i)
{
Serial.println();
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i)); //打印网络名称
Serial.print(" ");
Serial.print(WiFi.RSSI(i)); //打印信号强度
Serial.print(" ");
Serial.print((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? "unencrypted" : "encryption"); //打印是否加密
delay(10);
}
WiFi.scanDelete(); //清除内存中的扫描结果
}
else if (n == -1)
{
Serial.println("Scanning now");
}
else if (n == -2)
{
Serial.println("Not scanned");
}
}
总结
学会了 wifi 功能就能实现联网,真正开始开发网络应用,并且创造出更多新的创意产品。