我正在使用一个Raspberry PI计算模块3在一个自定义主板连接到一个ESP32,使用HCI通过UART连接到移动电话通过蓝牙。它可以部分工作:手机可以与设备配对,设备可以看到蓝牙界面中的手机,SDPtool可以看到设备公开的服务(RFCOMM)。
但是,当我使用pybluez时,某些功能不起作用:首先,我尝试使用该设备作为蓝牙从站。这是我最喜欢的配置。btmon显示了手机试图连接,但是pybluez从未通过sock.accept()。代码与您在pybluez上的示例中看到的几乎完全一样,我成功地将相同的代码用于股票Raspberry Pi Zero W(与集成蓝牙一起使用)。
电话显示了android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:698) ()命令中的以下错误: W/System.err: java.io.IOException: read,socket可能关闭或超时,read:-1W/System.err: at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:387) W/System.err: at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:710) W/System.err: at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:387)
很难在Pi设备的日志中找到任何有价值的东西,但我在btmon中确实看到了这一点:
ACL :Handl128个标志0x02 dlen 14 hci0 75.711662 L2CAP:命令拒绝(0x01) ident5len 6原因:请求中的CID无效(0x0002)目标CID: 0源CID: 0
我还尝试使用Android黑客直接使用通道ID (而不是UUID )进行连接(实质上跳过SDP查找)--我使用获得了通道ID,这导致了同样的错误。
在彻底地尝试了不同的东西之后,我改变了立场,尝试使用手机作为蓝牙从机,而不是设备。在这里,我看到了更多的成功,但事情仍然没有像预期的那样工作:碧蓝兹的discover_devices没有报告任何设备,尽管手机和蓝牙都显示设备是成对的。然而,如果我硬编码的设备地址,我看到的蓝牙able,我实际上能够连接。
我确信蓝牙配置有问题,可能是bluez或pybluez的版本,但我找不到其他人报告这类问题。我要注意的是,我使用的是蓝牙服务上的兼容性模式开关(否则它根本不起作用)。我相信布吕兹版本是5.43。
有人见过这样的东西吗?对解决这些问题(不同版本的bluez等)有什么建议吗?
发布于 2019-09-11 02:20:18
我最终解决了这个问题,但我不确定是哪一种改变做到了这一点:
这三个变化中的一个一定成功了。
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;
}https://stackoverflow.com/questions/57524829
复制相似问题