0

我在连接到 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 等)?

4

1 回答 1

0

我最终确实解决了这个问题,但我不确定是哪个改变做到了:

  1. 我将波特率降低到 115200。
  2. 我在固件闪存中将其切换为经典蓝牙。
  3. 我禁用了蓝牙睡眠。

这三个更改之一必须成功

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;
}
于 2019-09-11T02:20:18.023 回答