我在连接到 ESP32 的定制主板中使用 Raspberry PI 计算模块 3,使用 HCI over UART 通过蓝牙连接到手机。它部分工作:手机能够与设备配对,设备可以在 bluetoothctl UI 中看到手机,SDPtool 可以看到设备公开的服务(RFCOMM)。
但是,当我使用 pybluez 时,某些功能不起作用:首先我尝试将该设备用作蓝牙从设备。这是我的首选配置。btmon 显示电话正在尝试连接,但 pybluez 从未通过 sock.accept()。该代码几乎与您在 pybluez github 上的示例中看到的完全一样,并且我已经成功地将相同的代码与库存 Raspberry Pi Zero W(带有集成蓝牙)一起使用。
手机在 socket.connect() 命令中显示以下错误: W/System.err: java.io.IOException: read failed, socket might closed or timeout, read ret: -1 W/System.err: at android。 bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:698) W/System.err: 在 android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:710) W/System.err: 在 android.bluetooth.BluetoothSocket.connect(BluetoothSocket.爪哇:387)
很难在 Pi 设备的日志中找到任何有价值的东西,但我确实在 btmon 中看到了这一点:
ACL 数据 RX:句柄 128 个标志 0x02 dlen 14 [hci0] 75.711662 L2CAP:命令拒绝 (0x01) ident 5 len 6 原因:请求中的 CID 无效 (0x0002) 目标 CID:0 源 CID:0
我还尝试使用 Android hack 直接使用频道 ID 而不是 UUID 进行连接(基本上跳过了 SDP 查找) - 我使用 sdptool 浏览本地获得了频道 ID,这导致了同样的错误。
在彻底尝试了不同的事情之后,我转而尝试将手机用作蓝牙从设备而不是设备。在这里,我看到了更多的成功,但仍然没有按预期工作:pybluez 的 discover_devices 没有报告任何设备,尽管电话和 bluetoothctl 都显示设备已配对。但是,如果我在 bluetoothctl 中看到的设备地址中硬编码,我实际上可以连接。
我确信蓝牙配置出了问题,可能是 bluez 或 pybluez 的版本,但我找不到其他人报告过这类问题。我注意到我正在使用蓝牙服务上的兼容模式开关(否则它根本不起作用)。我相信 Bluez 版本是 5.43。
有没有人见过这样的事情?对解决这些问题有什么建议(不同版本的 bluez 等)?