名称: 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: 引导加载程序专家代理