3、WiFi基础:ESP32连接路由器、STA模式与AP模式、WiFi事件处理
好,咱们开始聊WiFi。说实话,在物联网项目里,WiFi是绕不开的基础设施。ESP32之所以受欢迎,很大程度是因为它把WiFi和蓝牙揉到了一块儿。这一章,我就带你把这部分基础打牢。
3.1 三种模式:STA、AP、STA+AP
ESP32的WiFi模块可以工作在三种模式下。我刚开始接触时,总觉得模式切换很玄乎,其实说白了就三种角色:
- STA模式(Station):设备作为客户端,去连接一个已有的WiFi热点。比如你家智能插座连路由器,就是STA。
- AP模式(Access Point):设备自己创建一个热点,让其他设备连过来。比如你用手机直连ESP32配置网络。
- STA+AP模式:同时充当客户端和热点。这在混合组网里非常实用——ESP32一边连路由器上网,一边开个热点给手机发数据。
我个人习惯在调试阶段先用STA+AP模式,这样既能看日志,又能随时用手机连上去检查状态。
核心概念:ESP32的WiFi库基于事件驱动。你不需要轮询连接状态,注册好事件回调函数,系统会自动通知你。
3.2 连接路由器:STA模式实战
先写一个最基础的STA模式代码。嗯,这里要注意,WiFi连接不是瞬间完成的,需要等待事件触发。
#include <WiFi.h>
const char* ssid = "你的路由器SSID";
const char* password = "你的路由器密码";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA); // 设置为STA模式
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() {
// 你的业务逻辑
}
这段代码看起来简单,但我在项目中遇到过一个问题:如果路由器断电重启,ESP32会卡在while循环里出不来。所以实际产品里,千万别用这种阻塞式等待。
避坑指南:我曾经在一个智能网关项目里用了阻塞式等待,结果客户的路由器半夜重启,所有设备全部死机。后来我改用事件回调+超时重连机制,才彻底解决。
3.3 创建热点:AP模式实战
AP模式相对简单,ESP32自己当路由器。你想想看,这在设备配网场景下多有用。
#include <WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP);
WiFi.softAP("ESP32_Config", "12345678"); // SSID和密码
Serial.println("AP模式已启动");
Serial.print("AP IP地址: ");
Serial.println(WiFi.softAPIP());
}
void loop() {
// 等待客户端连接
}
这里有个细节:softAP()函数可以设置最大连接数(默认4个),以及是否隐藏SSID。我建议在配网场景下,把密码设得简单点,方便用户输入。
3.4 WiFi事件处理:让程序更健壮
为什么需要事件处理?因为WiFi连接不是一锤子买卖。信号波动、路由器重启、设备移动,都会导致连接断开或重连。用事件回调,你的程序才能优雅应对这些情况。
ESP32的WiFi事件系统提供了十几个事件类型,常用的有:
| 事件名称 | 触发时机 | 典型处理 |
|---|---|---|
| SYSTEM_EVENT_STA_CONNECTED | STA成功连接到AP | 记录日志 |
| SYSTEM_EVENT_STA_DISCONNECTED | STA与AP断开连接 | 启动重连逻辑 |
| SYSTEM_EVENT_STA_GOT_IP | STA获取到IP地址 | 通知业务层网络就绪 |
| SYSTEM_EVENT_AP_STACONNECTED | 有设备连接到AP | 记录客户端信息 |
| SYSTEM_EVENT_AP_STADISCONNECTED | 有设备断开AP连接 | 清理客户端记录 |
来看一个完整的事件处理示例:
#include <WiFi.h>
void WiFiEvent(WiFiEvent_t event) {
switch(event) {
case SYSTEM_EVENT_STA_GOT_IP:
Serial.println("获取到IP地址");
Serial.println(WiFi.localIP());
// 通知MQTT或HTTP客户端开始工作
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("WiFi断开,尝试重连...");
WiFi.reconnect(); // 自动重连
break;
case SYSTEM_EVENT_AP_STACONNECTED:
Serial.println("有设备连接到AP");
break;
default:
break;
}
}
void setup() {
Serial.begin(115200);
WiFi.onEvent(WiFiEvent); // 注册事件回调
WiFi.mode(WIFI_STA);
WiFi.begin("SSID", "PASSWORD");
}
void loop() {
// 你的业务逻辑,不用关心WiFi状态
}
个人经验:事件回调里不要做耗时操作,比如延时或大量打印。我曾经在回调里写了个Serial.println长字符串,结果导致WiFi协议栈卡死。回调里只做标志位设置或简单状态记录,具体逻辑放到loop里处理。
3.5 知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图:
3.6 混合模式下的注意事项
STA+AP模式虽然强大,但有个坑:两个接口共用同一个WiFi射频,所以总带宽会减半。我在一个视频传输项目里吃过亏,STA模式下行速度本来能到5MB/s,开了AP模式后直接掉到2.5MB/s。
另外,AP模式的IP地址段默认是192.168.4.x,和大多数路由器的192.168.1.x不冲突。但如果你改了路由器的网段,记得检查一下。
总结一下本章要点:
- 三种模式各有用途,STA+AP模式是混合组网的基础
- 不要用阻塞式while等待连接,用事件回调更可靠
- 事件回调里只做轻量操作,重连逻辑放到主循环
- AP模式会占用WiFi带宽,高吞吐场景慎用