BlueZ 5.47 BLE设备初始连接后后续连接报PIN/Key缺失(0x06)错误
解决BlueZ 5.47与BLE脉搏血氧仪重复连接时的PIN/Key缺失(0x06)错误
问题回顾
你遇到的这个问题非常典型:首次使用BlueZ 5.47连接BLE脉搏血氧仪时,配对、通信都完全正常,但后续任何连接尝试都会触发PIN or Key Missing (0x06)错误,只有通过bluetoothctl移除设备后才能重新连接。结合你提供的btmon日志,我们可以精准定位问题核心。
日志关键节点分析
先看你提供的连接失败日志(格式化后):
< HCI Command: LE Create Connection (0x08|0x000d) plen 25 #3 [hci0] 91.335394 Scan interval: 60.000 msec (0x0060) Scan window: 30.000 msec (0x0030) Filter policy: White list is not used (0x00) Peer address type: Public (0x00) Peer address: 00:1C:05:FF:9C:A5 (OUI 00-1C-05) Own address type: Public (0x00) Min connection interval: 50.00 msec (0x0028) Max connection interval: 70.00 msec (0x0038) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Min connection length: 0.000 msec (0x0000) Max connection length: 0.000 msec (0x0000) > HCI Event: Command Status (0x0f) plen 4 #4 [hci0] 91.347480 LE Create Connection (0x08|0x000d) ncmd 1 Status: Success (0x00) > HCI Event: LE Meta Event (0x3e) plen 19 #5 [hci0] 92.874610 LE Connection Complete (0x01) Status: Success (0x00) Handle: 1025 Role: Master (0x00) Peer address type: Public (0x00) Peer address: 00:1C:05:FF:9C:A5 (OUI 00-1C-05) Connection interval: 70.00 msec (0x0038) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Master clock accuracy: 0x01 @ Device Connected: 00:1C:05:FF:9C:A5 (1) flags 0x0000 < ACL Data TX: Handle 1025 flags 0x00 dlen 8 #6 [hci0] 92.928535 ATT: Write Request (0x12) len 3 Handle: 0x0019 Data: 01 > ACL Data RX: Handle 1025 flags 0x02 dlen 6 #7 [hci0] 92.977319 SMP: Security Request (0x0b) len 1 Authentication requirement: No bonding, No MITM, Legacy, No Keypresses (0x00) < HCI Command: LE Start Encryption (0x08|0x0019) plen 28 #8 [hci0] 92.977466 Handle: 1025 Random number: 0x8f15c8e27f50c2fc Encrypted diversifier: 0x6ee1 Long term key: b3c9837306766fd8d4024ae4549c6337 > HCI Event: Command Status (0x0f) plen 4 #9 [hci0] 92.988087 LE Start Encryption (0x08|0x0019) ncmd 1 Status: Success (0x00) > ACL Data RX: Handle 1025 flags 0x02 dlen 5 #10 [hci0] 93.117417 ATT: Write Response (0x13) len 0 > HCI Event: Number of Completed Packets (0x13) plen 5 #11 [hci0] 93.145136 Num handles: 1 Handle: 1025 Count: 1 > HCI Event: Encryption Change (0x08) plen 4 #12 [hci0] 93.327778 Status: PIN or Key Missing (0x06) Handle: 1025 Encryption: Disabled (0x00) < HCI Command: Disconnect (0x01|0x0006) plen 3 #13 [hci0] 93.327909 Handle: 1025 Reason: Authentication Failure (0x05) > HCI Event: Command Status (0x0f) plen 4 #14 [hci0] 93.333590 Disconnect (0x01|0x0006) ncmd 1 Status: Success (0x00) > HCI Event: Disconnect Complete (0x05) plen 4 #15 [hci0] 93.397883 Status: Success (0x00) Handle: 1025 Reason: Authentication Failure (0x05)
从日志里能看到核心矛盾:
- 设备发起的安全请求明确要求No bonding(无绑定),但BlueZ还是尝试使用之前存储的**Long Term Key(LTK)**启动加密
- 设备端没有对应的LTK,直接返回
PIN or Key Missing (0x06),导致连接断开
根本原因推测
这个问题的本质是BlueZ的绑定密钥管理和设备的安全策略不匹配:
- 你的脉搏血氧仪不支持持久绑定,每次连接都需要无加密/临时安全上下文
- 但BlueZ在首次连接后,默认会存储绑定密钥(即使设备要求No bonding),后续连接时自动复用该密钥,触发设备的认证失败
可行解决方案
按照优先级从易到难尝试:
1. 连接时强制使用低安全级别
用gatttool连接时,指定--sec-level low参数,匹配设备的无绑定要求:
gatttool -b 00:1C:05:FF:9C:A5 -I --sec-level low --connect
这个参数会告诉BlueZ不要使用已存储的密钥,直接建立无加密的连接,完全符合设备的安全请求。
2. 修改BlueZ配置禁用自动绑定
编辑BlueZ的主配置文件/etc/bluetooth/main.conf,添加/修改以下配置:
# 禁用自动连接 AutoConnect=false # 设置默认安全级别为低 Security=low # 禁用自动存储绑定密钥 AutoEnable=false
然后重启蓝牙服务生效:
sudo systemctl restart bluetooth
3. 彻底清理BlueZ的绑定存储
如果本地已经存储了错误的密钥,彻底清除后重新配对:
# 停止蓝牙服务 sudo systemctl stop bluetooth # 替换下面的[HCI0_MAC]为你的蓝牙适配器MAC(用hciconfig hci0查看) sudo rm -rf /var/lib/bluetooth/[HCI0_MAC] # 重启蓝牙服务 sudo systemctl start bluetooth
之后重新连接设备,BlueZ会重新协商安全上下文,不会复用旧密钥。
4. 检查设备的安全设置
部分BLE设备在重启后会清除绑定信息,或者有手动清除配对的选项。尝试重启血氧仪后再连接,看是否能正常复用密钥;如果设备有设置界面,确认是否开启了“禁止持久绑定”之类的选项。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

