3、Wi-Fi与网络基础:ESP32连接Wi-Fi、HTTP/HTTPS协议简介、TCP/IP协议栈、网络调试工具使用
好,咱们进入第三章。这一章是OTA升级的「通信基石」。你想想看,如果Wi-Fi都连不上,或者HTTP请求发不出去,那后面的升级流程全是空谈。
我个人习惯,在开始写任何网络相关的代码之前,先把底层的通信模型理清楚。ESP32虽然集成了Wi-Fi和蓝牙,但它的网络协议栈其实挺复杂的。咱们今天就把这块硬骨头啃下来。
3.1 ESP32连接Wi-Fi:从入门到稳定
ESP32连接Wi-Fi,说白了就是调用几个API。但我在项目中遇到过,很多新手连上Wi-Fi就以为万事大吉了,结果设备运行几个小时就掉线,再也连不回来。
为什么会这样?因为Wi-Fi连接不是一次性的动作,而是一个需要持续维护的状态。
3.1.1 基础连接代码
先看一个最基础的连接示例。嗯,这里要注意,Wi-Fi的SSID和密码最好不要硬编码在代码里,我建议用宏定义或者放在配置文件中。
#include <WiFi.h>
const char* ssid = "Your_SSID";
const char* password = "Your_PASSWORD";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// 你的业务逻辑
}
这段代码看起来简单,但有个大坑:while循环会阻塞程序。如果Wi-Fi一直连不上,你的设备就卡死在这里了。我曾经在一个农业灌溉项目里吃过这个亏,现场Wi-Fi信号弱,设备启动后卡在连接阶段,导致整个灌溉周期都乱了。
3.1.2 带超时和重连机制的连接
我个人习惯用非阻塞方式连接,并且加上自动重连。ESP32的Wi-Fi库其实自带重连功能,但需要正确配置。
#include <WiFi.h>
const char* ssid = "Your_SSID";
const char* password = "Your_PASSWORD";
unsigned long previousMillis = 0;
const long timeout = 10000; // 10秒超时
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.setAutoReconnect(true); // 启用自动重连
WiFi.persistent(true); // 保存Wi-Fi配置到flash
connectToWiFi();
}
void loop() {
// 检查Wi-Fi状态
if (WiFi.status() != WL_CONNECTED) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= timeout) {
Serial.println("Wi-Fi lost, reconnecting...");
WiFi.disconnect();
WiFi.reconnect();
previousMillis = currentMillis;
}
}
// 你的业务逻辑
}
void connectToWiFi() {
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
previousMillis = millis();
}
WiFi.setAutoReconnect(true)这个函数在有些ESP32版本里可能不生效。我建议在loop()里手动检测状态并重连,这样更可靠。
3.2 HTTP/HTTPS协议简介:OTA的传输载体
OTA升级,本质上就是通过HTTP或HTTPS协议下载一个固件文件。你想想看,你的浏览器访问网页用的是HTTP,ESP32下载固件用的也是同样的协议。
3.2.1 HTTP协议的核心
HTTP协议其实很简单,就是「请求-响应」模型。客户端发一个请求,服务器回一个响应。对于OTA来说,我们主要用GET方法去下载固件。
| 方法 | 用途 | OTA场景 |
|---|---|---|
| GET | 获取资源 | 下载固件文件 |
| POST | 提交数据 | 上报设备信息、版本号 |
| HEAD | 获取响应头 | 检查固件是否存在、获取文件大小 |
我记得有一次调试OTA,固件总是下载到一半就断了。后来发现是服务器返回的Content-Length和实际文件大小不一致。嗯,这里要注意,一定要校验这个字段。
3.2.2 HTTPS:安全升级的保障
HTTPS就是HTTP + SSL/TLS加密。为什么OTA要用HTTPS?说白了,就是防止固件在传输过程中被篡改。你想想看,如果有人劫持了你的HTTP请求,给你推送一个恶意固件,那整个设备就沦陷了。
ESP32使用HTTPS需要额外的资源开销:
- 内存消耗: TLS握手需要大约40-60KB的RAM
- Flash占用: 证书和SSL库会占用约100-200KB
- 速度影响: 加密解密会降低下载速度约20-30%
3.3 TCP/IP协议栈:ESP32的网络骨架
ESP32用的是LwIP(Lightweight IP)协议栈。这是一个专门为嵌入式设备设计的轻量级TCP/IP实现。你想想看,你的电脑上跑的是完整的TCP/IP协议栈,而ESP32上跑的是精简版。
3.3.1 LwIP的核心组件
LwIP协议栈主要包含这几个层次:
- 网络接口层: 管理Wi-Fi、以太网等物理接口
- IP层: 负责路由和分片重组
- TCP层: 提供可靠的连接传输
- UDP层: 提供不可靠但快速的传输
- Socket API: 给应用层使用的编程接口
我个人习惯,在调试网络问题时,会先检查LwIP的统计信息。ESP32提供了lwip_stats命令,可以查看内存使用、丢包率等关键指标。
3.3.2 TCP连接管理
TCP连接有三个关键阶段:建立连接(三次握手)、数据传输、断开连接(四次挥手)。对于OTA来说,最怕的就是连接不稳定导致传输中断。
我曾经在项目中遇到过一个问题:ESP32作为客户端,每次下载固件到一半就断开。后来用Wireshark抓包发现,是服务器的Keep-Alive时间设置太短,导致连接被服务器主动关闭。
3.4 网络调试工具使用:实战必备技能
做嵌入式网络开发,光靠串口打印是远远不够的。你需要一些专业的网络调试工具。我个人习惯用这三件套:
3.4.1 Wireshark:网络抓包神器
Wireshark可以捕获并分析网络数据包。对于OTA调试,我主要用它来:
- 检查HTTP请求和响应的完整性
- 分析TLS握手过程
- 查看TCP重传和丢包情况
- 验证固件数据是否完整传输
嗯,这里要注意,Wireshark抓包需要在电脑上开启热点,或者用路由器镜像端口。直接抓ESP32的包比较麻烦。
3.4.2 串口网络调试助手
对于快速验证,我更喜欢用网络调试助手。它可以模拟HTTP服务器,直接返回固件数据。这样就不用每次都部署真正的服务器了。
| 工具名称 | 适用平台 | 主要功能 |
|---|---|---|
| NetAssist | Windows | TCP/UDP收发、HTTP模拟 |
| Hercules | Windows | TCP/UDP/串口调试 |
| socat | Linux/Mac | 命令行网络工具 |
3.4.3 ESP32的调试接口
ESP32本身也提供了一些调试手段:
WiFi.printDiag(Serial):打印Wi-Fi诊断信息esp_log_level_set("*", ESP_LOG_VERBOSE):开启详细日志ping命令:测试网络连通性
好了,这一章的内容就到这里。Wi-Fi连接、HTTP协议、TCP/IP栈、调试工具,这四个知识点是OTA升级的「四梁八柱」。下一章我们会把这些知识串起来,真正开始写OTA升级的代码。