You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bluetooth LE连接后立即断开 求助排查原因与解决方法

问题

我正在开发一款运行于中心设备的应用,可对特定外设设备进行BLE扫描、连接、配对及重连操作。应用能正常扫描BLE设备,且已配置连接功能,运行时扫描到目标设备后会启动连接流程。在外设端可见中心设备成功连接,但连接会立即断开。我猜测原因是未找到兼容服务(即无可识别的GATT属性/应用/服务),使用bluetoothctl连接同一外设时也会立即断开,因此怀疑外设端存在缺失项。

想了解:

  • 连接外设前是否还需实现其他内容?
  • 连接断开是否是因为中心设备无可用可识别服务?
  • 外设端btmon流程中出现的"Attribute not found"是否为问题根源?

外设端某次成功连接的btmon流程:

  1. 连接请求
  2. 读取远端支持特性
  3. 关闭扫描
  4. 读取远端扩展特性
  5. 远端名称请求

对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:10:34