Bluetooth LE连接后立即断开 求助排查原因与解决方法
问题
我正在开发一款运行于中心设备的应用,可对特定外设设备进行BLE扫描、连接、配对及重连操作。应用能正常扫描BLE设备,且已配置连接功能,运行时扫描到目标设备后会启动连接流程。在外设端可见中心设备成功连接,但连接会立即断开。我猜测原因是未找到兼容服务(即无可识别的GATT属性/应用/服务),使用bluetoothctl连接同一外设时也会立即断开,因此怀疑外设端存在缺失项。
想了解:
- 连接外设前是否还需实现其他内容?
- 连接断开是否是因为中心设备无可用可识别服务?
- 外设端btmon流程中出现的"Attribute not found"是否为问题根源?
外设端某次成功连接的btmon流程:
- 连接请求
- 读取远端支持特性
- 关闭扫描
- 读取远端扩展特性
- 远端名称请求
对应的btmon日志如下:
> ACL Data RX: Handle 128 flags 0x02 dlen 11 #23 [hci0] 16.564046 ATT: Read By Group Type Request (0x10) len 6 Handle range: 0x0001-0xffff Attribute group type: Primary Service (0x2800) < ACL Data TX: Handle 128 flags 0x00 dlen 24 #24 [hci0] 16.564325 ATT: Read By Group Type Response (0x11) len 19 Attribute data length: 6 Attribute group list: 3 entries Handle range: 0x0001-0x0005 UUID: Generic Access Profile (0x1800) Handle range: 0x0006-0x000f UUID: Generic Attribute Profile (0x1801) Handle range: 0x0010-0x0012 UUID: Device Information (0x180a) < ACL Data TX: Handle 128 flags 0x00 dlen 11 #25 [hci0] 16.564349 ATT: Read By Type Request (0x08) len 6 Handle range: 0x0001-0xffff Attribute type: Unknown (0x2b3a) > HCI Event: Number of Completed Packets (0x13) plen 5 #26 [hci0] 16.580038 Num handles: 1 Handle: 128 Count: 1 > ACL Data RX: Handle 128 flags 0x02 dlen 11 #27 [hci0] 16.596035 ATT: Read By Group Type Request (0x10) len 6 Handle range: 0x0013-0xffff Attribute group type: Primary Service (0x2800) > HCI Event: Number of Completed Packets (0x13) plen 5 #28 [hci0] 16.596041 Num handles: 1 Handle: 128 Count: 1 < ACL Data TX: Handle 128 flags 0x00 dlen 9 #29 [hci0] 16.596267 ATT: Error Response (0x01) len 4 Read By Group Type Request (0x10) Handle: 0x0013 Error: Attribute Not Found (0x0a) > ACL Data RX: Handle 128 flags 0x02 dlen 9 #30 [hci0] 16.620082 ATT: Error Response (0x01) len 4 Read By Type Request (0x08) Handle: 0x0001 Error: Attribute Not Found (0x0a)
分析与解答
1. "Attribute not found"是直接诱因
从日志可以明确:
- 中心设备连接后会遍历读取外设的所有主服务,当读取
0x0013起始的Handle范围时,外设返回Attribute Not Found错误; - 中心设备还尝试读取UUID为
0x2b3a的属性(BLE SIG定义的「Peripheral Preferred Connection Parameters」特性),外设同样返回该错误。
单个ATT错误不会直接断开连接,但如果中心设备(包括bluetoothctl)的连接逻辑依赖于找到特定服务/属性,多次读取失败就会触发主动断开逻辑。
2. 连接断开的核心原因
你的猜测正确:连接断开本质是中心设备未找到可交互的兼容服务。
外设仅提供了0x1800(通用访问)、0x1801(通用属性)、0x180a(设备信息)三个基础服务,没有提供中心设备期望的自定义服务或标准交互服务。中心设备完成基础GATT发现后,没有找到需要交互的目标,因此主动断开连接。
3. 连接外设前需补充的内容
- 定义并实现双方约定的GATT服务:如果你的应用需要和外设交互,必须先明确约定的GATT服务、特性、描述符,在外设端完成实现并暴露这些属性;
- 修改中心设备的连接逻辑:调整应用代码,不要因为未找到非必需属性就直接断开,允许仅保持基础连接;
- 外设端补充关键通用属性:为兼容
bluetoothctl等通用工具的默认行为,建议外设实现0x2b3a(Peripheral Preferred Connection Parameters)特性,这是多数BLE中心设备会默认读取的属性; - 调试GATT服务完整性:使用
gatttool工具扫描外设的GATT服务,确认所有需要的属性已正确暴露:gatttool -b <外设MAC地址> --primary gatttool -b <外设MAC地址> --characteristics
内容的提问来源于stack exchange,提问作者ascode
相关产品推荐
相关产品推荐

