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) — 连接WiFi
  • WiFi.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环境很差。一开始我用最简单的重连——断了就重连,结果设备频繁重启,用户体验极差。后来我设计了一套分级重连策略:

  1. 第一级:快速重连 — 断开后立即尝试重连,最多3次,每次间隔1秒
  2. 第二级:慢速重连 — 如果快速重连失败,改为每30秒重连一次,最多5次
  3. 第三级:深度恢复 — 如果还是连不上,重启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通信。