如何使用Service Changed特性使蓝牙属性缓存失效?
蓝牙GATT服务缓存失效解决方案
全量句柄范围的定义
Service Changed(UUID 0x2A05)特征的通知数据为4字节小端格式,包含两个16位字段:起始句柄和结束句柄。若要触发全量缓存失效,直接将起始句柄设为0x0001、结束句柄设为0xFFFF即可。这是蓝牙规范约定的特殊区间,客户端收到后会清空所有缓存的服务/特征数据,重新执行完整的服务发现流程。
通知发送时机
- 设备启动阶段:如果每次启动都会修改GATT服务/特征的结构,需在所有服务初始化完成后立即发送一次全量范围的Service Changed通知。注意要确保客户端已订阅该特征(多数蓝牙客户端会自动订阅Service Changed特征,无需额外操作)。
- 设备运行期间:只要GATT服务的结构发生变更(比如动态添加/删除服务、修改特征的UUID/权限/描述符),都可以发送对应范围的通知。如果不确定变更覆盖的句柄范围,直接发送全量范围的通知即可,不会有性能问题。
aioble库实现提示
在aioble中,你需要先注册通用属性服务(UUID 0x1801),并为Service Changed特征开启通知权限。发送全量失效通知时,直接传递小端字节数据b'\x01\x00\xff\xff'即可(对应0x0001和0xFFFF的小端表示)。
内容的提问来源于stack exchange,提问作者Zach Moshe
相关产品推荐
相关产品推荐

