Private vs öffentliche Adressen in Bluetooth Low Energy auf Android
Ein Bluetooth low energy Gerät ist eindeutig durch seine Adresse (in der Android-API, die Sie aufrufen, das die MAC-Adresse und bezeichnen es als Doppelpunkt getrennt hex-Werte (z.B. 11:aa:22:bb:33:cc).
Aber zur eindeutigen Identifizierung eines BLE-Adresse, die Sie brauchen, zu wissen, ob es eine öffentliche oder eine private Adresse. Im wesentlichen, die 49 bits, die notwendig ist um eine Adresse, die nicht 48.
Random-Adressen können entweder statisch (static random, nicht auflösbaren privaten oder den auflösbaren private und diese Typen werden getrennt durch ein bit-Muster in den beiden most significant Byte (11, 00 und 10 jeweils).
Aber ich don ' T sehen überall, dass können Sie separate öffentliche und zufällige Adressen einfach durch einen Blick auf die 48 bits in der Adresse.
Also wie funktioniert das in der Android-API? Wie wissen Sie, welches Gerät zu verbinden, wenn Sie nicht wissen, ob die Adresse die Sie angegeben haben sind public oder random?
Die API in Frage, zum Beispiel die getRemoteDevice Funktion. Es sagt:
Valid Bluetooth hardware addresses must be upper case, in a format such as
"00:11:22:33:AA:BB". The helper checkBluetoothAddress(String) is available
to validate a Bluetooth address.
A BluetoothDevice will always be returned for a valid hardware address,
even if this adapter has never seen that device.
So geben Sie die Funktion 48-bit-Daten, und es gibt keine Möglichkeit zu sagen, wenn es die Adresse ist öffentlich oder privat. Dies bedeutet das Gerät ist nicht eindeutig identifiziert.
InformationsquelleAutor der Frage Vegar Westerlund | 2014-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da sonst niemand zu haben scheint eine Antwort zu bieten, habe ich begonnen, die Prüfung auf meiner eigenen.
Ich habe versucht, eine app, erstellt ein Gerät aus einer string-Repräsentation einer Adresse und habe versucht mein Gerät mit der 48-bit-Adresse, die abwechselnd die öffentliche oder private bit, um zu sehen, was der Android-stack hat.
Mit diesem code, wenn ich meine BLE-Peripheriegerät mit einer zufälligen Adresse funktioniert alles wie erwartet. Allerdings, wenn ich versuche, läuft es mit der gleichen Adresse, mit der öffentlichkeit bit-set, logcat sagt: "Gatt angeschlossen", aber das ist einfach nicht wahr. Und ich bin nie in der Lage zu trennen.
Update: ich habe einige Tests durchführen, um dies herauszufinden. Die onConnectionStateChange Veranstaltung, die ich bekommen, ist nur die Verbindung-timing aus. Der status ist entweder 133 (wenn ich STATE_CONNECTED) oder 257 (wenn ich einen bekomme STATE_DISCONNECTED) und ich habe gesehen, beide. In jedem Fall sollte ich (und jetzt in dem Beispiel-code) brechen Sie die Verbindung und schließen Sie den client.
Habe ich auch herausgefunden, dass wenn ich einen scan erste, so dass das Gerät, das ich versuche zu verbinden, wurde vor kurzem gesehen und dann tun, eine Verbindung ausschließlich auf der Grundlage der Geräte-mac-Adresse, dann bin ich in der Lage, eine Verbindung zu beiden zufällig und öffentliche Adressen ohne Probleme.
So scheint dies ein Fehler zu sein/und oder fehlende Funktion in der Android-API. Ist es nicht möglich, eine Verbindung zu einer öffentlichen Adresse, ohne vorher gescannt. Es funktioniert aber für zufällige Adressen.
InformationsquelleAutor der Antwort Vegar Westerlund
Ist es möglich, zu erraten, ob die Adresse öffentlich ist oder Zufall, aber es wird nicht in jedem Fall funktioniert.
Wie du oben sagst, im Falle einer zufälligen Adresse, sowohl MSB sind entweder 00xx, 01xx oder 11xx... also wenn es so ist 10xx, dann ist es eine öffentliche Adresse (von einem Unternehmen, dessen OUI beginnt mit 8,9, A oder B)
Auch die Zahl der registrierten OUI ist sehr begrenzt im Vergleich zu dem, was vorhanden ist, so durch die Suche der potentiellen OUI in die IEEE-Datenbank, ein matching-Ergebnis wird wahrscheinlich bedeuten, eine öffentliche Adresse.
Registriert OUI count: ~20500, also 0.12% aus 2^24 bit 0.48% aus 2^22 bits.
Ohne die IEEE-Datenbank, ist es möglich, auf die Tatsache stützen, dass der erste LSB-von OUI ist immer 0, und der zweite LSB ist fast immer 0 (tatsächlich, es sollte immer 0, da diese Adressen sind allgemein verwaltet).
Auch andere statiscal Analyse verwendet werden können: etwa 60% der OUI beginnen mit 00. Auf der anderen Seite, ein nicht auflösbares private Adresse, hat nur eine Wahrscheinlichkeit von 1,66% beginnen mit 00 (mit uniform random generator).
InformationsquelleAutor der Antwort calandoa
Ob die Werbe-Adresse öffentlich oder privat ist, im header die Werbebotschaft. Einstellung der Adresse geben Sie in die Anwendungsschicht in öffentlichen bedeutet, dass die BLE link layer überträgt die eigentlichen "MAC" - Adresse. Einstellung der Adresse geben Sie, um statische/private auflösbar ist, zeigt an, dass die BLE-link-layer wird, balgt sich die Adresse mit einer identity resolving key (IRK).
InformationsquelleAutor der Antwort Freddy
Können Sie unterscheiden zwischen öffentlichen und privaten Adressen durch den Blick auf die 2 höchstwertigen bits. Eine Adresse ist 48 bit lang, nicht 49. Siehe Kern der Bluetooth-Spezifikation v4.2, Vol. 6, Teil B, Abschnitt 1.3.
InformationsquelleAutor der Antwort speedycat
Ich denke, dein original ist, müssen die 49 bits, um die Unterscheidung zwischen öffentlichen und zufällige Adressen' korrekt ist. Ich kann nicht finden, alles, was in der Codierung eines IEEE-öffentliche Adresse schränkt die MSB - "10", die, wenn Sie wahr wäre, würde das problem lösen.
Also das einzige was man nutzen kann, ist die "random address" - bit-Einstellung in der Werbung für das periphere oder das gleichwertige bit-Einstellung in der Verbindungs-Aufbau-Paket an die zentrale. Wenn diese bits nicht gesetzt sind, dann die Adresse, die sagte Endpunkt stellt die öffentlichkeit.
Will ich hinzufügen:
Von core-spec Vol 6 Teil B Abschnitt 1.3 Geräte-Adressen:
Aufruf von MS = die meiste bedeutende
Gibt es keine Möglichkeit zu unterscheiden, eine öffentliche Adresse aus einem der oben genannten Arten von Adressen, ohne die Adresse-Typ-flag. Damit die Notwendigkeit der "49th' - bit (zusätzliches flag). Die Adresse allein tut es nicht!
InformationsquelleAutor der Antwort Brian Reinhold