跳转至

OTA

BLE OTA — 固件升级 — BLE GATT、OTA Service

前置阅读:Hello NotifyHello ReadWrite

学习目标

  • 理解 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();
}