1. ホーム
  2. android

[解決済み] Android: BluetoothのUUIDはどのように機能するのですか?

2023-05-01 07:32:58

質問

bluetooth の UUID が何を示しているのか理解できません。UUID はプロトコルを示すのでしょうか (例. RFCOMM )? もしそうなら、なぜ createRfcommSocketToServiceRecord() メソッドの名前に rfcomm を指定しているのに、UUID を要求しているのでしょうか?BluetoothChat のサンプル コードに、一見任意でハードコードされた UUID があるのはなぜですか?

私の疑問は、次のような理由で生じました。 この質問 にあるように、4.0.4を実行しているデバイスがリフレクションを使って(外部の非アンドロイドデバイスに)接続しようとすると、ヌルポインター例外が発生するためです。しかし、その質問に対する解決策は、私のために動作しません。 UUID muuid = device.getUuids()[0].getUuid(); は例外を発生させます。

Edit : シリアルポートサービスのUUIDを以下のようにハードコーディングすることで、この問題を解決しました。 この回答 (使用する UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); ).

を使用して安全でない rfcomm ソケットを作成するために UUID を提供する必要があるのはなぜなのか、さらに不可解に思っています。 createInsecureRfcommSocketToServiceRecord(), を使用して安全でないrfcommソケットを作成するのに、リフレクションメソッドを使用しないのはなぜなのか、さらに不可解です。

どなたか教えてください。

どのように解決するのですか?

Bluetooth では、すべてのオブジェクトは UUID によって識別されます。 これには、サービス、特性、その他多くのものが含まれます。 Bluetooth では、標準オブジェクトに割り当てられた番号のデータベースを維持し、ベンダー (予約のために十分な料金を支払った) に対してサブレンジを割り当てています。 このリストはここで見ることができます。

https://www.bluetooth.com/specifications/assigned-numbers/

もしあなたが標準的なサービス (シリアルポート、キーボード、ヘッドセットなど) を実装しているなら、そのサービスの標準的な UUID を使用するべきです - そうすれば、あなたが開発していないデバイスと相互運用できるようになります。

カスタム サービスを実装している場合、互換性のないサード パーティ製デバイスが、そのサービスを別のものだと思って使用しようとしないようにするため、固有の UUID を生成する必要があります。 最も簡単な方法は、ランダムなものを生成し、その結果をアプリケーションにハードコードすることです (そして、もちろん、サービスに接続するデバイスで同じ UUID を使用します)。