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


81

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

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

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

createInsecureRfcommSocketToServiceRecord(),リフレクション方式を使用しているが使用していない、セキュリティで保護されていないrfcommソケットを作成するためにUUIDを指定する必要がある理由にさらに戸惑います。

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


学術目的以外でBluetooth接続を使用したことはありませんが、私が知っているのは、UUIDはデバイスの識別子であり、デバイスのアドレスのようなものであり、デバイスでも同じです。
noob 2012

@Creator:それはこの答えと矛盾します:stackoverflow.com/a/4963069/1286571
ForeverWintr 2012

3
ブルートゥースUUIDについて私が知っていたのはこれだけです。Bluetooth
noob

質問:AndroidフォンがリモートデバイスからのUUIDをサポートしていない場合、影響はありますか?(UUIDがAndroidにリストされていません... getUuids())?
Orri 2014年

よーよーよー!@ForeverWintrという質問をしたいのですが、独自の形式で単一のUUIDを定義し、2つのAndroidデバイスで使用しても大丈夫ですか?つまり、彼らはお互いにコミュニケーションをとることができますか?
グムル2014

回答:


7

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

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

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

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


これらのUUIDはどこで入手できますか?また、なぜ常にランダムに見える文字列なのですか?
ルーククロス

UUIDはRFC4122に従って生成されます。5つの異なるUUIDバージョンから選択できます。最も人気のあるのは、バージョン1(タイムスタンプとMACアドレスに基づく)とバージョン4(ランダム)です。en.wikipedia.org/wiki/Universally_unique_identifierも参照してください。UUIDを生成できるWebページはuuidgenerator.netです。Bluetooth SIGメンバーの場合、メンバーシップIDに関連付けられたUUIDを生成するためのアルゴリズムが提供されます。
デビッド・C.

29

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

ヘルスケアセンサーなどのデバイスは、最初の8桁を事前定義されたコードに置き換えてサービスを提供できます。たとえば、RFCOMM接続を提供するデバイスは、ショートコード0x0003を使用します。

そのため、Androidスマートフォンはデバイスに接続し、Service Discovery Protocol(SDP)を使用して、提供するサービス(UUID)を見つけることができます。

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

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


したがって、RFCOMMサービスの完全なUUIDは次のとおりです。00000003-0000-1000-8000-00805F9B34FB?
gyozo kudor 2015

1
注:32ビットのサービスIDの短縮形がリストされています。これをBTSIGのベースUUID00000000-0000-1000-8000-00805F9B34FBと組み合わせて、GUIDの最初の4桁を置き換えます。例 RFCOMMは0x0003であるため、RFCOMMサービスのUUIDは00030000-0000-1000-8000-00805F9B34FB
sam msft 2015年

22

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

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

それ以外の場合、一部の一般的なサービスには同じUUIDがあり、必要なものを見つけて使用するだけです。

こちらをご覧ください


3
それは通常しますか?いつですか?私が理解していないのは、RCOMMサーバーを作成している場合、RFCOMMUUIDを使用しない理由です。
ForeverWintr 2012

1
まあ、UUIDある普遍的な識別子。RFCOMMは、Bluetoothプロトコルスタック上の単なるレイヤーであり、Bluetooth仕様に従ってUUIDが関連付けられています。そしてSDPによって使用されますが、何のためにあるのか完全にはわかりません。しかし、あなたはいつでもそれについてスペックで読むことができます。これで、RFCOMMプロトコルの上にサービスを作成する場合、SDPで必要とされるUUIDを提供する必要があります。そうしないと、サービスが検出されません。
nullpotent 2012

3
これはウェブ上で見つかりました。すべて??BTのUUID。sviluppomobile.blogspot.de/2012/11/...
オッリ

リンクが切れています-それは一般的なUUIDのリストでしたか?
user17251 4519年

7

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


4

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();


1

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

したがって、UUid各デバイスに同じものを使用してください


0

UUIDは、Universally UniqueIdentifierの略です。UUIDは、世界中に一意に分散された単純な128ビットの数字です。

Bluetoothはデータを無線で送信し、近​​くのすべてのデバイスがデータを受信できます。時々、Bluetooth経由でいくつかの重要なファイルを送信する必要があり、近くのすべてのデバイスが範囲内でそれにアクセスできると仮定しましょう。したがって、他のデバイスとペアリングする場合、それらは単にUUID番号を共有し、ファイルを共有する前に一致します。ファイルを送信すると、デバイスはそのファイルを適切なデバイスUUIDで暗号化し、ネットワーク上で共有します。これで、範囲内のすべてのBluetoothデバイスが暗号化ファイルにアクセスできますが、正しいUUID番号が必要でした。したがって、正しいUUIDデバイスのみがファイルを暗号化するためのアクセス権を持ち、他のデバイスは間違ったUUIDの原因を拒否します。

つまり、UUIDを任意の2つのBluetoothデバイス間でファイルを共有するための秘密のパスワードとして使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.