OTA升级架构
OTA只传应用镜像,工厂镜像用于空板全片写入,二者不互换。两产品均使用双OTA槽,硬件/容量与构建入口见固件交付。
链路与权限
管理员上传应用→FirmwareStorage校验并私有OSS保存→拥有者或管理员按任务权限创建升级任务→MQTT notify→设备直接HTTPS下载备用槽→校验大小/SHA256/芯片/硬件/版本→重启→本地启动验证→云端任务成功。
分享接收者不能OTA。任务保存拥有者快照,解绑/归属变化后不能用旧任务继续操作。每设备一个活跃任务,任务有效期24小时;重复创建被约束拒绝,重试必须显式且重新校验。小程序只展示高于当前版本的可用更新,用真实任务阶段显示圆形进度;没有OTA专用WS事件,页面有界轮询任务。
通知契约
发布sys/{productId}/{physicalId}/thing/ota/notify,下例URL、哈希和时间为结构示意,必须由真实固件元数据/短期签名替换:
{"taskId":"99999999-9999-4999-8999-999999999999","expiresAt":1793204100,"productId":"p_relay_4ch","chip":"esp32c3","hardware":"2.1.0","version":"3.2.0-dev.11","url":"https://example.invalid/signed-app.bin","size":1572512,"sha256":"d6d7645e7ce4530cf1b8c580401e2a4e3c5f7016155796feb272b3767c14a20c"}OTA独立契约使用expiresAt而不是控制服务的expiresAtUtc;不需要补入控制epoch/boot字段。任务关联和拥有者快照在云端验证。上行thing/ota/progress按taskId和Topic身份结算,不能由报文覆盖来源设备。完整进度字段及枚举以固件ota_protocol与后端OTA校验实现为准;例如下载中上报如下(taskId须匹配真实任务):
{"taskId":"99999999-9999-4999-8999-999999999999","status":"downloading","progress":40}当前支持继电器esp32c3/2.1.0与传感器esp32/esp32-16mb-v1,不再只有继电器。旧缺哈希/兼容字段包不自动可用,EnvSense1.3.4历史坏包禁止推荐/下载/下发;旧Release保留而不覆盖附件。
下载与启动
数据库保存对象key而非长期公开URL。每次通知取得约15分钟HTTPS签名,设备直接下载;保留完整证书与主机名校验,OSS交叉链需IDF交叉签名bundle支持。镜像SHA256按实际字节校验,不用旧md5元数据替代。
只有新应用实际通过启动验证才标有效;未启动、启动失败或校验超时可回旧槽并报告rolled_back。EnvSense曾因采集等待MQTT阻塞验证,现启动顺序已调整。成功升级记录不等于所有故障/掉电场景都验证;专项在组合加固中继续维护。
本平台不提供差分、断点续传、批量灰度、强制升级或跨设备场景任务。正式硬件Release与OSS稳定目录登记另走交付流程,不因源码提交或平台发版自动下发OTA。
