OTA固件更新技能Skill ota-firmware-update

OTA固件更新技能是嵌入式系统开发中的核心技术,专注于实现安全可靠的空中固件更新解决方案。该技能涵盖差分更新生成、镜像签名加密、A/B分区管理、MCUboot配置、自动回滚机制以及云平台集成等关键功能。适用于物联网设备、嵌入式系统、智能硬件等领域的远程固件升级需求,确保设备安全、高效地完成固件更新,支持AWS IoT、Azure IoT Hub等主流云平台集成。

嵌入式软件 3 次安装 81 次浏览 更新于 2/25/2026

名称: ota-firmware-update 描述: 嵌入式系统空中固件更新实现专业知识。具备差分更新、镜像签名、更新协议、分区管理和回滚机制的专家技能。 允许工具: Read, Grep, Write, Edit, Bash, Glob, WebFetch, WebSearch

OTA固件更新技能

嵌入式系统中空中固件更新实现的专家技能。提供更新镜像生成、签名、传输协议、分区管理和回滚机制的专业知识。

概述

OTA固件更新技能提供全面的固件更新能力:

  • 差分更新生成(差异算法)
  • 镜像签名和加密
  • 更新清单生成
  • MCUboot配置
  • A/B分区管理
  • 回滚机制实现
  • 云集成(AWS IoT、Azure IoT Hub)
  • 更新进度和状态报告

能力

1. 更新镜像生成

生成带元数据的固件更新镜像:

// 示例:更新镜像生成配置
const imageConfig = {
  type: 'full',  // 或 'delta'
  input: 'build/firmware.bin',
  output: 'release/firmware-v1.2.0.update',
  version: {
    major: 1,
    minor: 2,
    patch: 0,
    build: 456
  },
  compression: 'lz4',  // none, lz4, zlib, lzma
  encryption: {
    algorithm: 'aes-128-ctr',
    keyFile: 'keys/update-key.bin'
  }
};

2. 镜像签名

为安全启动链签名固件镜像:

# 使用MCUboot imgtool签名镜像
imgtool sign \
  --key keys/signing-key.pem \
  --align 4 \
  --version 1.2.0 \
  --header-size 0x200 \
  --slot-size 0x60000 \
  --pad-header \
  build/firmware.bin \
  release/firmware-v1.2.0-signed.bin

# 验证签名
imgtool verify \
  --key keys/signing-key.pub.pem \
  release/firmware-v1.2.0-signed.bin

3. 差分更新生成

生成差异更新以最小化传输大小:

// 差分更新配置
const deltaConfig = {
  baseVersion: 'v1.1.0',
  baseImage: 'releases/firmware-v1.1.0.bin',
  targetImage: 'build/firmware.bin',
  algorithm: 'bsdiff',  // bsdiff, xdelta, vcdiff
  output: 'patches/v1.1.0-to-v1.2.0.patch',
  metadata: {
    sourceVersion: '1.1.0',
    targetVersion: '1.2.0',
    sourceHash: 'sha256:...',
    targetHash: 'sha256:...'
  }
};

// 大小比较
// 完整镜像: 245,760 字节
// 差分补丁: 12,340 字节 (减少95%)

4. 更新清单生成

生成带元数据的更新清单:

{
  "version": "1.2.0",
  "build": 456,
  "timestamp": "2026-01-24T10:30:00Z",
  "images": [
    {
      "slot": "primary",
      "type": "application",
      "file": "firmware-v1.2.0-signed.bin",
      "size": 245760,
      "hash": {
        "algorithm": "sha256",
        "value": "3b9d8a2f..."
      },
      "signature": {
        "algorithm": "ecdsa-p256",
        "value": "base64..."
      }
    }
  ],
  "compatibility": {
    "minBootloaderVersion": "1.0.0",
    "hardwareRevision": ["rev-a", "rev-b"],
    "requiredBaseVersion": "1.1.0"
  },
  "delta": {
    "available": true,
    "baseVersions": ["1.1.0", "1.0.0"],
    "files": {
      "1.1.0": "patches/v1.1.0-to-v1.2.0.patch"
    }
  },
  "releaseNotes": "错误修复和性能改进"
}

