BLE升级后找不到新特征值?按GATT缓存、Service Changed和绑定状态排查

OTA后,手机可能已经连接成功,却仍显示旧服务列表,或者再也收不到遥测。此时先保留故障现场,不要立即删绑定。本流程用于证明问题发生在数据库引用、订阅、安全状态还是App处理链路;所有步骤都是待执行的诊断方案,没有声称某机型存在普遍缺陷或已完成测试。

确认升级究竟改变了什么

先记录硬件版本、前后固件构建号、蓝牙栈与配置、手机型号、完整系统版本、App版本。写明实际升级方式、手机升级时是否在线、升级后的第一个失败操作,并区分可复现基线与用户回忆。保留原手机和设备的状态,避免调查刚开始就改变关键变量。

比较实际配置的服务端数据库:新增特征、删除描述符、移动句柄、收紧权限,还是仅改变业务值?清单应区分声明句柄和值句柄,不能只看UUID头文件。新装App正常、曾连接的手机异常,只能提示“历史状态可能相关”;App自己持久化的旧引用也能产生相似症状。

先分开连接失败和发现错误

依次标记连接、发现、目标操作所需安全、订阅和业务事务的完成边界。不要把加密作为所有服务发现的前置条件。受保护值读取被拒绝,与数据库根本缺少特征,应走不同分支。日志保留状态码、操作类型与句柄,不要把所有错误都转成“蓝牙失败”。

依据可观察证据分流症状
症状 先取的证据 下一分支
无法连接 连接回调、原因、广播身份 链路或身份问题
已连接但缺特征 服务端清单与发现结果 注册、过滤或缓存
访问旧句柄 请求句柄与当前映射 废弃引用与重新发现
受保护读取被拒绝 ATT错误、当前安全状态 安全或权限不匹配
能发现和读取但无通知 CCCD、生产数据活动、接收回调 订阅或数据链路

通用扫描器可作为独立观察工具,但新的诊断连接也可能改变现场。先捕获原App失败,再记录扫描器何时接入、是否触发了状态变化。

沿Service Changed时序检查遗漏

沿完整时序核对,不能只寻找“已发送”日志。Service Changed通过indication携带变化句柄范围,已绑定对端还涉及断连期间的变更记录,具体要求见Core 6.3 GATT §§2.5.2、7.1。数据库里有该特征,并不证明目标手机已订阅或App已替换旧引用。

从数据库变更、指示与确认,到重新发现及业务订阅恢复的诊断时序。
原创诊断示意。每个边界都需在目标栈上观察,不能据此承诺所有手机行为一致。

检查旧固件是否已有该特征、CCCD状态、变化范围、发送、确认及后续客户端活动。还要覆盖手机全程离线升级后首次重连。收到确认只能证明协议事件,不能证明业务已经恢复。

Android的onServiceChanged从API 31加入,官方要求收到事件后调用discoverServices。应通过App连接状态机调度并记录完成结果;这个回调不能直接套用到旧Android或iOS。

检查Database Hash与Robust Caching能力

记录是否存在Database Hash与Client Supported Features、客户端是否声明Robust Caching、实际进行了哪些读取。Database Hash针对规定的数据库定义输入,不追踪普通传感器值;Robust Caching在特定条件下使用Database Out Of Sync错误0x12,依据见Core 6.3 GATT §§2.5.2.1、7.3。不能从手机新旧推断双方能力。

设置两个受控对照:固件变化但数据库定义不变,以及故意改变数据库定义。可获取hash时保存前后值。抓包没有hash读取,就不能从连接成功回调推断发生过读取。若错误仅在HCI可见,应标注这一限制,不要求所有手机API都暴露同一个数值。

把绑定和订阅持久状态纳入诊断

分别记录绑定材料及对端身份、服务端订阅状态、App回调状态。绑定仍在,不代表App接收处理仍在;回调已注册,也不代表服务端允许向它发送数据。检查重启后存储恢复及升级是否迁移了非易失设置区。

对启用Bluetooth settings的Zephyr 3.7,服务注册顺序会影响CCCD恢复,固定版本GATT API列出了注册和settings-load约束。必须检查实际初始化顺序,不能仅凭编译开关断定状态恢复成功。

单侧删绑定会改变安全实验。先归档证据,并在需要时取得设备所有者同意,再单独做干净配对对照。两端删绑定后恢复只能缩小假设范围,不能证明具体哪份状态损坏,更不等于修复保留历史的升级路径。

用最小组合找出根因而非靠反复重启

初期固定一台手机、同一App二进制和两个固件构建,使用实际升级路径及安全负载。一次只改变一个能解释故障的变量,并保留可供接手者重复的基线。

  1. 旧固件上保存发现结果、一次受保护操作和连续订阅数据。
  2. 按规定保留绑定及App状态升级,不清理就执行原失败操作。
  3. 有条件时加入数据库不变的控制构建,区分固件和schema变化。
  4. 归档保留历史的失败后,再建立单独编号的干净状态对照。
  5. 用共同事件标记对齐设备、App及可取得的HCI或空口日志,注明时钟误差。

不要把隐藏的Android强制刷新接口当作跨平台修复方案。缺少抓包时应明确写出。没有状态台账的反复重启,容易把偶然清理成功误认为故障自行消失。

从根因映射到修复和回归

修复责任对应失败边界:实际数据库错误归注册或构建配置;持久化异常归存储与初始化;重新发现成功后仍访问旧对象归客户端引用管理;收到字节却解释错单位则回到协议兼容契约。

先复测原来保留历史的失败序列,把清理状态的临时绕行单列,再扩展到OTA兼容验收矩阵。实现检查可参阅已有BLE客户端审查文章。交给Obeita诊断评估的资料应包含前后数据库、准确版本和脱敏抓包,并明确未知项。原用户路径尚需额外清理才能恢复时,不应宣布根因已修复。

类似文章