linux - Linux Bluez RFCOMM:连接被拒绝
问题描述
在 Linux/Bluez 上通过 RFCOMM 与蓝牙设备的连接失败,在调用
connect(s, (struct sockaddr *)&addr, sizeof(addr));
. 设备已成功配对。可以成功建立从 Android 或 Windows 到该设备的 RFCOMM 连接,因此问题似乎与 Bluez 潜水员和/或蓝牙设备有关。
对于 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)或 Raspberry Pi 3(Jessie,Stretch)。
我检查了许多其他具有相同/相似问题的线程。大多数人没有或没有明确的答案。
Wireshark 跟踪屏幕截图显示2.2 秒后断开连接。
对应的蓝牙系统日志输出:
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()
reason 3
指向内核源代码的 include/net/bluetooth/mgmt.h 中的 MGMT_DEV_DISCONN_REMOTE。这意味着启动断开连接的是设备。但是 Wireshark 跟踪中突出显示的行表明是主机发起了断开连接。
非常感谢您提前提供的任何帮助。
解决方案
使用了不正确的 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
推荐阅读
- javascript - 使用 Ionic 将图片保存到本地目录
- sql - 执行 Spark 作业时,GettingTask 无法序列化异常
- ios - 在phonegap中上传zip文件时出现构建错误ios
- javascript - 将 'this' (self) 引用传递给 DOM 的 ng-mouseover 事件不起作用。除了使用核心javascript事件之外,还有其他方法吗?
- java - 如何在 addTextChangeListener() 中包含空格?
- php - 将多维数组添加到其他多维数组的子数组中
- python - 带有扭曲和(tx)请求的文件的异步下载
- python - 是否可以使用 Google App Engine(没有 Google Compute Engine)通过 API 调用(使用 Python)将文件下载到 Google Cloud Storage
- floating-point - IEE754 舍入模式:如何计算误差?
- angular - Angular 4 - 获取产品和类别