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 知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张图:

ESP32 WiFi 基础架构 WiFi 工作模式 STA 模式 连接路由器 AP 模式 创建热点 STA+AP 模式 同时工作 WiFi 事件处理系统 STA_CONNECTED 连接成功 STA_GOT_IP 获取IP地址 STA_DISCONNECTED 断开连接 AP_STACONNECTED 客户端接入 事件驱动架构:注册回调 → 等待触发 → 执行处理 避免在回调中做耗时操作,只做状态标记

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带宽,高吞吐场景慎用