rfcomm generator - Android:Wie funktionieren Bluetooth UUIDs?




sdp get (5)

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

Meine Frage tritt auf, weil ich nach dieser Frage eine Null-Zeiger-Ausnahme bekomme, wenn Geräte, die 4.0.4 ausführen, versuchen, eine Verbindung herzustellen (zu einem externen, nicht-Android-Gerät), indem sie Reflektion verwenden. Die Lösung für diese Frage funktioniert jedoch nicht für mich. UUID muuid = device.getUuids()[0].getUuid(); löst eine Ausnahme aus.

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

Ich bin weiter verwundert darüber, warum ich eine UUID bereitstellen muss, um mit createInsecureRfcommSocketToServiceRecord(), einen ungesicherten rfcomm-Socket zu erstellen createInsecureRfcommSocketToServiceRecord(), aber nicht die Reflection-Methode.

Kann mich jemand aufrichten?


Answers

UUID ähnelt im Begriff den Portnummern im Internet. Der Unterschied zwischen Bluetooth und dem Internet besteht jedoch darin, dass Portnummern in Bluetooth während der 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 er antwortet mit verschiedenen Diensten, die voneinander unterscheidbar sind, indem sie unter verschiedenen UUIDs registriert sind.


UUID ist nur eine Nummer. Es hat keine Bedeutung außer Sie erstellen auf der Serverseite einer Android App. Dann verbindet sich der Client mit derselben UUID.

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

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

Ihr Android-Server-Programm wird auf eingehende Anfragen mit dieser UUID wie folgt warten:

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

Bluetooth Socket-Socket = server.accept ();


Zusammenfassend: UUid wird verwendet, um Anwendungen eindeutig zu identifizieren. Jede Anwendung hat eine eindeutige UUid

Verwenden UUid für jedes Gerät dieselbe UUid


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

Wenn Sie einen eigenen rfcomm-Server (mit listenUsingRfcommWithServiceRecord ) listenUsingRfcommWithServiceRecord , sollten Sie eine eigene UUID angeben, damit die Clients, die eine Verbindung herstellen, diese identifizieren können. createRfcommSocketToServiceRecord ist einer der Gründe, warum createRfcommSocketToServiceRecord einen UUID-Parameter benötigt.

Andernfalls haben einige allgemeine Dienste die gleiche UUID, suchen Sie nur eine, die Sie benötigen, und verwenden Sie sie.

Siehe here


Hier ist eine vollständig nicht kompatible, aber sehr performante Implementierung zum Generieren einer ASCII-sicheren GUID-ähnlichen eindeutigen Kennung.

function generateQuickGuid() {
    return Math.random().toString(36).substring(2, 15) +
        Math.random().toString(36).substring(2, 15);
}

Erzeugt 26 [a-z0-9] -Zeichen, die eine UID ergeben, die sowohl kürzer als auch eindeutiger als RFC-kompatible GUIDs ist. Bindestriche können trivial hinzugefügt werden, wenn die Lesbarkeit des Benutzers wichtig ist.

Hier sind Verwendungsbeispiele und Timings für diese Funktion sowie einige andere Antworten dieser Frage. Das Timing wurde unter Chrome m25 mit jeweils 10 Millionen Iterationen durchgeführt.

>>> generateQuickGuid()
"nvcjf1hs7tf8yyk4lmlijqkuo9"
"yq6gipxqta4kui8z05tgh9qeel"
"36dh5sec7zdj90sk2rx7pjswi2"
runtime: 32.5s

>>> GUID() // John Millikin
"7a342ca2-e79f-528e-6302-8f901b0b6888"
runtime: 57.8s

>>> regexGuid() // broofa
"396e0c46-09e4-4b19-97db-bd423774a4b3"
runtime: 91.2s

>>> createUUID() // Kevin Hakanson
"403aa1ab-9f70-44ec-bc08-5d5ac56bd8a5"
runtime: 65.9s

>>> UUIDv4() // Jed Schmidt
"f4d7d31f-fa83-431a-b30c-3e6cc37cc6ee"
runtime: 282.4s

>>> Math.uuid() // broofa
"5BD52F55-E68F-40FC-93C2-90EE069CE545"
runtime: 225.8s

>>> Math.uuidFast() // broofa
"6CB97A68-23A2-473E-B75B-11263781BBE6"
runtime: 92.0s

>>> Math.uuidCompact() // broofa
"3d7b7a06-0a67-4b67-825c-e5c43ff8c1e8"
runtime: 229.0s

>>> bitwiseGUID() // jablko
"baeaa2f-7587-4ff1-af23-eeab3e92"
runtime: 79.6s

>>>> betterWayGUID() // Andrea Turri
"383585b0-9753-498d-99c3-416582e9662c"
runtime: 60.0s

>>>> UUID() // John Fowler
"855f997b-4369-4cdb-b7c9-7142ceaf39e8"
runtime: 62.2s

Hier ist der Timing-Code.

var r;
console.time('t'); 
for (var i = 0; i < 10000000; i++) { 
    r = FuncToTest(); 
};
console.timeEnd('t');




android bluetooth uuid rfcomm