Bluetooth経由で携帯電話に接続するために、UART経由のHCIを使用してESP32に接続されたカスタムマザーボードでRaspberry PI計算モジュール3を使用しています。部分的に機能します: 電話はデバイスとペアリングでき、デバイスは bluetoothctl UI で電話を認識でき、SDPtool はデバイスによって公開されたサービス (RFCOMM) を認識できます。
ただし、pybluez を使用すると、特定の機能が動作しません。まず、デバイスを Bluetooth スレーブとして使用してみました。これは私の好みの構成です。btmon は電話が接続しようとしているのを示しましたが、pybluez は sock.accept() を通過しません。このコードは、pybluez github の例に示されているものとほとんど同じです。私は同じコードをストックの Raspberry Pi Zero W (統合された bluetooth を使用) で正常に使用しました。
電話は socket.connect() コマンドで次のエラーを示します: W/System.err: java.io.IOException: read failed, socket might close 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
また、UUIDではなくチャネルIDを使用して直接接続するためのAndroidハックを使用してみました(本質的にSDPルックアップをスキップします)-sdptool Browse Localを使用してチャネルIDを取得しましたが、これにより同じエラーが発生しました。
さまざまなことを徹底的に試した後、ギアを切り替えて、デバイスの代わりに電話を Bluetooth スレーブとして使用しようとしました。ここでさらに成功が見られますが、まだ期待どおりに動作していません: pybluez の discover_devices はデバイスを報告しませんが、電話と bluetoothctl の両方がデバイスをペアとして表示します。ただし、bluetoothctl に表示されるデバイス アドレスをハードコーディングすると、実際に接続できます。
Bluetooth の設定、おそらく bluez や pybluez のバージョンに問題があると確信していますが、この種の問題を報告した人を他に見つけることができません。bluetoothd サービスで互換モード スイッチを使用していることに注意してください (そうしないと、まったく機能しません)。Bluez のバージョンは 5.43 だと思います。
誰もこのようなものを見たことがありますか?これらの問題のトラブルシューティングに関する提案はありますか (bluez の異なるバージョンなど)?