5. 分区管理(A/B方案)

配置A/B分区方案以实现安全更新:

/**
 * @brief A/B更新的闪存分区布局
 *
 * 分区       | 起始地址   | 大小    | 用途
 * ------------|------------|---------|------------------
 * Bootloader  | 0x08000000 | 32KB    | MCUboot引导加载程序
 * Slot A      | 0x08008000 | 240KB   | 主应用程序
 * Slot B      | 0x08044000 | 240KB   | 次要/暂存区
 * Scratch     | 0x08080000 | 64KB    | 交换暂存区
 * Config      | 0x08090000 | 16KB    | 持久配置
 */

typedef struct {
    uint32_t magic;           // 分区魔数
    uint8_t  image_ok;        // 镜像确认工作正常
    uint8_t  copy_done;       // 交换操作完成
    uint16_t swap_type;       // 无、测试、恢复、永久
    uint32_t version;         // 固件版本
    uint32_t crc32;           // 镜像CRC
} partition_header_t;

6. MCUboot集成

配置MCUboot以实现安全固件更新:

# MCUboot配置(Zephyr的prj.conf)
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_MCUBOOT_SIGNATURE_KEY_FILE="keys/signing-key.pem"
CONFIG_MCUBOOT_ENCRYPTION_KEY_FILE="keys/encryption-key.pem"
CONFIG_MCUBOOT_EXTRA_IMGTOOL_ARGS="--pad --confirm"

# 镜像配置
CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION="1.2.0"
CONFIG_MCUBOOT_GENERATE_UNSIGNED_IMAGE=n
CONFIG_MCUBOOT_GENERATE_CONFIRMED_IMAGE=y

# 更新设置
CONFIG_MCUBOOT_SWAP_USING_SCRATCH=y
CONFIG_IMG_MANAGER=y
CONFIG_STREAM_FLASH=y

7. 回滚机制

在更新失败时实现自动回滚:

/**
 * @brief 固件更新状态机
 */
typedef enum {
    UPDATE_STATE_IDLE,           // 无更新进行中
    UPDATE_STATE_DOWNLOADING,    // 接收更新镜像
    UPDATE_STATE_VERIFYING,      // 验证签名/哈希
    UPDATE_STATE_APPLYING,       // 写入闪存
    UPDATE_STATE_PENDING_REBOOT, // 准备启动新镜像
    UPDATE_STATE_TESTING,        // 运行新镜像(未确认)
    UPDATE_STATE_CONFIRMED,      // 更新成功
    UPDATE_STATE_REVERTING,      // 回滚到先前版本
    UPDATE_STATE_FAILED          // 更新失败
} update_state_t;

/**
 * @brief 成功启动后确认更新
 *
 * 必须在新的固件成功启动后调用。
 * 在超时时间内未能确认将触发自动回滚。
 *
 * @param timeout_ms  确认超时(毫秒)
 * @return 成功时返回OTA_OK,否则返回错误代码
 */
ota_status_t ota_confirm_update(uint32_t timeout_ms);

/**
 * @brief 手动触发回滚到先前版本
 *
 * @return 如果回滚已启动则返回OTA_OK,否则返回错误
 */
ota_status_t ota_rollback(void);

8. 云集成

与物联网云平台集成:

// AWS IoT Jobs集成
const jobDocument = {
  operation: 'firmware-update',
  version: '1.2.0',
  files: {
    firmware: {
      url: 'https://firmware.s3.amazonaws.com/v1.2.0/firmware.bin',
      fileType: 'binary',
      size: 245760,
      sha256: '3b9d8a2f...'
    }
  },
  autoReboot: true,
  confirmationRequired: true
};

// Azure IoT Hub设备孪生更新
const desiredProperties = {
  firmware: {
    version: '1.2.0',
    downloadUrl: 'https://blob.azure.com/firmware/v1.2.0.bin',
    checksum: 'sha256:3b9d8a2f...',
    updateTime: '2026-01-24T12:00:00Z'
  }
};

流程集成

此技能与以下流程集成:

流程 集成点
ota-firmware-update.js 主要的OTA实现
secure-boot-implementation.js 安全更新链
bootloader-implementation.js 引导加载程序集成

