为什么需要 OTA
在物联网产品开发中,设备部署到现场后,固件升级是一个绕不开的问题。你不能指望用户用烧录器一台一台去更新设备。OTA(Over-The-Air)远程升级是解决这个问题的关键手段。
ESP32 OTA 的基本原理
ESP32 的 Flash 存储通常分为以下几个区域:
- Bootloader — 启动引导
- Partition Table — 分区表
- Factory App — 出厂固件
- OTA_0 — OTA 分区 0
- OTA_1 — OTA 分区 1
ESP32 的 OTA 机制依赖于 两个 OTA 分区交替使用。当前运行在 OTA_0 上的固件,下载新固件后写入 OTA_1,校验通过后切换启动分区并重启。
固件端实现
使用 ESP-IDF 框架,OTA 的核心流程如下:
esp_http_client_config_t config = {
.url = "https://windstart.studio/api/ota/download/3",
.cert_pem = server_cert_pem_start,
};
esp_https_ota_config_t ota_config = {
.http_config = &config,
};
esp_err_t ret = esp_https_ota(&ota_config);
if (ret == ESP_OK) {
esp_restart();
}
版本检查
在实际项目中,通常先检查是否有新版本再决定是否下载:
// 1. 检查是否有新固件
cJSON *resp = http_get_json("https://windstart.studio/api/ota/check?"
"device_id=esp32_001&device_type=esp32¤t_version=1.0.0");
bool update_available = cJSON_GetObjectItem(resp, "update_available")->valueint;
if (update_available) {
const char *url = cJSON_GetObjectItem(resp, "url")->valuestring;
// 2. 下载固件
esp_https_ota_from_url(url);
}
服务端架构
服务端使用 Python Flask + SQLite 实现:
- 固件存储:固件文件存在服务器磁盘,数据库记录版本信息
- 设备管理:设备首次请求时自动注册
- 版本对比:语义化版本号对比,只推送更新的版本
- 安全传输:HTTPS 加密通信,固件完整性校验
注意事项
- HTTPS 证书:ESP32 需要内置 CA 证书或使用自定义证书
- 断点续传:大固件建议实现 HTTP Range 分段下载
- 回滚机制:保留上一个正常工作版本的固件
- 签名校验:建议对固件做签名,防止篡改
后续我会更新 STM32 + 4G 模块的 OTA 方案,欢迎关注。