Android: Wie funktionieren Bluetooth-UUIDs?

81

Ich verstehe nicht, was eine Bluetooth-UUID bedeutet. Bezeichnen UUIDs Protokolle (z. B. RFCOMM )? Wenn ja, warum erfordern die createRfcommSocketToServiceRecord()Methoden UUIDs, wenn sie rfcomm direkt in ihren Namen angeben? Warum hat der BluetoothChat-Beispielcode eine scheinbar willkürliche, fest codierte UUID?

Meine Frage stellt sich, weil gemäß dieser Frage eine Nullzeigerausnahme angezeigt wird, wenn Geräte mit 4.0.4 versuchen, mithilfe von Reflection eine Verbindung (zu einem externen Gerät ohne Android) herzustellen. Die Lösung dieser Frage funktioniert bei mir jedoch nicht. UUID muuid = device.getUuids()[0].getUuid();löst eine Ausnahme aus.

Bearbeiten : Ich habe dieses Problem gelöst, indem ich die UUID für den seriellen Portdienst gemäß dieser Antwort (mit UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");) fest codiert habe .

Ich bin weiter verwirrt darüber, warum ich eine UUID angeben muss, um einen ungesicherten RFCOM-Socket createInsecureRfcommSocketToServiceRecord(),mit der Reflektionsmethode zu erstellen, aber nicht.

Kann mich jemand begradigen?

ForeverWintr
quelle
Ich habe nie eine Bluetooth-Verbindung verwendet, außer für akademische Zwecke. Ich weiß jedoch, dass die UUID eine Kennung des Geräts ist, etwa eine Adresse des Geräts, und für ein Gerät dieselbe bleibt.
Noob
@Creator: Das widerspricht dieser Antwort: stackoverflow.com/a/4963069/1286571
ForeverWintr
3
Nun, das ist alles, was ich über Bluetooth-UUIDs wusste. Sie können versuchen, dieses PDF zu lesen, um die Bluetooth-Protokolle und UUIDs besser zu verstehen - people.csail.mit.edu/rudolph/Teaching/Articles/PartOfBTBook.pdf
noob
Frage: Hat dies Konsequenzen, wenn das Android-Telefon die UUID vom Remote-Gerät nicht unterstützt? (UUID nicht in Android aufgeführt ... getUuids ())?
Orri
Hey Hey Hey! Ich möchte etwas fragen, @ForeverWintr, ist es in Ordnung, wenn ich eine einzelne UUID mit meinem eigenen Format definiere und in zwei Android-Geräten verwendet werde? Ich meine, könnten sie sich gegenseitig kommunizieren?
Gumuruh

Antworten:

6

In Bluetooth werden alle Objekte durch UUIDs identifiziert. Dazu gehören Dienstleistungen, Eigenschaften und viele andere Dinge. Bluetooth verwaltet eine Datenbank mit zugewiesenen Nummern für Standardobjekte und weist Unterbereiche für Anbieter zu (die für eine Reservierung genug bezahlt haben). Sie können diese Liste hier anzeigen:

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

Wenn Sie einen Standarddienst implementieren (z. B. eine serielle Schnittstelle, eine Tastatur, ein Headset usw.), sollten Sie die Standard-UUID dieses Dienstes verwenden. Auf diese Weise können Sie mit Geräten zusammenarbeiten, die Sie nicht entwickelt haben.

Wenn Sie einen benutzerdefinierten Dienst implementieren, sollten Sie eindeutige UUIDs generieren, um sicherzustellen, dass inkompatible Geräte von Drittanbietern nicht versuchen, Ihren Dienst zu verwenden, da dies etwas anderes ist. Am einfachsten ist es, zufällige zu generieren und das Ergebnis in Ihrer Anwendung fest zu codieren (und natürlich dieselben UUIDs in den Geräten zu verwenden, die eine Verbindung zu Ihrem Dienst herstellen).

David C.
quelle
Woher bekomme ich diese UUIDs und warum sind sie immer Zeichenfolgen, die zufällig zu sein scheinen?
Luke Cross
UUIDs werden gemäß RFC 4122 generiert. Es stehen fünf verschiedene UUID-Versionen zur Auswahl. Am beliebtesten sind Version 1 (basierend auf Zeitstempel und MAC-Adresse) und Version 4 (zufällig). Siehe auch en.wikipedia.org/wiki/Universally_unique_identifier . Eine Webseite, die UUIDs für Sie generieren kann, ist uuidgenerator.net . Wenn Sie ein Bluetooth SIG-Mitglied sind, bieten sie einen Algorithmus zum Generieren von UUIDs, die an Ihre Mitglieds-ID gebunden sind.
David C.
28

Die UUID wird zur eindeutigen Identifizierung von Informationen verwendet. Es identifiziert einen bestimmten Dienst, der von einem Bluetooth-Gerät bereitgestellt wird. Der Standard definiert eine Basis BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB.

Geräte wie Gesundheitssensoren können einen Dienst bereitstellen und die ersten acht Ziffern durch einen vordefinierten Code ersetzen. Ein Gerät, das eine RFCOMM-Verbindung anbietet, verwendet beispielsweise den Funktionscode 0x0003

Ein Android-Telefon kann also eine Verbindung zu einem Gerät herstellen und dann mithilfe des Service Discovery Protocol (SDP) herausfinden, welche Dienste es bereitstellt (UUID).

In vielen Fällen müssen Sie diese festen UUIDs nicht verwenden. Wenn Sie beispielsweise eine Chat-Anwendung erstellen, interagiert ein Android-Telefon mit einem anderen Android-Telefon, das dieselbe Anwendung und damit dieselbe UUID verwendet.

So können Sie eine beliebige UUID für Ihre Anwendung festlegen, indem Sie beispielsweise einen der vielen zufälligen UUID-Generatoren im Web verwenden ( zum Beispiel ).

GVillani82
quelle
Die vollständige UUID für einen RFCOMM-Dienst lautet also: 00000003-0000-1000-8000-00805F9B34FB?
Gyozo Kudor
1
Hinweis: Sie listen die Kurzform der Dienst-ID auf, die 32 Bit ist. Sie kombinieren es mit der Basis-UUID 00000000-0000-1000-8000-00805F9B34FB des BT SIG und ersetzen die ersten 4 Ziffern der GUID. Ex. RFCOMM ist 0x0003, daher lautet die UUID für den RFCOMM-Dienst 00030000-0000-1000-8000-00805F9B34FB
sam msft
22

Es handelt sich normalerweise um einen allgemeinen Dienst (Protokoll), den ein Bluetooth-Gerät unterstützt.

Wenn Sie Ihren eigenen rfcomm-Server (mit listenUsingRfcommWithServiceRecord) erstellen , sollten Sie Ihre eigene UUID angeben, damit die damit verbundenen Clients sie identifizieren können. Dies ist einer der Gründe, warum createRfcommSocketToServiceRecordein UUID-Parameter erforderlich ist.

Andernfalls haben einige allgemeine Dienste dieselbe UUID. Suchen Sie einfach eine, die Sie benötigen, und verwenden Sie sie.

Siehe hier

nullpotent
quelle
3
tut es normalerweise ? Wann nicht? Was ich nicht verstehe, ist, warum ich beim Erstellen eines RCOMM-Servers die RFCOMM-UUID nicht verwenden würde.
ForeverWintr
1
Nun, UUIDist universelle Kennung. RFCOMM ist nur eine Schicht auf dem Bluetooth-Protokollstapel und verfügt über eine zugeordnete UUID gemäß Bluetooth-Spezifikation. und wird von der SDP verwendet, nicht ganz sicher, wofür; aber Sie können immer darüber in der Spezifikation lesen. Wenn Sie jetzt einen Dienst über dem RFCOMM-Protokoll erstellen, müssen Sie eine UUID angeben, wie sie von SDP benötigt wird, da Ihr Dienst sonst nicht erkannt wird.
nullpotent
3
Fand diesen im Web. Alle?? die UUIDs für BT. sviluppomobile.blogspot.de/2012/11/…
Orri
Link ist tot - war es eine Liste gängiger UUIDs?
user1725145
7

Die UUID ähnelt in ihrer Vorstellung den Portnummern im Internet. Der Unterschied zwischen Bluetooth und dem Internet besteht jedoch darin, dass in Bluetooth Portnummern zur Laufzeit dynamisch vom SDP-Server (Service Discovery Protocol) zugewiesen werden, wobei jeder UUID eine Portnummer zugewiesen wird. Andere Geräte fragen den SDP-Server, der unter einer reservierten Portnummer registriert ist, nach den verfügbaren Diensten auf dem Gerät und antworten mit unterschiedlichen Diensten, die sich voneinander unterscheiden, indem sie unter verschiedenen UUIDs registriert werden.

Khaled Alanezi
quelle
4

UUID ist nur eine Zahl. Es hat keine Bedeutung, außer dass Sie auf der Serverseite einer Android-App erstellen. Dann stellt der Client eine Verbindung mit derselben UUID her.

Auf der Serverseite können Sie beispielsweise zuerst uuid = UUID.randomUUID () ausführen, um eine Zufallszahl wie fb36491d-7c21-40ef-9f67-a63237b5bbea zu generieren. Speichern Sie das und speichern Sie es dann wie folgt in Ihrem Listener-Programm:

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

Ihr Android-Serverprogramm wartet auf eingehende Anfragen mit dieser UUID wie folgt:

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

BluetoothSocket socket = server.accept ();

Walker Rowe
quelle
1

Zusammenfassend: UUidWird verwendet, um Anwendungen eindeutig zu identifizieren. Jede Anwendung hat eine eindeutigeUUid

Verwenden Sie also UUidfür jedes Gerät dasselbe

Aykut
quelle
0

Die UUID steht für Universally Unique Identifier. UUID ist eine einfache 128-Bit-Ziffer, die weltweit eindeutig verteilt ist.

Bluetooth sendet Daten über Funk und alle Geräte in der Nähe können sie empfangen. Nehmen wir an, manchmal müssen Sie einige wichtige Dateien über Bluetooth senden, und alle Geräte in der Nähe können in Reichweite darauf zugreifen. Wenn Sie also mit den anderen Geräten koppeln, teilen diese einfach die UUID-Nummer und stimmen überein, bevor sie die Dateien freigeben. Wenn Sie eine Datei senden, verschlüsselt Ihr Gerät diese Datei mit der entsprechenden Geräte-UUID und gibt sie über das Netzwerk frei. Jetzt können alle Bluetooth-Geräte in der Reichweite auf die Verschlüsselungsdatei zugreifen, benötigen jedoch die richtige UUID-Nummer. Daher haben nur richtige UUID-Geräte Zugriff auf die Verschlüsselung der Datei, und andere lehnen die Ursache einer falschen UUID ab.

Kurz gesagt, Sie können UUID als geheimes Kennwort für die gemeinsame Nutzung von Dateien zwischen zwei beliebigen Bluetooth-Geräten verwenden.

Karan Nassa
quelle