- MCU 升级:模组只原样转发,不存 MCU 固件 - 模组自己升级:写到备用区,校验通过后再切过去,成功回 0x34,等 APP 回 0x35 再重启 - 升模组时先通知 MCU 先别上报;升的过程中不跑心跳、不处理普通控制 - 关掉原来的 JSON OTA,改走这条协议
467 lines
5.4 KiB
Markdown
467 lines
5.4 KiB
Markdown
# OTA升级流程
|
||
|
||
# 修订记录
|
||
|
||
|文档版本|日期|编写人|修订类型|修订内容|
|
||
|---|---|---|---|---|
|
||
|V1\.0\.0|2026\-07\-09|麦田|新建|首次发布OTA升级流程文档|
|
||
|
||
# APP获取设备版本
|
||
|
||
设备连接服务器后,主动上报当前版本给服务器,服务器进行维护。
|
||
|
||
服务器维护:
|
||
|
||
|**字段**|**说明**|
|
||
|---|---|
|
||
|固件类型|BLE / MCU |
|
||
|固件版本|当前版本号|
|
||
|
||
APP进入设备页面后,找服务器获取当前固件版本。
|
||
|
||
服务器返回:
|
||
|
||
```Plain Text
|
||
MCU固件
|
||
当前版本:V1.0.0
|
||
|
||
BLE固件
|
||
当前版本:V2.0.0
|
||
```
|
||
|
||
---
|
||
|
||
# 服务器推送OTA版本给APP
|
||
|
||
用户在服务器上传了bin文件,并填写了版本号和固件类型,点击发布。APP进入设备页面之后,服务器推送OTA文件信息给APP。
|
||
|
||
服务器推送:
|
||
|
||
```Plain Text
|
||
MCU固件
|
||
OTA版本:V1.2.0
|
||
长度:128KB
|
||
CRC32:0x12345678
|
||
|
||
BLE固件
|
||
OTA版本:V2.0.1
|
||
长度:256KB
|
||
CRC32:0x87654321
|
||
```
|
||
|
||
# APP进行版本比较
|
||
|
||
APP比较:
|
||
|
||
```Plain Text
|
||
OTA版本 VS 设备当前版本
|
||
```
|
||
|
||
例如:
|
||
|
||
|**固件**|**当前版本**|**OTA版本**|**是否升级**|
|
||
|---|---|---|---|
|
||
|MCU|V1\.0\.0|V1\.2\.0|是|
|
||
|BLE|V2\.0\.0|V2\.0\.1|是|
|
||
|
||
如果两个固件都需要升级:
|
||
|
||
升级顺序:
|
||
|
||
```Plain Text
|
||
第一步:MCU升级
|
||
第二步:BLE升级
|
||
```
|
||
|
||
避免 BLE 升级过程中影响 MCU OTA 通讯。
|
||
|
||
---
|
||
|
||
# APP通知BLE准备OTA
|
||
|
||
APP发送**OTA升级请求**告诉 BLE 本次升级目标。
|
||
|
||
例如升级 MCU:
|
||
|
||
```Plain Text
|
||
Target:MCU
|
||
Firmware Version:V1.2.0
|
||
Payload Length:128KB
|
||
Payload CRC32:xxxx
|
||
```
|
||
|
||
---
|
||
|
||
# BLE判断升级目标
|
||
|
||
BLE收到:**OTA升级请求**
|
||
|
||
进行固件类型判断:
|
||
|
||
## 情况1:升级BLE
|
||
|
||
流程:
|
||
|
||
```Plain Text
|
||
APP
|
||
|
|
||
| OTA升级请求
|
||
|
|
||
BLE
|
||
|
|
||
| 自身检查
|
||
|
|
||
BLE返回准备结果
|
||
```
|
||
|
||
检查:
|
||
|
||
- Flash空间
|
||
|
||
- OTA状态
|
||
|
||
- 固件信息
|
||
|
||
返回:OTA请求应答
|
||
|
||
成功:
|
||
|
||
```Plain Text
|
||
Result = 0x00
|
||
Max Data Length = xxx
|
||
```
|
||
|
||
然后APP开始发送BLE Bin。
|
||
|
||
---
|
||
|
||
## 情况2:升级MCU
|
||
|
||
流程:
|
||
|
||
```Plain Text
|
||
APP
|
||
↓
|
||
BLE
|
||
↓
|
||
MCU
|
||
```
|
||
|
||
BLE收到后:
|
||
|
||
提取:
|
||
|
||
- Firmware Version
|
||
|
||
- Payload Length
|
||
|
||
- Payload CRC32
|
||
|
||
发送:
|
||
|
||
```Plain Text
|
||
BLE
|
||
|
|
||
| OTA升级请求
|
||
↓
|
||
MCU
|
||
```
|
||
|
||
---
|
||
|
||
# MCU检查OTA条件
|
||
|
||
MCU收到升级请求。
|
||
|
||
检查:
|
||
|
||
1. 固件版本 :新版本 \> 当前版本
|
||
|
||
2. Flash空间
|
||
|
||
3. OTA状态 返回:OTA请求应答
|
||
|
||
结果:
|
||
|
||
|**Result**|含义|
|
||
|---|---|
|
||
|0x00|允许升级|
|
||
|0x20|无需升级(版本一致)|
|
||
|0x21|OTA 版本低于当前版本|
|
||
|0x22|Flash 空间不足|
|
||
|0x23|Bootloader 不支持|
|
||
|0x24|OTA 状态错误|
|
||
|0x25|固件类型不支持|
|
||
|
||
同时返回:
|
||
|
||
```Plain Text
|
||
Max Data Length
|
||
```
|
||
|
||
例如:
|
||
|
||
```Plain Text
|
||
512 Byte
|
||
```
|
||
|
||
---
|
||
|
||
# APP发送OTA Bin数据
|
||
|
||
APP按照:
|
||
|
||
```Plain Text
|
||
Max Data Length
|
||
```
|
||
|
||
进行分包。
|
||
|
||
例如:
|
||
|
||
MCU允许:
|
||
|
||
```Plain Text
|
||
512 Byte
|
||
```
|
||
|
||
发送:
|
||
|
||
```Plain Text
|
||
当前分包序号
|
||
总分包数
|
||
OTA数据
|
||
```
|
||
|
||
流程:
|
||
|
||
```Plain Text
|
||
APP
|
||
↓
|
||
OTA_DATA
|
||
↓
|
||
BLE
|
||
↓
|
||
OTA_DATA
|
||
↓
|
||
MCU
|
||
```
|
||
|
||
---
|
||
|
||
# MCU接收OTA数据
|
||
|
||
MCU每收到一包:
|
||
|
||
1. 校验数据包
|
||
|
||
2. 写入OTA区域
|
||
|
||
3. 累计接收长度
|
||
|
||
例如:
|
||
|
||
第一次:
|
||
|
||
```Plain Text
|
||
received = 512
|
||
```
|
||
|
||
第二次:
|
||
|
||
```Plain Text
|
||
received = 1024
|
||
```
|
||
|
||
直到:
|
||
|
||
```Plain Text
|
||
received == Payload Length
|
||
```
|
||
|
||
表示:
|
||
|
||
数据接收完成。
|
||
|
||
---
|
||
|
||
# OTA数据包应答
|
||
|
||
每包数据:
|
||
|
||
MCU返回:OTA数据应答
|
||
|
||
例如
|
||
|
||
成功:
|
||
|
||
```Plain Text
|
||
Result=0x00
|
||
```
|
||
|
||
失败:
|
||
|
||
```Plain Text
|
||
Result=错误码
|
||
```
|
||
|
||
如果失败:
|
||
|
||
BLE停止发送。
|
||
|
||
---
|
||
|
||
# MCU完成OTA校验
|
||
|
||
全部数据接收完成。
|
||
|
||
MCU:
|
||
|
||
计算:CRC32
|
||
|
||
比较:CRC32 VS OTA升级请求中的CRC32
|
||
|
||
---
|
||
|
||
## 校验成功
|
||
|
||
MCU:保存升级信息。
|
||
|
||
返回:OTA\_RESULT
|
||
|
||
然后:重启。
|
||
|
||
---
|
||
|
||
## 校验失败
|
||
|
||
返回:OTA\_RESULT
|
||
|
||
错误码:
|
||
|
||
例如:
|
||
|
||
```Plain Text
|
||
CRC错误
|
||
```
|
||
|
||
---
|
||
|
||
# MCU通知BLE升级结果
|
||
|
||
MCU升级完成后主动发送:MCU OTA完成通知
|
||
|
||
协议:0x34
|
||
|
||
内容:
|
||
|
||
```Plain Text
|
||
OTA Result
|
||
MCU Version
|
||
```
|
||
|
||
BLE收到:添加上类型(0x01 MCU)
|
||
|
||
上传APP。
|
||
|
||
---
|
||
|
||
# BLE通知APP升级结果
|
||
|
||
BLE发送:OTA完成通知
|
||
|
||
告诉APP:
|
||
|
||
```Plain Text
|
||
MCU升级完成
|
||
版本:V1.2.0
|
||
结果:成功
|
||
```
|
||
|
||
---
|
||
|
||
# 如果BLE也需要升级
|
||
|
||
MCU升级成功后:
|
||
|
||
APP继续:
|
||
|
||
```Plain Text
|
||
Target = BLE
|
||
```
|
||
|
||
流程重新开始:
|
||
|
||
```Plain Text
|
||
APP
|
||
↓
|
||
BLE
|
||
↓
|
||
BLE自身OTA
|
||
```
|
||
|
||
完成后:
|
||
|
||
BLE通知:
|
||
|
||
```Plain Text
|
||
OTA成功
|
||
```
|
||
|
||
APP更新最终状态。
|
||
|
||
---
|
||
|
||
# 完整流程图
|
||
|
||
```Plain Text
|
||
云服务器
|
||
|
|
||
|
|
||
▼
|
||
获取最新固件信息
|
||
|
|
||
▼
|
||
APP比较版本,决定升级顺序
|
||
|
|
||
┌───────────┴───────────┐
|
||
│ │
|
||
MCU升级 BLE升级
|
||
│ │
|
||
OTA升级请求 OTA升级请求
|
||
│ │
|
||
▼ ▼
|
||
BLE BLE
|
||
│ │
|
||
│ 解包 ▼
|
||
▼ 自身准备
|
||
OTA升级请求
|
||
│
|
||
▼
|
||
MCU
|
||
│
|
||
▼
|
||
OTA请求应答
|
||
│
|
||
▼
|
||
OTA数据
|
||
│
|
||
▼
|
||
OTA数据应答
|
||
│
|
||
▼
|
||
CRC校验
|
||
│
|
||
▼
|
||
OTA_RESULT
|
||
│
|
||
▼
|
||
MCU通知BLE
|
||
│
|
||
▼
|
||
BLE通知APP
|
||
```
|
||
|
||
|
||
|