Linux Bluez RFCOMM: 连接被拒绝

3
在Linux/Bluez上通过RFCOMM连接蓝牙设备时,调用connect(s, (struct sockaddr *)&addr, sizeof(addr));会出现“Connection refused”的错误。该设备已成功配对。从Android或Windows到该设备的RFCOMM连接可以成功建立,因此问题似乎是与Bluez驱动程序和/或蓝牙d有关。
在Linux/Bluez上,bluetoothctl和Wireshark跟踪显示它首先连接,然后大约2秒后进行断开连接。断开连接的原因不清楚。
在不同的Linux版本上都会出现相同的问题,在带USB蓝牙的PC上(Linux ubuntu 4.15.0-33-generic #36~16.04.1-Ubuntu SMP Wed Aug 15 17:21:05 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux)或树莓派3(Jessie,Stretch)上也是如此。
我已经检查了许多其他线程,这些线程都有相同/类似的问题。大多数没有或没有明确的答案。 Wireshark跟踪截图 显示在2.2秒后断开连接。
相应的bluetoothd syslog输出:
Aug 31 16:43:54 ubuntu bluetoothd[926]: src/adapter.c:connected_callback() hci0 device F6:65:0A:E5:DE:E1 connected eir_len 22
Aug 31 16:43:54 ubuntu bluetoothd[926]: src/device.c:device_create() dst F6:65:0A:E5:DE:E1
Aug 31 16:43:54 ubuntu bluetoothd[926]: src/device.c:device_new() address F6:65:0A:E5:DE:E1
Aug 31 16:43:55 ubuntu bluetoothd[926]: src/device.c:device_new() Creating device /org/bluez/hci0/dev_F6_65_0A_E5_DE_E1
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:dev_disconnected() Device F6:65:0A:E5:DE:E1 disconnected, reason 3
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:adapter_remove_connection()
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:adapter_remove_connection() Removing temporary device /org/bluez/hci0/dev_F6_65_0A_E5_DE_E1
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/device.c:device_remove() Removing device /org/bluez/hci0/dev_F6_65_0A_E5_DE_E1
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/device.c:btd_device_unref() Freeing device /org/bluez/hci0/dev_F6_65_0A_E5_DE_E1
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/device.c:device_free() 0x563aa2a270a0
Aug 31 16:43:57 ubuntu bluetoothd[926]: plugins/policy.c:disconnect_cb() reason 3
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:bonding_attempt_complete() hci0 bdaddr F6:65:0A:E5:DE:E1 type 0 status 0xe
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:resume_discovery()

我将翻译如下内容:

原因3 points 到内核源文件 include/net/bluetooth/mgmt.h 中的 MGMT_DEV_DISCONN_REMOTE。这意味着是设备发起了断开连接请求。但 Wireshark 跟踪中突出显示的行显示是主机发起了断开连接请求。

非常感谢您的帮助。


这通常发生在bluez没有设备需要的所有强制配置文件时。我不确定基于libbluetooth的操作,但仍然可以尝试使用“ConnectProfile”方法连接到特定配置文件,请参见此处:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt#n61 默认情况下,“Connect”将尝试解析并连接设备支持的所有配置文件。无法连接所有配置文件会退出连接并使设备保持配对状态。 - Parthiban
谢谢您的提示。设置配置文件可能会自动选择正确的RFCOMM通道。但是对我来说,如何设置配置文件并不明显。 - shpc
1个回答

3

使用了错误的RFCOMM通道。当使用正确的RFCOMM通道时,它会立即正常工作。

sdptool records F6:65:0A:E5:DE:E1 显示RFCOMM所在的通道:

Service Name: Serial Port
Service RecHandle: 0x10000
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 5

你提到的sdptool命令也给我返回了连接被拒绝的错误。在我的情况下,我知道它是通道1,这就是我用来将rfcomm0绑定到我的[baddr]的通道。 - Scalable
你提到的sdptool命令也给我返回了连接被拒绝的错误。在我的情况下,我知道是通道1,这就是我用来绑定rfcomm0到我的[baddr]的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接