为什么需要 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&current_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 加密通信,固件完整性校验

注意事项

  1. HTTPS 证书:ESP32 需要内置 CA 证书或使用自定义证书
  2. 断点续传:大固件建议实现 HTTP Range 分段下载
  3. 回滚机制:保留上一个正常工作版本的固件
  4. 签名校验:建议对固件做签名,防止篡改

后续我会更新 STM32 + 4G 模块的 OTA 方案,欢迎关注。