如何让Chrome响应蓝牙服务变更特征?附设备名称显示问题
Chrome蓝牙调试:服务缓存清除、设备名称显示及Service Changed实现说明
一、清除Chrome蓝牙服务缓存的有效方法
Chrome的BLE服务缓存与系统蓝牙配对记录深度绑定,仅靠Service Changed特征可能无法触发缓存刷新,可尝试以下步骤:
- 删除系统配对记录+Chrome内部移除设备:
- 在操作系统蓝牙设置中删除目标设备的配对记录;
- 打开Chrome的蓝牙内部调试页面(地址栏输入
chrome://bluetooth-internals/),切换到"Devices"标签,找到对应设备后点击"Forget Device";
- 完全重启Chrome:关闭所有Chrome窗口,在任务管理器中结束所有Chrome进程后重新打开;
- 主动断开连接:调试代码中每次操作完成后调用
device.gatt.disconnect(),避免持久化连接导致缓存留存。
二、Chrome对Service Changed特征的实现要求
Chrome支持Service Changed特征,但需严格遵循规范才能触发服务重新发现:
- 特征必须属于Generic Attribute Service(UUID 0x1801),且属性需设置为
Indicate(而非Notify); - 服务/特征变更后,服务器需主动向已连接的客户端发送Indication,数据格式为两个16位小端字节:起始句柄和结束句柄(用
0x0000和0xFFFF表示全量服务更新); - 注意:Chrome仅在已连接状态下接收该Indication才会触发重新发现,若变更发生在连接前,需重新连接才能生效。
三、Chrome扫描窗口显示设备名称的规则
Chrome优先读取广播包中的设备名称,仅当广播包无名称时才会在连接后读取Generic Access Service(0x1800)下的Device Name特征(0x2A00),常见问题排查:
- 广播包名称长度限制:BLE广播包总长度不超过31字节,若设置的名称过长会被截断或不生效,需确保名称长度在合理范围内;
- aioble广播配置:调用
aioble.advertise()时需明确设置name参数,并确保广播数据包含Complete Local Name字段(部分库需手动配置广播数据结构); - 缓存残留:旧名称可能留存于Chrome扫描缓存中,需通过前面的清除缓存步骤刷新显示。
内容的提问来源于stack exchange,提问作者Zach Moshe
相关产品推荐
相关产品推荐