工作流程

1. 设置更新基础设施

# 生成签名密钥
imgtool keygen -k keys/signing-key.pem -t ecdsa-p256

# 提取设备的公钥
imgtool getpub -k keys/signing-key.pem > keys/signing-key.pub.pem

# 生成加密密钥(可选)
openssl rand -hex 16 > keys/encryption-key.bin

2. 构建更新镜像

# 构建固件
west build -b nrf52840dk_nrf52840 app

# 使用MCUboot签名
west sign -t imgtool \
  -- --key keys/signing-key.pem \
  --version 1.2.0

# 生成清单
ota-tools manifest generate \
  --image build/zephyr/zephyr.signed.bin \
  --output release/manifest.json

3. 部署更新

# 上传到S3(AWS)
aws s3 cp release/ s3://firmware-bucket/v1.2.0/ --recursive

# 创建IoT Job
aws iot create-job \
  --job-id firmware-update-v1.2.0 \
  --targets arn:aws:iot:region:account:thinggroup/devices \
  --document file://job-document.json

4. 监控进度

// 设备端进度报告
const updateStatus = {
  state: 'downloading',
  progress: 45,
  version: '1.2.0',
  details: {
    bytesReceived: 110592,
    totalBytes: 245760,
    downloadSpeed: 12500  // 字节/秒
  }
};

// 报告到云端
mqtt.publish('$aws/things/device-id/jobs/job-id/update',
  JSON.stringify(updateStatus));

输出模式

{
  "updateImage": {
    "file": "firmware-v1.2.0-signed.bin",
    "size": 245760,
    "hash": "sha256:3b9d8a2f...",
    "version": "1.2.0",
    "signed": true,
    "encrypted": false
  },
  "deltaPatches": [
    {
      "fromVersion": "1.1.0",
      "file": "patches/v1.1.0-to-v1.2.0.patch",
      "size": 12340,
      "savings": "95%"
    }
  ],
  "manifest": {
    "file": "manifest.json",
    "timestamp": "2026-01-24T10:30:00Z"
  },
  "deployment": {
    "platform": "aws-iot",
    "jobId": "firmware-update-v1.2.0",
    "targetDevices": 1500
  },
  "artifacts": [
    "firmware-v1.2.0-signed.bin",
    "manifest.json",
    "patches/v1.1.0-to-v1.2.0.patch"
  ]
}

安全考虑

密钥管理

  • 将签名密钥存储在安全的HSM或密钥库中
  • 为开发和生产使用单独的密钥
  • 实施密钥轮换策略
  • 切勿将私钥嵌入固件中

镜像验证

  • 在应用更新前始终验证签名
  • 下载完成后验证哈希
  • 在可用时使用硬件加密加速
  • 实施防回滚保护

传输安全

  • 对所有更新下载使用TLS 1.2+
  • 实施证书固定
  • 验证服务器证书
  • 使用唯一的设备凭据

最佳实践

更新设计

  • 支持差分更新以减少带宽
  • 实施进度报告
  • 处理部分下载(支持恢复)
  • 彻底测试回滚

可靠性

  • 切勿中断闪存操作
  • 对更新计数器使用磨损均衡
  • 实施断电保护
  • 在确认前验证更新

测试

  • 在所有硬件版本上测试
  • 验证回滚场景
  • 在各种网络条件下测试
  • 验证完整的更新生命周期

参考资料

  • MCUboot文档: https://docs.mcuboot.com/
  • AWS IoT Jobs开发者指南
  • Azure IoT Hub设备更新
  • 设备集成的TinyMCP
  • Memfault OTA最佳实践

MCP服务器集成

兼容的MCP服务器:

服务器 用途
tinymcp 通过Golioth进行设备控制
esp-rainmaker-mcp ESP32 RainMaker集成
aws-iot-mcp AWS IoT Jobs管理

另请参阅

  • ota-firmware-update.js - OTA实现流程
  • secure-boot-implementation.js - 安全启动设置
  • bootloader-implementation.js - 引导加载程序开发
  • SK-016: 加密操作技能
  • AG-005: 嵌入式安全专家代理
  • AG-009: 引导加载程序专家代理