web-dev-qa-db-ja.com

Android:bluetooth UUIDはどのように機能しますか?

Bluetooth UUIDの意味がわかりません。 UUIDはプロトコルを示しますか(例 RFCOMM )?もしそうなら、なぜcreateRfcommSocketToServiceRecord()メソッドは名前にrfcommを正しく指定するときにUUIDを必要とするのですか? BluetoothChatサンプルコードに、一見したところ任意のハードコードされたUUIDがあるのはなぜですか?

この質問 に従って、4.0.4を実行しているデバイスがリフレクションを使用して(Android以外の外部デバイスに)接続しようとすると、nullポインター例外が発生するため、私の質問が発生します。しかし、その質問に対する解決策は私にとってはうまくいきません。 UUID muuid = device.getUuids()[0].getUuid();は例外を発生させます。

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

createInsecureRfcommSocketToServiceRecord(),を使用して安全でないrfcommソケットを作成するためにUUIDを提供する必要があるが、リフレクションメソッドを使用しない理由にさらに困惑しています。

誰でも私をまっすぐにすることができますか?

73
ForeverWintr

通常、Bluetoothデバイスがサポートする一般的なサービス(プロトコル)を表します。

独自のrfcommサーバーを作成するとき(listenUsingRfcommWithServiceRecordを使用)、独自のUUIDを指定して、それに接続するクライアントが識別できるようにする必要があります。 createRfcommSocketToServiceRecordにUUIDパラメーターが必要な理由の1つです。

それ以外の場合、一部の一般的なサービスは同じUUIDを持ち、必要なものを見つけて使用します。

こちら をご覧ください

21
nullpotent

UUIDは、情報を一意に識別するために使用されます。 Bluetoothデバイスが提供する特定のサービスを識別します。標準では、基本的なBASE_UUID: 00000000-0000-1000-8000-00805F9B34FBが定義されています。

ヘルスケアセンサーなどのデバイスは、サービスを提供でき、最初の8桁を定義済みのコードに置き換えます。たとえば、RFCOMM接続を提供するデバイスは、 短いコード:0x00 を使用します

そのため、Android電話はデバイスに接続し、Service Discovery Protocol(SDP)を使用して、提供するサービス(UUID)を確認できます。

多くの場合、これらの固定UUIDを使用する必要はありません。たとえば、チャットアプリケーションを作成している場合、あるAndroid電話は、同じアプリケーションを使用し、したがって同じUUIDを使用する別のAndroid電話と対話します。

そのため、たとえば、Web上の多数のランダムUUIDジェネレーターの1つを使用して、アプリケーションに任意のUUIDを設定できます( たとえば )。

25
GVillani82

UUIDは、インターネットのポート番号に概念的に似ています。ただし、Bluetoothとインターネットの違いは、Bluetoothでは、各UUIDにポート番号が与えられる実行時に、ポート番号がSDP(サービス検出プロトコル)サーバーによって動的に割り当てられることです。他のデバイスは、予約済みのポート番号で登録されているSDPサーバーに、デバイスで利用可能なサービスについて質問し、異なるUUIDで登録されることにより、互いに区別できる異なるサービスで応答します。

6
Khaled Alanezi

UUIDは単なる数字です。 Androidアプリのサーバー側で作成する以外は意味がありません。次に、クライアントは同じUUIDを使用して接続します。

たとえば、サーバー側では、最初にuuid = UUID.randomUUID()を実行して、fb36491d-7c21-40ef-9f67-a63237b5bbeaのような乱数を生成できます。それを保存し、次のようにリスナープログラムにハードコードします。

 UUID uuid = UUID.fromString("fb36491d-7c21-40ef-9f67-a63237b5bbea"); 

Androidサーバープログラムは、次のようにそのUUIDで受信リクエストをリッスンします。

    BluetoothServerSocket server = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("anyName", uuid);

BluetoothSocketソケット= server.accept();

4
Walker Rowe

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

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

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

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

2
David C.

要約すると:UUidは、アプリケーションを一意に識別するために使用されます。各アプリケーションには一意のUUidがあります

したがって、各デバイスに同じUUidを使用します

1
aykut