3、ESP32网络连接:WiFi Station模式连接路由器、WiFi AP模式创建热点、WiFi连接状态监测与重连机制
网络连接,是ESP32远程监控系统的命脉。没有网,一切都白搭。
我刚开始带团队做物联网项目时,最头疼的就是设备连不上网。用户拿回去插电,指示灯一闪一闪的,然后客服电话就来了。后来我学乖了——把网络连接的健壮性做到极致,问题少了一大半。
这一章,咱们就把ESP32的三种网络玩法讲透:Station模式(连路由器)、AP模式(自己当热点)、以及连接监测与重连。你想想看,如果设备断网后能自己恢复,是不是省心很多?
3.1 WiFi Station模式:让ESP32连上你家路由器
Station模式,说白了就是让ESP32像手机一样,去连接一个现有的WiFi热点。这是最常用的模式,没有之一。
代码其实很简单,核心就三步:
#include <WiFi.h>
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("连接成功!");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
}
嗯,这里要注意——WiFi.begin()是非阻塞的,它只是发起连接请求。真正的连接状态,要通过WiFi.status()去轮询。我在项目中遇到过,有人直接在begin()后面加了个delay(10000),以为等10秒就肯定连上了。结果呢?路由器信号不好,10秒没连上,程序就傻眼了。
3.2 WiFi AP模式:让ESP32自己创建热点
AP模式,就是ESP32变身成一个迷你路由器。其他设备(手机、电脑)可以连上来。这个模式在设备初次配置时特别有用——你想想看,新设备没有WiFi密码,怎么上网?
做法也很直接:
#include <WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.softAP("ESP32_Config", "12345678");
Serial.println("热点已创建");
Serial.print("AP IP地址: ");
Serial.println(WiFi.softAPIP());
}
这里有个坑,我曾经踩过——softAP()的密码长度至少8位,否则会失败。而且热点名称不要用中文,有些手机连不上。
3.3 混合模式:Station + AP 同时工作
实际项目中,我经常让ESP32同时工作在两种模式下。一边连路由器上网,一边开个热点供调试用。这叫WiFi.softAP() + WiFi.begin()双开。
代码示例:
void setup() {
WiFi.mode(WIFI_AP_STA); // 关键!设置双模式
WiFi.softAP("ESP32_Debug", "debug1234");
WiFi.begin("家庭路由器", "密码");
}
为什么要这么干?我举个例子:设备部署在工厂里,连上了产线WiFi。但调试时,工程师想直接连设备看日志。这时候AP模式就派上用场了——工程师连上ESP32的热点,直接访问它的Web页面,不用去碰产线网络。
3.4 WiFi连接状态监测:别等断了才发现
很多新手写完连接代码就完事了。结果设备运行几天后,路由器重启了,ESP32就永远断网了。为什么?因为WiFi.begin()只在启动时执行一次,断网后不会自动重连。
正确的做法是:在loop()里定期检查连接状态。
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi断开,尝试重连...");
WiFi.reconnect();
}
// 其他业务代码...
delay(1000);
}
这里有个细节——WiFi.reconnect()只是发起重连,不会阻塞。你需要在后续的循环里继续检查状态。我一般会加一个重连计数器,连续失败10次就重启设备。这叫「软硬兼施」。
3.5 重连机制:让设备自己「活过来」
重连机制,是物联网设备稳定性的最后一道防线。我总结了一套「三级重连策略」:
| 级别 | 触发条件 | 操作 |
|---|---|---|
| 第一级 | WiFi断开 < 30秒 | 调用WiFi.reconnect(),最多重试5次 |
| 第二级 | WiFi断开 > 30秒 | 重启WiFi模块:WiFi.disconnect() + WiFi.begin() |
| 第三级 | 连续重连失败 > 10次 | ESP.restart() 硬件重启 |
代码实现大致是这样:
int reconnectCount = 0;
void checkWiFi() {
if (WiFi.status() == WL_CONNECTED) {
reconnectCount = 0;
return;
}
reconnectCount++;
if (reconnectCount <= 5) {
WiFi.reconnect();
} else if (reconnectCount <= 10) {
WiFi.disconnect();
delay(1000);
WiFi.begin(ssid, password);
} else {
ESP.restart();
}
}
我曾经在一个农业大棚项目里,就靠这套机制救回了30多台设备。那天下暴雨,路由器跳闸了3次,每次恢复后设备都能自己连回来。客户都不知道发生过断网。
while(1)死等。我曾经这么干过,结果设备卡死在重连循环里,连串口都救不了。一定要加超时和计数限制。
3.6 实际项目中的网络配置策略
最后,分享一个我常用的「双模式启动策略」:
- 上电后先尝试连接上次保存的WiFi(用Preferences库保存SSID和密码)
- 如果10秒内连不上,自动开启AP模式,热点名称为"ESP32_配置_设备MAC后6位"
- 用户通过手机连上热点,访问192.168.4.1,在网页里输入新的WiFi信息
- 保存配置,重启,用新配置连接路由器
这套流程,说白了就是让设备永远有「后路」。连不上网?没关系,我开个热点让你来配。配好了?我重启连路由器。再连不上?我继续开热点等你。
嗯,这才是物联网设备该有的样子——不依赖人工干预,自己能搞定大部分问题。