OTA
BLE OTA — 固件升级 — BLE GATT、OTA Service
学习目标
- 理解 BLE OTA 的整体流程——Central 推送固件 → Peripheral 接收并写入 Flash → 校验 → 重启
- 掌握
bth_ota_init()初始化 BLE OTA Service - 理解升级状态机的设计
- 能够在 WS63 上实现 BLE OTA 固件升级
基本概念
BLE OTA vs SLE OTA
| 对比项 | BLE OTA | SLE OTA |
|---|---|---|
| 传输方式 | GATT Service | SSAP Service |
| 速率 | ~50-800Kbps | ~3Mbps |
| 适用 | 小固件、手机兼容 | 大固件、高速 |
升级状态机
stateDiagram
IDLE --> RECEIVING: 开始接收
RECEIVING --> VERIFYING: 接收完成
VERIFYING --> APPLYING: CRC 通过
VERIFYING --> IDLE: CRC 失败
APPLYING --> REBOOT: 设置启动标志
REBOOT --> [*]: 重启
OTA 数据分包
固件按 MTU-3 分包(3 字节协议头),每包带递增序号。Central 发完一轮后 Peripheral 回复 ACK 位图,Central 重发丢失的包。
涉及 API
| API | 谁调用 | 用途 |
|---|---|---|
bth_ota_init() |
Peripheral | 初始化 BLE OTA Service |
gatts_notify_indicate() |
Peripheral | 发送 ACK 位图 |
gattc_write_req() |
Central | 写入固件数据包(有确认) |
gattc_write_cmd() |
Central | 快速写入(无确认,更快) |
案例说明
做什么
Central 将新固件通过 BLE 推送到 Peripheral → Peripheral 写入 Flash → 校验成功后重启进入新固件。
关键配置
| 参数 | 推荐值 | 说明 |
|---|---|---|
| MTU | 517B | 最大化单包效率 |
| 分片大小 | MTU - 3 = 514B | 协议头 3B |
| ACK 窗口 | 每 100 包 | 位图回复 |
代码详解
/* Peripheral 端 OTA 初始化 */
bth_ota_init();
/* Central 端逐包发送 */
for (int i = 0; i < total_packets; i++) {
gattc_write_cmd(conn_id, attr_handle,
PACKET_SIZE, &firmware[i * PACKET_SIZE]);
}
/* Peripheral ACK 位图——每 100 包回复,标记丢失的包 */
gatts_notify_indicate(conn_id, ack_handle,
bitmap_size, ack_bitmap, false);
/* 校验 → 激活 → 重启 */
if (crc32_check() == 0) {
uapi_upg_active();
system_reset();
}