WiFi 连接上网实战
📅 2026-05-06 · 📂 硬件编程 · ⏱ 阅读约 5 分钟
概述
ESP32 的灵魂能力就是 WiFi。本篇教你用三种模式连接网络:Station 模式(连路由器)、AP 模式(自己当热点)、STA+AP 混合模式。掌握 WiFi 是后续所有物联网项目的基础。
学习目标:理解 WiFi 工作模式,掌握 WiFi 库基本 API,学会处理断线重连。
物料清单
- ESP32 开发板 ×1
- WiFi 路由器(2.4GHz)
- USB 数据线
不需要额外硬件!ESP32 内置 2.4GHz WiFi 模组。注意:ESP32 不支持 5GHz WiFi。
三种 WiFi 模式
| 模式 | 说明 | 典型场景 |
| STA (Station) | 连接到路由器,获取 IP | 上传数据到云端、请求 API |
| AP (Access Point) | 自己创建热点,其他设备连接 | 本地配置页面、离线控制 |
| STA+AP | 同时连接路由器+创建热点 | 一边上网一边提供本地服务 |
实战一:Station 模式 — 连接路由器
// WiFi_Station.ino — 连接到家庭 WiFi
#include <WiFi.h>
const char* ssid = "你的WiFi名";
const char* password = "你的WiFi密码";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA); // 设为Station模式
WiFi.begin(ssid, password); // 开始连接
Serial.print("正在连接");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("
✓ 连接成功!");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
Serial.printf("信号强度: %d dBm
", WiFi.RSSI());
}
void loop() {
static unsigned long lastCheck = 0;
if (millis() - lastCheck > 10000) {
lastCheck = millis();
Serial.printf("WiFi状态: %d, RSSI: %d
", WiFi.status(), WiFi.RSSI());
}
}
实战二:AP 模式 — 自己做热点
// WiFi_AP.ino — 创建自己的 WiFi 热点
#include <WiFi.h>
const char* ap_ssid = "ESP32_Hotspot";
const char* ap_password = "12345678"; // 至少8位
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP);
WiFi.softAP(ap_ssid, ap_password);
Serial.println("✓ 热点已创建");
Serial.print("SSID: ");
Serial.println(ap_ssid);
Serial.print("IP: ");
Serial.println(WiFi.softAPIP()); // 默认 192.168.4.1
Serial.printf("已连接设备: %d
", WiFi.softAPgetStationNum());
}
void loop() {
static int lastCount = 0;
int count = WiFi.softAPgetStationNum();
if (count != lastCount) {
Serial.printf("连接设备数: %d → %d
", lastCount, count);
lastCount = count;
}
delay(2000);
}
断线自动重连(生产级)
// WiFi 断线自动重连 — 生产环境必备
#include <WiFi.h>
void WiFi_Reconnect() {
static unsigned long lastAttempt = 0;
if (WiFi.status() != WL_CONNECTED) {
if (millis() - lastAttempt > 30000) { // 每30秒重试
lastAttempt = millis();
Serial.println("WiFi 断开,尝试重连...");
WiFi.disconnect();
WiFi.reconnect();
}
}
}
void WiFiEvent(WiFiEvent_t event) {
switch (event) {
case SYSTEM_EVENT_STA_GOT_IP:
Serial.println("✓ WiFi已连接");
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("✗ WiFi断开");
break;
}
}
void setup() {
Serial.begin(115200);
WiFi.onEvent(WiFiEvent); // 注册事件回调
WiFi.begin(ssid, password);
}
void loop() {
WiFi_Reconnect();
// 你的业务代码...
}
常见问题
⚠️ 仅支持 2.4GHz:ESP32 不支持 5GHz WiFi。如果你的路由器开启了"双频合一",可能导致连接失败。建议给 2.4GHz 单独命名 SSID。
⚠️ WiFi.begin 阻塞:默认 WiFi.begin() 会阻塞直到连接成功或超时(约 30 秒)。上电后整个 setup() 会卡住。可用 WiFi.setAutoReconnect(true) 让底层自动重连。
💡 信号强度:RSSI > -50 dBm 为优秀,-50~-70 良好,-70~-80 一般,< -80 不稳定。天线朝向和金属外壳都会影响信号。
💡 省电策略:WiFi 是 ESP32 最大的耗电来源(~100mA)。电池供电项目可在不通信时 WiFi.mode(WIFI_OFF) 关闭 WiFi,唤醒后再打开。
延伸练习
- WiFi 扫描:
WiFi.scanNetworks() 打印周围所有 WiFi 的 SSID 和信号强度
- 智能配网:用 SmartConfig 或网页配网,避免硬编码密码
- 获取网络时间:
configTime() 从 NTP 服务器同步当前时间