PyBluez over HCI 在 ESP32 的 Raspberry Pi 计算模块上工作异常
Posted
技术标签:
【中文标题】PyBluez over HCI 在 ESP32 的 Raspberry Pi 计算模块上工作异常【英文标题】:PyBluez over HCI working oddly on Raspberry Pi Compute Module with ESP32 【发布时间】:2019-12-22 18:57:16 【问题描述】:我正在使用通过 UART 的 HCI 连接到 ESP32 的自定义主板中的 Raspberry PI 计算模块 3 通过蓝牙连接到手机。它部分工作:手机能够与设备配对,设备可以在 bluetoothctl UI 中看到手机,SDPtool 可以看到设备公开的服务(RFCOMM)。
但是,当我使用 pybluez 时,某些功能不起作用: 首先,我尝试将该设备用作蓝牙从设备。这是我的首选配置。 btmon 显示电话正在尝试连接,但 pybluez 从未通过 sock.accept()。该代码几乎与您在 pybluez github 上的示例中看到的完全一样,并且我已经成功地将相同的代码与库存 Raspberry Pi Zero W(带有集成蓝牙)一起使用。
电话在 socket.connect() 命令中显示以下错误: W / System.err:java.io.IOException:读取失败,套接字可能关闭或超时,读取ret:-1 W/System.err:在 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.java: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 不报告任何设备,尽管 phone 和 bluetoothctl 都显示设备已配对。但是,如果我在 bluetoothctl 中看到的设备地址中硬编码,我实际上可以连接。
我确信蓝牙配置出了问题,可能是 bluez 或 pybluez 的版本,但我找不到其他人报告过此类问题。我注意到我正在使用蓝牙服务上的兼容模式开关(否则它根本不起作用)。我相信 Bluez 版本是 5.43。
有人见过这样的吗?有什么解决这些问题的建议(不同版本的 bluez 等)?
【问题讨论】:
大部分都帮不上忙,但根据我的经验 pybluez discover_devices 仅报告当前显示为可见的设备,除非它们可见,否则它不会显示已配对的设备(即在 android 上你有蓝牙设置页面打开)。 【参考方案1】:我最终确实解决了这个问题,但我不确定是哪个更改:
-
我将波特率降低到 115200。
我在固件闪存中将其切换为经典蓝牙。
我禁用了蓝牙睡眠。
这三个更改中的一个肯定成功了
ret = esp_bt_controller_enable(ESP_BT_MODE_CLASSIC_BT);
if (ret != ESP_OK)
ESP_LOGE(tag, "Bluetooth Controller initialize failed: %s", esp_err_to_name(ret));
return;
ret = esp_bt_sleep_disable();
if (ret != ESP_OK)
ESP_LOGE(tag, "Bluetooth Sleep Disable Failed: %s", esp_err_to_name(ret));
return;
【讨论】:
以上是关于PyBluez over HCI 在 ESP32 的 Raspberry Pi 计算模块上工作异常的主要内容,如果未能解决你的问题,请参考以下文章
RFCOMM 没有在 Debian 上使用 PyBluez 配对?
Python 连接蓝牙 python3.8 安装 pybluez