Raspberry Pi 无法重新连接到已配对的蓝牙设备
Raspberry Pi cannot reconnect to paired Bluetooth device
我正在使用 Raspberry Pi 3 和 BlueZ v5.5 与蓝牙体重秤通信。
问题:我可以配对秤并在配对后立即与其通信(read/write特性)。但是如果我断开与体重秤的连接,我将无法重新连接。
我在Raspberry Pi这边做了什么:
- sudo bluetoothctl
- (默认情况下我注册了代理KeyboardDisplay)
- 扫描
- (我看到设备的 ADV)
- 扫描关闭
- 信任MAC 地址
- 一对MAC地址
- (我输入体重秤屏幕上显示的 6 位密码)
- (已建立连接)
- 信任MAC 地址
- 断开连接MAC地址
- 连接MAC地址
- (连接失败)
这是 btmon 的输出:
< HCI Command: LE Create Connection (0x08|0x000d) plen 25
Scan interval: 60.000 msec (0x0060)
Scan window: 60.000 msec (0x0060)
Filter policy: White list is not used (0x00)
Peer address type: Public (0x00)
Peer address: MAC ADDRESS
Own address type: Public (0x00)
Min connection interval: 10.00 msec (0x0008)
Max connection interval: 20.00 msec (0x0010)
Connection latency: 0 (0x0000)
Supervision timeout: 6000 msec (0x0258)
Min connection length: 0.000 msec (0x0000)
Max connection length: 0.000 msec (0x0000)
> HCI Event: Command Status (0x0f) plen 4
LE Create Connection (0x08|0x000d) ncmd 1
Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 19
LE Connection Complete (0x01)
Status: Success (0x00)
Handle: 64
Role: Master (0x00)
Peer address type: Public (0x00)
Peer address: MAC ADDRESS
Connection interval: 18.75 msec (0x000f)
Connection latency: 0 (0x0000)
Supervision timeout: 6000 msec (0x0258)
Master clock accuracy: 0x00
@ MGMT Event: Device Connected (0x000b) plen 37
LE Address: MAC ADDRESS
Flags: 0x00000000
Data length: 24
Flags: 0x06
LE General Discoverable Mode
BR/EDR Not Supported
16-bit Service UUIDs (partial): 1 entry
Weight Scale (0x181d)
Appearance: Weight Scale (0x0c80)
Unknown EIR field 0x1b: 00610601d3ca5d
Service Data (UUID 0x181d):
@ MGMT Event: Device Connected (0x000b) plen 37
LE Address: MAC ADDRESS
Flags: 0x00000000
Data length: 24
Flags: 0x06
LE General Discoverable Mode
BR/EDR Not Supported
16-bit Service UUIDs (partial): 1 entry
Weight Scale (0x181d)
Appearance: Weight Scale (0x0c80)
Unknown EIR field 0x1b: 00610601d3ca5d
Service Data (UUID 0x181d):
< HCI Command: LE Read Remote Used Features (0x08|0x0016) plen 2
Handle: 64
> HCI Event: Command Status (0x0f) plen 4
LE Read Remote Used Features (0x08|0x0016) ncmd 1
Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 12
LE Read Remote Used Features (0x04)
Status: Success (0x00)
Handle: 64
Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
LE Encryption
< HCI Command: LE Start Encryption (0x08|0x0019) plen 28
Handle: 64
Random number: 0x3a0760acb556aa15
Encrypted diversifier: 0xa2f4
Long term key: 1639a13299a91d0000519e1041643419
> HCI Event: Command Status (0x0f) plen 4
LE Start Encryption (0x08|0x0019) ncmd 1
Status: Success (0x00)
> HCI Event: Encryption Change (0x08) plen 4
Status: PIN or Key Missing (0x06)
Handle: 64
Encryption: Disabled (0x00)
< HCI Command: Disconnect (0x01|0x0006) plen 3
Handle: 64
Reason: Authentication Failure (0x05)
> HCI Event: Command Status (0x0f) plen 4
Disconnect (0x01|0x0006) ncmd 1
Status: Success (0x00)
> HCI Event: Disconnect Complete (0x05) plen 4
Status: Success (0x00)
Handle: 64
Reason: Connection Terminated By Local Host (0x16)
@ MGMT Event: Device Disconnected (0x000c) plen 8
LE Address: MAC ADDRESS
Reason: Connection terminated due to authentication failure (0x04)
我浏览了大量的页面和线程,但无法解决这个问题。任何建议将不胜感激。非常感谢!
因此,解决方案是仔细查看 SMP 配对数据包。
我的 SMP 配对请求(来自主站)包含以下参数:
Initiator key distribution: EncKey Sign LinkKey (0x0d)
Responder key distribution: EncKey IdKey Sign LinkKey (0x0f)
SMP 配对响应(来自从设备)有不同:
Initiator key distribution: IdKey (0x02)
Responder key distribution: EncKey IdKey (0x03)
所以slave需要master的IdKey并且是认真的。取而代之的是,BlueZ 堆栈只是忽略了需求并且没有提供 IdKey。
快速解决方法是向从服务器发送一些硬编码的 ID 密钥。
我正在使用 Raspberry Pi 3 和 BlueZ v5.5 与蓝牙体重秤通信。
问题:我可以配对秤并在配对后立即与其通信(read/write特性)。但是如果我断开与体重秤的连接,我将无法重新连接。
我在Raspberry Pi这边做了什么:
- sudo bluetoothctl
- (默认情况下我注册了代理KeyboardDisplay)
- 扫描
- (我看到设备的 ADV)
- 扫描关闭
- 信任MAC 地址
- 一对MAC地址
- (我输入体重秤屏幕上显示的 6 位密码)
- (已建立连接)
- 信任MAC 地址
- 断开连接MAC地址
- 连接MAC地址
- (连接失败)
这是 btmon 的输出:
< HCI Command: LE Create Connection (0x08|0x000d) plen 25
Scan interval: 60.000 msec (0x0060)
Scan window: 60.000 msec (0x0060)
Filter policy: White list is not used (0x00)
Peer address type: Public (0x00)
Peer address: MAC ADDRESS
Own address type: Public (0x00)
Min connection interval: 10.00 msec (0x0008)
Max connection interval: 20.00 msec (0x0010)
Connection latency: 0 (0x0000)
Supervision timeout: 6000 msec (0x0258)
Min connection length: 0.000 msec (0x0000)
Max connection length: 0.000 msec (0x0000)
> HCI Event: Command Status (0x0f) plen 4
LE Create Connection (0x08|0x000d) ncmd 1
Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 19
LE Connection Complete (0x01)
Status: Success (0x00)
Handle: 64
Role: Master (0x00)
Peer address type: Public (0x00)
Peer address: MAC ADDRESS
Connection interval: 18.75 msec (0x000f)
Connection latency: 0 (0x0000)
Supervision timeout: 6000 msec (0x0258)
Master clock accuracy: 0x00
@ MGMT Event: Device Connected (0x000b) plen 37
LE Address: MAC ADDRESS
Flags: 0x00000000
Data length: 24
Flags: 0x06
LE General Discoverable Mode
BR/EDR Not Supported
16-bit Service UUIDs (partial): 1 entry
Weight Scale (0x181d)
Appearance: Weight Scale (0x0c80)
Unknown EIR field 0x1b: 00610601d3ca5d
Service Data (UUID 0x181d):
@ MGMT Event: Device Connected (0x000b) plen 37
LE Address: MAC ADDRESS
Flags: 0x00000000
Data length: 24
Flags: 0x06
LE General Discoverable Mode
BR/EDR Not Supported
16-bit Service UUIDs (partial): 1 entry
Weight Scale (0x181d)
Appearance: Weight Scale (0x0c80)
Unknown EIR field 0x1b: 00610601d3ca5d
Service Data (UUID 0x181d):
< HCI Command: LE Read Remote Used Features (0x08|0x0016) plen 2
Handle: 64
> HCI Event: Command Status (0x0f) plen 4
LE Read Remote Used Features (0x08|0x0016) ncmd 1
Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 12
LE Read Remote Used Features (0x04)
Status: Success (0x00)
Handle: 64
Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
LE Encryption
< HCI Command: LE Start Encryption (0x08|0x0019) plen 28
Handle: 64
Random number: 0x3a0760acb556aa15
Encrypted diversifier: 0xa2f4
Long term key: 1639a13299a91d0000519e1041643419
> HCI Event: Command Status (0x0f) plen 4
LE Start Encryption (0x08|0x0019) ncmd 1
Status: Success (0x00)
> HCI Event: Encryption Change (0x08) plen 4
Status: PIN or Key Missing (0x06)
Handle: 64
Encryption: Disabled (0x00)
< HCI Command: Disconnect (0x01|0x0006) plen 3
Handle: 64
Reason: Authentication Failure (0x05)
> HCI Event: Command Status (0x0f) plen 4
Disconnect (0x01|0x0006) ncmd 1
Status: Success (0x00)
> HCI Event: Disconnect Complete (0x05) plen 4
Status: Success (0x00)
Handle: 64
Reason: Connection Terminated By Local Host (0x16)
@ MGMT Event: Device Disconnected (0x000c) plen 8
LE Address: MAC ADDRESS
Reason: Connection terminated due to authentication failure (0x04)
我浏览了大量的页面和线程,但无法解决这个问题。任何建议将不胜感激。非常感谢!
因此,解决方案是仔细查看 SMP 配对数据包。
我的 SMP 配对请求(来自主站)包含以下参数:
Initiator key distribution: EncKey Sign LinkKey (0x0d)
Responder key distribution: EncKey IdKey Sign LinkKey (0x0f)
SMP 配对响应(来自从设备)有不同:
Initiator key distribution: IdKey (0x02)
Responder key distribution: EncKey IdKey (0x03)
所以slave需要master的IdKey并且是认真的。取而代之的是,BlueZ 堆栈只是忽略了需求并且没有提供 IdKey。
快速解决方法是向从服务器发送一些硬编码的 ID 密钥。