it-swarm.com.de

Android: Wie funktionieren Bluetooth-UUIDs?

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

Meine Frage stellt sich, weil gemäß diese Frage eine Nullzeigerausnahme angezeigt wird, wenn Geräte mit Version 4.0.4 versuchen, eine Verbindung (zu einem externen Gerät, das kein Android-Gerät ist) mithilfe von Reflection 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 durch Hardcodierung der UUID für den seriellen Portdienst gemäß dieser Antwort (mit der Funktion UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");).

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

Kann mich jemand zurechtbringen?

73
ForeverWintr

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

Wenn Sie Ihren eigenen rfcomm-Server erstellen (mit listenUsingRfcommWithServiceRecord), sollten Sie Ihre eigene UUID angeben, damit die Clients, die sich mit ihm verbinden, diese identifizieren können. Dies ist einer der Gründe, warum createRfcommSocketToServiceRecord einen UUID-Parameter erfordert.

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

Siehe hier

21
nullpotent

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 ein grundlegendes BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB.

Geräte wie Sensoren für das Gesundheitswesen können einen Dienst bereitstellen, indem sie die ersten acht Ziffern durch einen vordefinierten Code ersetzen. Beispielsweise verwendet ein Gerät, das eine RFCOMM-Verbindung anbietet, Funktionscode: 0x00

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 daher dieselbe UUID verwendet.

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

25
GVillani82

Die UUID ähnelt den Portnummern im Internet. Der Unterschied zwischen Bluetooth und dem Internet besteht jedoch darin, dass bei Bluetooth die 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 sind.

6
Khaled Alanezi

UUID ist nur eine Zahl. Es hat keine Bedeutung, außer dass Sie auf der Serverseite eine 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 codieren Sie es dann wie folgt in Ihr Listener-Programm:

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

Ihr Android Serverprogramm wird auf eingehende Anfragen mit dieser UUID wie folgt warten:

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

BluetoothSocket socket = server.accept ();

4
Walker Rowe

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 ausreichend bezahlt haben). Diese Liste können Sie hier einsehen:

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

Wenn Sie einen Standarddienst implementieren (z. B. einen seriellen Anschluss, eine Tastatur, ein Headset usw.), sollten Sie die Standard-UUID dieses Dienstes verwenden, damit Sie mit Geräten kompatibel sind, 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, wenn Sie glauben, dass es sich um etwas anderes handelt. Am einfachsten ist es, zufällige zu generieren und dann das Ergebnis in Ihrer Anwendung fest zu codieren (und natürlich die gleichen UUIDs in den Geräten zu verwenden, die eine Verbindung zu Ihrem Dienst herstellen).

2
David C.

Zusammenfassend: UUid wird verwendet, um Anwendungen eindeutig zu identifizieren. Jede Anwendung hat ein eindeutiges UUid

Verwenden Sie daher für jedes Gerät dasselbe UUid

1
aykut