文档版本: dev
通过 SDK 升级固件¶
适用设备
本文档适用于 OpenZilo Q。
使用 Python SDK 发送官方应用固件包,并在设备重启后核对版本。先查询设备功能;固件下载和设备操作见固件升级指南。
以下代码片段使用 import openzilo as sdk;ring 表示已连接的客户端,完整连接示例见快速开始。
固件升级¶
升级要求
使用官方发行说明指定的 OTA 升级包,并核对设备型号、硬件版本和当前固件版本。SDK 只升级应用固件,不升级引导程序(bootloader)。
update_firmware() 和 ota-update 提供应用固件升级;可通过 openzilo ota-update --help 检查当前安装的命令。它们只处理应用固件升级,不升级 bootloader。升级包需来自官方发布说明,并明确兼容设备型号和起始版本。升级前备份重要录音,停止录音、下载与 IMU 上报,保持电量和连接稳定;调用期间该连接由升级操作独占。
固件打包生成带完整版本号的 ring_sound-V2.001.0002.0001-prod-1234abcd.ota.zip,包含 manifest.json、manifest.sig 和 app.ota.bin。清单携带版本、型号、板型、测试或生产配置、安全版本、允许的起始版本,以及内部 OTA 的大小和 SHA-256。外层可复用固件的 P-256 签名密钥;SDK 仅使用通过独立可信渠道取得的公钥,不能直接信任下载包附带的公钥。
from pathlib import Path
bundle = Path("ring_sound-V2.001.0002.0001-prod-1234abcd.ota.zip").read_bytes()
public_key = Path("trusted-signing-public.pem").read_bytes()
metadata = sdk.inspect_firmware_bundle(bundle, trusted_public_key=public_key)
print(metadata.version, metadata.model, metadata.board)
async with sdk.OpenZiloClient(address=ADDRESS) as ring:
info = await sdk.update_firmware(ring, bundle, trusted_public_key=public_key)
离线展示全部已验证元数据,无需连接戒指:
openzilo ota-inspect ring_sound-V2.001.0002.0001-prod-1234abcd.ota.zip --public-key trusted-signing-public.pem
# 加上 --json 可供程序读取
inspect_firmware_bundle() 返回的 FirmwareBundle.manifest 是完整已验证清单的字典副本。验签失败时命令返回失败,不输出成功标记。验签通过说明来源和完整性有效;设备适配仍需在发送前检查。
openzilo ota-update --address ADDRESS ring_sound-V2.001.0002.0001-prod-1234abcd.ota.zip --public-key trusted-signing-public.pem
板型比较会忽略重复的 /,以兼容 Zephyr qualifiers 自带前导斜杠的写法。展示和验签仍保留原始元数据。
离线检查包括签名、归档结构、长度、摘要和加密头。发送 OTA 前,SDK 核对设备型号、板型和起始版本。source_versions=[] 表示不限制起始版本。测试包需显式传入 allow_test_firmware=True 或 --allow-test-firmware。设备无法报告板型时,只能使用 SDK 已核实的精确旧构建配置;目前覆盖 Open Zilo 的 V2.001.0002.0001-prod-7fd1dfc9,其板型取自对应交付元数据,其他未知板型拒绝升级。安全版本和加密密钥匹配仍由设备检查,SDK 不解密,也不能读取防回滚计数。校验后只传输内部 OTA 字节,重启后继续核对完整运行版本。
OTA 接口只接受签名 ZIP,拒绝原始 BIN。目标版本和适配字段来自已验签的元数据,不再接受手填 version、sha256 或 expected_model。重启后精确比较完整运行版本,包括 debug/prod 和提交后缀;设备已运行目标版本时拒绝重复升级。完整示例见 update_firmware.py。
| 参数 | 含义 |
|---|---|
client / firmware |
已连接的客户端与完整升级包字节。 |
trusted_public_key |
ZIP 必填的可信 PEM P-256 公钥字节。 |
allow_test_firmware=False |
是否显式允许测试配置 ZIP。 |
progress=None |
同步回调 (sent, total),单位字节;只反映传输进度。设备请求续传时可能跳过已接收的前缀。 |
timeout_s=30.0 |
单次设备检查、传输或重连操作的超时。 |
total_timeout_s=600.0 |
升级前的设备检查和传输阶段的总上限。 |
reboot_timeout_s=90.0 |
传输确认之后,等待重启、重连和版本核验的总上限。 |
返回 SystemInfo,来源于设备重启并重连后的查询。SDK 确认设备没有变化、固件版本符合目标后才成功返回;进度到达 100% 或蓝牙断开都不表示升级成功。设备拒绝升级时抛出 DeviceError;超时、通信中断或异常响应分别通过 TimeoutError、TransportError 或 ProtocolError 报告。取消操作不会撤销设备已收到的升级包,失败后应重连读取版本确认状态。
官方发布信息、失败处理见 固件升级指南。