BLE GATT怎样演进才兼容旧App?UUID、数据格式与升级边界
固件升级保留全部UUID,旧App仍可能出错:数据单位变了、命令含义变了,或者客户端继续使用旧句柄。兼容性需要在升级前写成可审核的协议契约。下面分别讨论字节格式、发现状态和业务行为。文中的地址、报文和流程均为设计示例,没有暗示已经完成客户项目或实机验证。
先定义设备和App共享的协议契约
先列用户必须完成的操作:识别设备、读取测量值、修改设置、观察执行结果。每项操作都要记录服务与特征UUID、实例选择规则、属性、权限、长度、字节序、单位、有效范围和失败响应。写入成功表示“已接收”还是“已执行”,也必须说清;一张UUID表无法表达这些约定。
App版本、固件构建号和协议版本应独立记录。修复内部算法未必改变接口,同一版本系列的不同产品也可能具备不同能力。提供可查询的能力信息,并定义旧设备没有该查询时如何处理。客户端应明确选择受支持的基础协议,不能仅从固件版本字符串猜测操作是否可用。
哪些变化会破坏旧客户端
评审变更时,先看既有行为,再决定实现方式。新增可选特征只有在旧客户端能忽略未知项、继续选对实例时才有兼容基础。把摄氏度字段改成华氏度更危险:发现和读取都可能成功,界面却给出错误解释。下表是工程判断依据,并非自动评分。
| 变更 | 必须满足的判据 | 设计处置 |
|---|---|---|
| 新增可选特征 | 旧App忽略未知项,原操作不变 | 保留旧路径,验证重新发现 |
| 在旧值前插入属性 | 旧句柄可能改变指向 | 审查数据库差异与缓存恢复 |
| 改变字段单位或含义 | 旧解析器可能静默误读 | 保留旧格式或建立新契约 |
| 提高写入安全要求 | 旧App能建立所需安全并解释拒绝 | 明确迁移或拒绝路径 |
| 删除旧命令 | 仍受支持的App是否需要它 | 保留弃用接口或明确结束支持 |
“增加字段”只是修改方式,不能代替对历史解析器的检查。每个支持组合都要有可解释的结论。
UUID和句柄各自承担什么职责
UUID描述属性类型,句柄定位具体数据库中的属性,依据见Bluetooth Core 6.3 GATT §2.5.1。App应先选中正确服务实例,再使用发现结果定位特征。重点审查写死句柄、按数组下标取特征、跨连接保存旧对象等实现。
导出前后两个构建的数据库清单,包含服务范围、声明句柄、值句柄、描述符、UUID、属性和服务端权限。例如插入属性后测量值从0x0025移动到0x0028,只是说明差异形式的虚构地址。能保持分配稳定时应保持,但不能用UUID未变替代迁移论证。还要检查可选编译开关,确保评审的是实际出货配置。
| 属性 | 旧构建 | 新构建 |
|---|---|---|
| 遥测声明 | 0x0024 | 0x0027 |
| 同UUID遥测值 | 0x0025 | 0x0028 |
| 遥测CCCD | 0x0026 | 0x0029 |
让数据格式可以解释未知字段
自定义遥测格式可定义稳定主版本、标志、总长度及带类型的扩展。图中温度为有符号摄氏度百分之一,保留标志不能悄悄改变这一单位。只有长度明确的未知可选字段才可跳过;字段截断或不支持的主版本应拒绝。

下面是与协议栈无关、未经实机验证的伪代码。正式实现仍需检查算术溢出、缓冲区所有权及错误上报。
收到字节数不足 8:拒绝短头部
主版本不等于 1:拒绝不支持的契约
总长度不等于收到字节数:拒绝
位置 = 8
当位置小于总长度:
要求至少剩余 2 字节的类型与长度
要求字段长度不超过剩余空间
已知类型:按该类型的精确长度解析
未知且必需类型:拒绝
未知可选类型:跳过
位置增加 2 + 字段长度
本例用类型最高位标记必需扩展,未知枚举值的处理也要写入协议。长度字段解决边界问题,不能自动保证新语义与旧软件兼容。
通知订阅与缓存更新怎样配合
数据库是否有效、服务端CCCD配置、App接收回调是三份不同状态。Service Changed和Database Hash用于缓存一致性,其适用条件见Core 6.3 GATT §§2.5.2、7.1、7.3;它们不负责迁移应用数据语义,也不能通用地修复所有无通知故障。
明确谁废弃旧引用、谁重新发现、业务订阅何时恢复。对Zephyr 3.7客户端,订阅参数在有效订阅期间必须保持存活,且subscribe与resubscribe有不同用途,参见固定版本GATT API。这些约束也适用于网关客户端,但不能据此推断手机系统行为。实际升级故障转入OTA缓存排查流程。
旧App遇到新固件时怎样安全退化
分别规定读、写、通知遇到不支持版本时的行为。不可用读功能应有明确提示,畸形遥测应被丢弃并记录原因。未知控制命令必须保持执行器原状态,走约定的拒绝路径,不能猜测成最接近的已有命令。无ATT响应的写入若需要执行证明,应另设应用结果通道。
弃用期要符合产品能承担的维护范围:哪些旧App还能读,哪些仍允许控制,何时必须升级。恢复界面说明下一步操作,不应默认要求反复删绑定。能力检查必须真正阻止不支持的操作,而非只写一条日志后继续执行。
把兼容性决策留下可审查记录
将以下记录与候选固件一起保存,让接手工程师可以复核兼容决定。
- 固定支持的App和固件清单,导出前后数据库。
- 逐项比较句柄、权限、格式,并按影响表分类。
- 为变化的每项操作写出旧客户端预期行为及拒绝路径。
- 保存短报文、未知可选项、未知必需项和不支持主版本的解析向量。
- 把每条支持承诺对应到BLE OTA实机验收用例。
设计评审通过与实机通过应分开记录。实现细节可参阅已有BLE服务与客户端代码审查文章。评估改造范围时,请携带前后GATT表、App支持版本和控制命令语义,交由Obeita联网方案评估核对。