Werbesignal des Anbieters
Werbung: Wenn sichtbar
Wenn das Anbietergerät BR/EDR sichtbar ist (d. h. im Kopplungsmodus), werden Modell-ID-Daten für schnelles Pairing über BLE angeboten und die BLE-Adresse wird nicht rotiert.
Werbeintervall: Wenn sichtbar
Das Intervall zwischen den Anzeigen sollte nicht größer als 100 ms (10 Hz) sein. Mit einer schnellen Geschwindigkeit kann der Suchende den Anbieter auch im Energiesparmodus schnell finden.
Werbenutzlast: Modell-ID-Daten für schnelles Pairing
Die Anzeige muss den Datentyp „Dienstdaten“ enthalten (siehe oben). § 1.11. Die UUID ist die UUID des Dienstes für schnelles Pairing mit 0xFE2C
. Die Dienstdaten müssen Folgendes enthalten:
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0–2 | uint24 |
24-Bit-Modell-ID | variiert |
Werbung: Wann nicht sichtbar
Wenn das Anbietergerät nicht sichtbar ist (d. h. nicht im Kopplungsmodus), bewirbt es Kontodaten für schnelles Pairing unter Berücksichtigung der folgenden Richtlinien.
Wenn Nutzer in der Nähe ihre Kontodaten bewerben, können sie erkennen, wenn ein Anbieter zu ihrem Konto gehört, und die Kopplung einleiten, ohne dass der Anbieter zuerst in den Kopplungsmodus versetzt werden muss. Dies ist ein häufiger Grund für Nutzerbeschwerden. Suchende bieten Nutzern die Möglichkeit, diese Übertragung zu ignorieren, wenn sie nicht auf die Kopplung mit dem Anbieter warten oder die Übertragung nicht relevant ist (z. B. wenn sie bereits gekoppelt sind). Außerdem werden automatisch schlechte Broadcasts herausgefiltert, z. B. wenn die Kontodaten falsch konfiguriert sind.
Werbeintervall: Wann nicht sichtbar
Das Intervall zwischen den Anzeigen sollte maximal 250 ms (4 Hz) betragen.
Werbenutzlast: Schnelles Pairing für Kontodaten
Die Anzeige muss den Datentyp „Dienstdaten“ enthalten, ebd., § 1.11. Die UUID ist die UUID des Dienstes für schnelles Pairing mit 0xFE2C
. Die Dienstdaten müssen Folgendes enthalten:
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0 | uint8 |
Version und Flags 0bVVVVFFFF
|
0x00 (für zukünftige Verwendung reserviert) |
1 - variiert | Kontoschlüsseldaten | variiert oder 0x00 , wenn die Liste der Kontoschlüssel leer ist |
Die Kontoschlüsseldaten enthalten Folgendes:
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0 | uint8 |
Feldlänge und -typ 0bLLLLTTTT
|
0 Mrd. LLC
|
1–Sek. | Kontoschlüsselfilter | variiert | |
s + 1 | uint8 |
Feldlänge und -typ 0bLLLLTTTT
|
+0b00100001
|
s + 2 – s + 3 | uint16 |
Salt | variiert |
Kontoschlüsselfilter
Mit dem Filter für beworbene Kontoschlüssel kann ein Suchender schnell prüfen, ob ein Dienstleister einen bestimmten Kontoschlüssel hat (mit einer geringen Falsch-Positiv-Wahrscheinlichkeit, durchschnittlich viel weniger als 0,5%), bevor weitere Interaktionen stattfinden. Der Suchende kann automatisch eine Verbindung herstellen und versuchen, die Prozedur zu starten, wenn ein Filter vom Typ 0 gesendet wird, d. h. es wird auf der Benutzeroberfläche angezeigt, dass er möglicherweise einen seiner Kontoschlüssel enthält. So lässt sich die Rate falsch positiver Ergebnisse weiter reduzieren. In einigen Situationen möchte der Anbieter möglicherweise vom Suchenden erkannt werden, während er nicht zum Koppeln bereit ist. Ein Beispiel: Wenn die Kopfhörer wieder in den Lade-Case eingelegt werden, soll die nachfolgende Kopplungsbenachrichtigung nicht mehr angezeigt werden, da diese Kopplung möglicherweise vom Headset abgelehnt wird.
Der Kontoschlüsselfilter ist ein Bloom-Filter mit variabler Länge, der so aufgebaut ist:
- Es ist n die Anzahl der Kontoschlüssel (n >= 1) in der persistenten Liste der Kontoschlüssel.
- Es wird s, die Größe des Filters in Byte, (1,2*n + 3) gekürzt. Wenn beispielsweise ein Schlüssel persistent ist, gilt s = 4 Byte.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
- Initialisieren Sie den Filter F als Array von s Byte, die jeweils auf 0 gesetzt sind.
uint8_t F[s] = {0};
Führen Sie für jeden Kontoschlüssel K in der beibehaltenen Liste der Kontoschlüssel folgende Schritte aus:
a. Es ist V verkettet(K, Salt).// In the sample code, the size of salt is 2 bytes. #define SALT_SIZE 2 uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE]; for (uint8_t keyIndex = 0; keyIndex < n; keyIndex++) { // concat (K, Salt) fastpair_get_account_key_by_index(keyIndex, V); uint8_t randomSalt = (uint8_t)rand(); V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt; ... }
b. Hashen Sie V mit SHA256 und erhalten Sie den 32-Byte-Wert H = {H0, ..., H31}.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
c. Teilen Sie H in acht 4-Byte-Ganzzahlen ohne Vorzeichen in Big-Endian ein, X = {X0, ..., X7}, wobei X0 = 0xH0H1H2H3 ist.
uint32_t X[8]; for (index = 0; index < 8; index++) { X[index] = (((uint32_t)(H[index * 4])) << 24) | (((uint32_t)(H[index * 4 + 1])) << 16) | (((uint32_t)(H[index * 4 + 2])) << 8) | (((uint32_t)(H[index * 4 + 3])) << 0); }
d. Für jedes Xi gilt:
i. Es soll M Xi-Modulo der Anzahl der Bits im Filter sein (s * 8).
ii. Ruft das Byte in F beim Index (M / 8) ab und wird abgerundet.
iii. Setzen Sie innerhalb des Byte das Bit am Index (M % 8) auf 1.
iv. Mit anderen Worten:// M = Xi % (s * 8) // F[M/8] = F[M/8] | (1 << (M % 8)) for (index = 0; index < 8; index++) { uint32_t M = X[index] % (s * 8); F[M / 8] = F[M / 8] | (1 << (M % 8)); }
Fügen Sie den Filter F als Feld für den Kontoschlüsselfilter in die Werbedaten ein. Beachten Sie, dass es für diesen Wert keine "Endianness" gibt, da es kein mehr oder weniger signifikantes Byte gibt. Ändern Sie die Byte-Reihenfolge nicht.
Salt-Feld
Der Salt ist ein zufälliger Wert, der beim Erstellen des Bloomfilters an Kontoschlüssel angehängt wird. Dieser Salt sollte jedes Mal neu generiert werden, wenn der RPA für den Anbieter aktualisiert wird, um eine Verfolgung über die Adressrotation zu vermeiden.
So generieren Sie den Kontoschlüsselfilter mithilfe des Salts:
- Erzeugt ein zufälliges 2-Byte-S. Beachten Sie, dass es für diesen Wert keine "Endianness" gibt, da es kein mehr oder weniger signifikantes Byte gibt. Ändern Sie die Byte-Reihenfolge nicht.
- Verwenden Sie das 2-Byte-S als Salt.
- Fügen Sie in den beworbenen Kontodaten für schnelles Pairing den generierten Filter im Feld "Kontoschlüsselfilter" und S im Feld "Salt" ein.