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秒没连上,程序就傻眼了。

我的习惯:不要用死等的方式。设置一个超时时间,比如20秒,连不上就重启或者进入AP模式。这样设备不会卡死。

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位,否则会失败。而且热点名称不要用中文,有些手机连不上。

注意:AP模式下,ESP32最多能连4-5个客户端。别指望它能当企业级路由器用。另外,AP模式功耗比Station模式高不少,电池供电的设备要慎用。

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次就重启设备。这叫「软硬兼施」。

核心思路:网络连接状态监测,要放在主循环里,而不是只在初始化时做一次。频率建议1-2秒检查一次,太频繁会浪费CPU。

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 实际项目中的网络配置策略

最后,分享一个我常用的「双模式启动策略」:

  1. 上电后先尝试连接上次保存的WiFi(用Preferences库保存SSID和密码)
  2. 如果10秒内连不上,自动开启AP模式,热点名称为"ESP32_配置_设备MAC后6位"
  3. 用户通过手机连上热点,访问192.168.4.1,在网页里输入新的WiFi信息
  4. 保存配置,重启,用新配置连接路由器

这套流程,说白了就是让设备永远有「后路」。连不上网?没关系,我开个热点让你来配。配好了?我重启连路由器。再连不上?我继续开热点等你。

嗯,这才是物联网设备该有的样子——不依赖人工干预,自己能搞定大部分问题。

总结一下:Station模式是常态,AP模式是退路,状态监测是眼睛,重连机制是手脚。四者配合,才能打造一个「打不死」的ESP32网络连接系统。