3、ESP32 WiFi连接:WiFi库介绍、Station模式连接路由器、AP模式创建热点、WiFi连接状态监测与重连机制
好,咱们进入正题。这一章要聊的是ESP32的WiFi连接。说实话,WiFi是物联网设备的基础,没有它,后面那些WebSocket通信、数据推送都无从谈起。我刚开始做ESP32项目时,就因为在WiFi连接上踩了坑,导致设备上线率一直上不去。后来才明白,WiFi连接看似简单,但要做好、做稳,还真得下点功夫。
3.1 WiFi库概览
ESP32的WiFi功能,核心就靠一个库——WiFi.h。这个库是Arduino-ESP32官方提供的,封装了底层WiFi驱动。说白了,你不需要去管那些复杂的寄存器配置,调用几个API就能搞定连接。
我个人习惯,在项目开始前先看看库的版本。不同版本的API可能有细微差别。你可以通过Arduino IDE的「工具」→「开发板管理器」查看ESP32包版本。我建议用2.0.x以上的版本,稳定性好很多。
核心API一览:
WiFi.begin(ssid, password)— 连接WiFiWiFi.status()— 获取连接状态WiFi.softAP(ssid, password)— 创建热点WiFi.disconnect()— 断开连接WiFi.reconnect()— 重新连接
嗯,这里要注意:WiFi.begin()是非阻塞的,它不会等连接成功才返回。你调用后,它就开始后台尝试连接,你需要通过WiFi.status()去轮询结果。这一点和很多人的直觉不一样。
3.2 Station模式:连接路由器
Station模式,就是让ESP32作为客户端去连接家里的路由器。这是最常用的模式,没有之一。
来看一个最基本的连接代码:
#include <WiFi.h>
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("正在连接WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n连接成功!");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
}
void loop() {
// 你的业务逻辑
}
这段代码看起来简单,但我得提醒你:千万别在生产环境里用这种阻塞式等待。为什么?因为while循环会卡住整个程序,如果WiFi连不上,你的设备就死在那了。我在项目中遇到过这种情况——设备部署后,用户说「怎么连不上网」,结果发现是WiFi密码输错了,设备一直卡在连接循环里,连OTA升级都做不了。
我的建议:用非阻塞方式连接,设置超时时间。比如10秒连不上就重启或进入配置模式。
改进后的非阻塞连接代码:
void connectWiFi() {
WiFi.begin(ssid, password);
Serial.print("正在连接WiFi");
int timeout = 20; // 超时计数
while (WiFi.status() != WL_CONNECTED && timeout > 0) {
delay(500);
Serial.print(".");
timeout--;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\n连接成功!");
} else {
Serial.println("\n连接失败,进入配置模式");
// 启动AP模式让用户配置
}
}
3.3 AP模式:创建热点
AP模式,就是让ESP32自己当路由器,创建一个WiFi热点。这个模式在设备初次配置时特别有用——你想想看,设备刚买回来,没有WiFi信息,怎么连?通常的做法就是先让设备开个热点,手机连上去,然后通过网页或App把家里的WiFi密码告诉设备。
创建热点的代码很简单:
void setupAP() {
const char* ap_ssid = "ESP32_Config";
const char* ap_password = "12345678";
WiFi.softAP(ap_ssid, ap_password);
Serial.print("热点已创建: ");
Serial.println(ap_ssid);
Serial.print("IP地址: ");
Serial.println(WiFi.softAPIP());
}
注意:ESP32的AP模式最多支持4个客户端连接。如果你需要更多,就得考虑用路由器了。另外,AP模式和Station模式可以同时开启,这叫「混合模式」。我经常用这个模式做调试——设备连上家里的WiFi,同时开着热点,方便我随时连上去看日志。
3.4 WiFi连接状态监测
WiFi连接不是一劳永逸的。信号波动、路由器重启、设备移动,都可能导致断连。所以,实时监测连接状态是必须的。
WiFi.status()返回的状态码有这些:
| 状态码 | 含义 | 说明 |
|---|---|---|
| WL_IDLE_STATUS | 空闲状态 | WiFi正在初始化或未开始连接 |
| WL_NO_SSID_AVAIL | 找不到SSID | 你指定的WiFi不存在或信号太弱 |
| WL_CONNECTED | 已连接 | 一切正常 |
| WL_CONNECT_FAILED | 连接失败 | 密码错误或认证失败 |
| WL_DISCONNECTED | 已断开 | 连接后意外断开 |
我一般会在loop()里定期检查状态:
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi断开,尝试重连...");
WiFi.reconnect();
// 等待5秒
int retry = 10;
while (WiFi.status() != WL_CONNECTED && retry > 0) {
delay(500);
retry--;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("重连成功!");
} else {
Serial.println("重连失败,重启设备");
ESP.restart();
}
}
// 你的业务逻辑
}
小技巧:不要每轮循环都检查WiFi状态,那样太频繁了。我习惯每5秒检查一次,用millis()做定时,而不是delay()。
3.5 重连机制:让设备更可靠
重连机制是WiFi连接的「最后一道防线」。一个好的重连策略,能大幅提升设备的稳定性。
我曾经在一个智能家居项目里,设备部署在用户家里,WiFi环境很差。一开始我用最简单的重连——断了就重连,结果设备频繁重启,用户体验极差。后来我设计了一套分级重连策略:
- 第一级:快速重连 — 断开后立即尝试重连,最多3次,每次间隔1秒
- 第二级:慢速重连 — 如果快速重连失败,改为每30秒重连一次,最多5次
- 第三级:深度恢复 — 如果还是连不上,重启WiFi模块,甚至重启整个设备
代码实现大概是这样的:
int reconnectLevel = 0;
unsigned long lastReconnectTime = 0;
void handleWiFiReconnect() {
if (WiFi.status() == WL_CONNECTED) {
reconnectLevel = 0;
return;
}
unsigned long now = millis();
switch (reconnectLevel) {
case 0: // 快速重连
if (now - lastReconnectTime > 1000) {
WiFi.reconnect();
lastReconnectTime = now;
reconnectLevel++;
}
break;
case 1: // 慢速重连
if (now - lastReconnectTime > 30000) {
WiFi.reconnect();
lastReconnectTime = now;
reconnectLevel++;
}
break;
case 2: // 深度恢复
if (now - lastReconnectTime > 60000) {
WiFi.disconnect(true); // 彻底断开
delay(1000);
WiFi.begin(ssid, password);
lastReconnectTime = now;
reconnectLevel = 0; // 重置级别
}
break;
}
}
核心要点:
- 重连间隔要递增,避免频繁重连导致WiFi模块过热
- 记录重连次数,超过阈值后采取更激进的恢复措施
- 重连成功后,重置所有计数器和级别
- 考虑保存WiFi配置到NVS,避免每次重启都重新配置
嗯,说到保存配置,我建议用Preferences库把WiFi信息存到NVS(非易失性存储)里。这样设备重启后能自动读取配置并连接,不用每次都重新输入。这个在后面的章节会详细讲。
最后总结一下:WiFi连接是ESP32通信的基础,Station模式用于连接路由器,AP模式用于创建热点。连接状态监测要实时但不要频繁,重连机制要分级、有策略。把这些做好了,你的设备才算真正「站稳了脚跟」。下一章,我们就基于这个稳定的WiFi连接,开始玩WebSocket通信。