Signal für Werbetreibende
Werbung: Sichtbarkeit
Wenn das Anbietergerät über BR/EDR auffindbar ist (d. h. im Kopplungsmodus), muss es Daten zur Schnell-Pairing-Modell-ID über BLE angeben und die BLE-Adresse darf nicht rotiert werden.
Anzeigenintervall: Wenn sichtbar
Das Intervall zwischen den Anzeigen darf maximal 100 ms (10 Hz) betragen. Eine hohe Rate ermöglicht es dem Sucher, den Anbieter schnell zu finden, auch wenn er im Energiesparmodus scannt.
Werbenutzlast: Daten zur Fast Pair-Modell-ID
Die Werbung muss den Datentyp „Dienstdaten“ enthalten, ebd., § 1.11. Die UUID muss die UUID des Fast Pair-Dienstes von 0xFE2C
sein. Die Dienstdaten müssen Folgendes enthalten:
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0–2 | uint24 |
24-Bit-Modell-ID | variiert |
Werbung: Wenn nicht auffindbar
Wenn das Anbietergerät nicht auffindbar ist (d. h. nicht im Kopplungsmodus), muss es gemäß den folgenden Richtlinien Fast Pair-Kontodaten angeben.
Wenn Sie die Kontodaten veröffentlichen, können Suchende in der Nähe erkennen, wenn ein Anbieter zu ihrem Konto gehört, und die Kopplung starten, ohne den Anbieter zuerst wieder in den Kopplungsmodus zwingen zu müssen. Dies ist eine häufige Ursache für Nutzerbeschwerden. Sucher 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). Offensichtlich fehlerhafte Übertragungen werden von Seekers automatisch herausgefiltert, z. B. wenn die Kontodaten falsch konfiguriert sind.
Werbeintervall: Wenn nicht auffindbar
Das Intervall zwischen den Anzeigen sollte höchstens 250 ms (4 Hz) betragen.
Werbenutzlast: Fast Pair-Kontodaten
Die Werbung muss den Datentyp „Dienstdaten“ enthalten, ebd., § 1.11. Die UUID muss die UUID des Fast Pair-Dienstes von 0xFE2C
sein. 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 |
Die Kontoschlüsseldaten enthalten Folgendes:
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0 | uint8 |
Feldlänge und Typ 0bLLLLTTTT
|
0bLLLL0000
|
1 – s | Kontoschlüsselfilter | variiert | |
s + 1 | uint8 |
Feldlänge und Typ 0bLLLLTTTT
|
0b00100001
|
s + 2 – s + 3 | uint16 |
Salt | variiert |
Kontoschlüsselfilter
Mit dem beworbenen Kontoschlüsselfilter können Suchende vor weiteren Interaktionen schnell prüfen, ob ein Anbieter einen bestimmten Kontoschlüssel hat (mit einer geringen Wahrscheinlichkeit von Falschmeldungen, durchschnittlich deutlich unter 0,5%). Der Sucher kann automatisch eine Verbindung herstellen und versuchen, den Vorgang zu starten, wenn er einen Filter mit dem Typ 0 erkennt, d.h. eine UI-Anzeige, die möglicherweise einen seiner Kontoschlüssel enthält, um die Rate der Falschmeldungen weiter zu senken. In einigen Fällen möchte der Anbieter von der Suchmaschine erkannt werden, ist aber noch nicht zum Koppeln bereit. Ein Beispiel: Wenn die In-Ear-Kopfhörer wieder in das Case gelegt werden, soll die nachfolgende Kopplungsbenachrichtigung nicht mehr angezeigt werden, da diese Kopplung vom Headset abgelehnt werden könnte.
Der Kontoschlüsselfilter ist ein Bloom-Filter mit variabler Länge, der so aufgebaut ist:
- n ist die Anzahl der Kontoschlüssel (n >= 1) in der gespeicherten Liste der Kontoschlüssel.
- Die Größe des Filters in Byte s ist (1,2*n + 3) gekürzt. Wenn beispielsweise ein Schlüssel gespeichert wird, ist s = 4 Byte.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
- Initialisieren Sie den Filter F als Array von s Byten, die jeweils auf 0 gesetzt sind.
uint8_t F[s] = {0};
Für jeden Kontoschlüssel K in der gespeicherten Liste der Kontoschlüssel:
a. V ist concat(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. Hashe V mit SHA256, um einen 32-Byte-Wert H = {H0, …, H31} zu erhalten.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
c. Teilen Sie H in acht 4-Byte-große Ganzzahlen im Big-Endian-Format auf: X = {X0, …, X7}, wobei X0 = 0xH0H1H2H3.
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:
i. M ist Xi modulo der Anzahl der Bits im Filter (s * 8).
ii. Das Byte in F am Index (M ÷ 8), abgerundet.
iii. Legen Sie innerhalb des Bytes das Bit an Index (M % 8) auf 1 fest.
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 dieser Wert keine „Endianness“ hat, da es kein mehr oder weniger signifikantes Byte gibt. Ändern Sie die Bytereihenfolge nicht.
Salzfeld
Das Salt ist ein Zufallswert, der den Kontoschlüsseln beim Erstellen des Bloom-Filters angehängt wird. Dieses Salt sollte jedes Mal neu generiert werden, wenn die RPA für den Anbieter aktualisiert wird, um eine Nachverfolgung über die Adressrotation hinweg zu vermeiden.
So generieren Sie den Kontoschlüsselfilter mit dem Salt:
- Generieren Sie eine zufällige 2-Byte-Zahl für S. Beachten Sie, dass dieser Wert keine „Endianness“ hat, da es kein mehr oder weniger signifikantes Byte gibt. Ändern Sie die Bytereihenfolge nicht.
- Verwenden Sie die 2-Byte-Zahl S als Salt.
- Fügen Sie in den beworbenen Fast Pair-Kontodaten den generierten Filter in das Feld „Kontoschlüsselfilter“ und S in das Feld „Salt“ ein.