OTA 固件升级
这篇解决什么
固件包怎么入库、任务怎么圈设备、离线设备为什么一直待推送。读完能对上 iot_ota_firmware / iot_ota_task / iot_ota_task_record 和 XXL Job deviceUpgradeJob。
下行 method 是 thing.ota.upgrade,设备回进度用 thing.ota.progress。产品、设备先看 产品管理 和 设备管理。
示意图:任务拆成每设备一条记录。Job 只推 PENDING 且设备在线的记录。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 固件 API | /iot/ota/firmware | ruoyi-office/yudao-module-iot/yudao-module-iot-server/.../IotOtaFirmwareController.java |
| 任务 API | /iot/ota/task,创建 / 取消 | IotOtaTaskController.java |
| 记录 API | /iot/ota/task/record | IotOtaTaskRecordController.java |
| 推送 Job | XXL deviceUpgradeJob,多租户 | IotOtaUpgradeJob |
| 前端 | 固件、任务、记录 | ruoyi-office-vben/apps/web-antd/src/views/iot/ota/ |
固件挂 productId,带 fileUrl / fileSize。签名字段 fileDigestAlgorithm 目前按 MD5 写 fileDigestValue。不要把阿里云帮助页抄进业务代码注释当接口文档。
任务状态 IotOtaTaskStatusEnum:进行中 10、已结束 20、已取消 30。设备范围 IotOtaTaskDeviceScopeEnum:全部 1(只含当前产品已有设备,不含以后新建的)、指定 2。deviceTotalCount / deviceSuccessCount 在任务上汇总。
记录状态:待推送 0、已推送 10、升级中 20、成功 30、失败 40、取消 50。progress 是百分比。description 只留设备最后一次说明,历史看设备消息。批量取消文案在 DESCRIPTION_CANCEL_BY_TASK。
Job 查出 PENDING 记录后,设备不在线就跳过,等下次调度。推送成功后走 pushOtaTaskRecord,给设备带上固件 URL 和摘要。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
version / fileUrl | 版本与文件 | IotOtaFirmwareDO |
deviceScope | 全部或指定 | IotOtaTaskDO |
fromFirmwareId | 升级前设备上的固件 | IotOtaTaskRecordDO |
status / progress | 单设备进度 | IotOtaTaskRecordDO |
离线不会自动改失败
当前实现跳过离线设备,记录保持 PENDING。任务看起来一直进行中是预期行为,不是 Job 没配。
进度上报不要等平台回包
thing.ota.progress 在 REPLY_DISABLED 里。设备报进度后平台更新记录,不再回 reply。
@RequestMapping("/iot/ota/firmware")
public class IotOtaFirmwareController { }
@TableName(value = "iot_ota_firmware", autoResultMap = true)
public class IotOtaFirmwareDO extends BaseDO { }配置与操作
走 views/iot/ota/:先上传固件挂 productId + fileUrl,再建任务选范围(全部 1 只含当前已有设备,指定 2)。推送靠 XXL deviceUpgradeJob,只推 PENDING 且在线的记录。离线保持待推送,任务一直进行中是预期。详情路由 activePath 写的是 /iot/operation/ota/firmware。客户 dump 没有独立 OTA 菜单行。
下行 thing.ota.upgrade,进度 thing.ota.progress 不回 reply。开启见 IoT 功能设计。

本系统截图:产品页。OTA 挂 productId;客户 dump 没有独立固件菜单。
