4. SoftAP配网实战

SoftAP(Soft Access Point)配网是 ESP32 最经典、最可靠的本地配网方式之一。它的核心思路是:设备在未联网时主动变成一个 Wi-Fi 热点,手机连接该热点后,通过浏览器访问设备内置的 Web 页面,把目标路由器的 SSID 和密码提交给 ESP32,设备再以 STA 模式连接目标路由器,最后把结果反馈给手机。整个过程不依赖任何外部服务器,适合首次上电、无屏设备、售后现场等场景。

本节围绕四个关键环节展开:AP 模式配置、Web 服务器搭建、手机连接与参数提交、配网结果反馈。理解这四步之间的数据流和状态切换,是写出稳定配网代码的基础。

一、核心原理:AP 与 STA 的共存与切换

ESP32 的 Wi-Fi 模块支持 AP、STA 以及 AP+STA 共存三种模式。SoftAP 配网通常采用“先 AP,后 STA”的策略:设备启动后进入 AP 模式,广播一个固定 SSID(如 ESP32_Config),手机连接后获得由 ESP32 分配的 IP(默认网关通常是 192.168.4.1)。此时手机与 ESP32 处于同一局域网,浏览器访问 http://192.168.4.1 即可打开配网页面。

当用户提交 SSID 和密码后,ESP32 调用 WiFi.begin(ssid, password) 尝试连接目标路由器。若连接成功,设备获得路由器分配的 IP,并可通过 mDNS 或固定 IP 被访问;若失败,则回到 AP 模式等待重新提交。这里的关键是:AP 与 STA 不能同时使用同一信道冲突,实际开发中常采用“提交后关闭 AP、切换 STA”或“AP+STA 共存但以 STA 为主”两种方案。

SoftAP 配网:数据流与状态切换 手机 / 浏览器 连接 ESP32_Config 访问 192.168.4.1 填写 SSID / 密码 ESP32(AP 模式) SSID: ESP32_Config IP: 192.168.4.1 WebServer:80 DNS 劫持 / 表单处理 NVS 保存凭据 目标路由器 SSID: Home_WiFi 分配 STA IP 提供互联网出口 HTTP GET / 返回配网页面 WiFi.begin() 连接结果 状态机 ① AP 广播 ② 页面提交 ③ STA 连接 ④ 结果反馈

二、AP 模式配置:从热点到可访问服务

AP 模式配置的核心是设置热点参数并启动服务。典型代码如下:

#include <WiFi.h>
#include <WebServer.h>

const char* AP_SSID = "ESP32_Config";
const char* AP_PASS = "12345678";   // 至少 8 位
WebServer server(80);

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_SSID, AP_PASS);
  Serial.print("AP IP: ");
  Serial.println(WiFi.softAPIP());   // 192.168.4.1

  server.on("/", handleRoot);
  server.on("/submit", HTTP_POST, handleSubmit);
  server.begin();
}

void loop() {
  server.handleClient();
}

这里有几个容易忽略的细节:第一,WiFi.softAP() 的密码长度必须为 8~63 位,否则热点启动失败;第二,AP 的 IP 默认是 192.168.4.1,但可以通过 WiFi.softAPConfig() 自定义;第三,若设备同时需要 STA 连接,建议使用 WIFI_AP_STA 模式,避免切换时服务中断。

三、Web 服务器搭建:表单与路由设计

Web 服务器负责向手机返回配网页面,并接收表单提交。页面通常包含 SSID 输入框、密码输入框和提交按钮。为了提升体验,可以扫描周围 Wi-Fi 并以下拉列表展示:

String page = "<form action='/submit' method='POST'>"
  "SSID: <input name='ssid'><br>"
  "PASS: <input name='pass' type='password'><br>"
  "<input type='submit' value='连接'></form>";

void handleRoot() {
  server.send(200, "text/html", page);
}

void handleSubmit() {
  String ssid = server.arg("ssid");
  String pass = server.arg("pass");
  // 保存到 NVS,并尝试连接
  WiFi.begin(ssid.c_str(), pass.c_str());
  server.send(200, "text/html", "正在连接,请稍候...");
}

路由设计上,建议至少提供 /(配网页)、/submit(提交处理)、/status(查询连接状态)三个端点。若使用 ESPAsyncWebServer,还能支持 WebSocket 实时推送状态,避免手机反复刷新。

四、手机连接与参数提交:真实场景与常见问题

手机连接 ESP32_Config 后,部分系统会提示“无互联网连接”,这是正常现象,因为该热点没有外网出口。用户需要手动选择“保持连接”。随后在浏览器输入 192.168.4.1,若无法打开,常见原因包括:手机自动切换回移动数据、浏览器使用了 HTTPS 强制跳转、或 ESP32 的 Web 服务未启动。

建议在配网页面顶部加一句提示:“本热点仅用于配置,连接后请忽略‘无互联网’提示,并在浏览器访问 192.168.4.1。”这能显著降低用户困惑。

五、配网结果反馈:让用户知道成功还是失败

提交后,ESP32 需要把连接结果反馈给手机。最简单的方式是在 /submit 返回一个“正在连接”页面,然后通过 /status 轮询或 WebSocket 推送最终结果。反馈内容应包含:目标 SSID、连接状态(成功/失败)、获取到的 IP、失败原因(密码错误、超时、未找到 AP)。

反馈状态 触发条件 建议提示
连接中 已调用 WiFi.begin() 正在连接,请勿关闭页面
成功 WL_CONNECTED 配网成功,IP: 192.168.x.x
密码错误 WL_CONNECT_FAILED 密码错误,请重新输入
未找到 AP WL_NO_SSID_AVAIL 未找到该 Wi-Fi,请确认名称
超时 超过 15 秒未连接 连接超时,请检查信号强度

六、误区与复盘

  • 误区一:AP 密码留空。部分手机无法连接开放热点,建议至少设置 8 位密码。
  • 误区二:提交后立即关闭 AP。若 STA 连接失败,手机将无法收到反馈,也无法重新配网。建议先反馈结果,再决定是否关闭 AP。
  • 误区三:不保存凭据。配网成功后应将 SSID 和密码写入 NVS,下次上电直接尝试 STA 连接,失败后再启动 AP。
  • 误区四:忽略 DNS 劫持。部分手机访问 192.168.4.1 不便,可启动 DNSServer 把所有域名解析到 AP IP,实现“连上即弹窗”。
配网页面涉及 Wi-Fi 密码明文传输,虽然处于本地热点,仍建议在页面上提示用户“仅在可信环境下操作”,并在保存后对密码做基本校验,避免空密码或超长字符串导致 NVS 写入异常。

整体来看,SoftAP 配网的稳定性取决于三个关键点:AP 热点参数正确、Web 服务路由完整、状态反馈及时。把这三点做好,手机端体验会非常顺畅,也为后续远程诊断和 OTA 升级打下基础。