Anbietersignal für Werbung
Werbung: Wenn auffindbar
Wenn das Anbietergerät über BR/EDR sichtbar ist (also im Kopplungsmodus), muss es Daten zur Modell-ID für „Schnelles Pairing“ über BLE senden und die BLE-Adresse darf nicht rotiert werden.
Advertising-Intervall: Wenn sichtbar
Das Intervall zwischen den Advertisements sollte nicht größer als 100 ms (10 Hz) sein. Eine schnelle Rate ermöglicht es dem Sucher, den Anbieter schnell zu finden, auch wenn er im Energiesparmodus scannt.
Advertising-Nutzlast: Daten zur Modell-ID für Schnelles Pairing
Das Advertisement muss den Datentyp „Service Data“ enthalten, ibid., § 1.11. Die UUID muss die UUID des Dienstes „Schnelles Pairing“ von 0xFE2C sein. Die Dienstdaten müssen Folgendes enthalten:
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0–2 | uint24 |
24-Bit-Modell-ID | variiert |
LE Audiofreigabe-Advertising-Nutzlast: Daten zur Modell-ID für „Schnelles Pairing“ und FP-Funktionszuordnung
Die Dienstdaten müssen Folgendes enthalten:
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0 | uint8 |
Version und Flags 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Feldlänge und -typ 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | Modell-ID | variiert | |
| s + 1 | uint8 |
Feldlänge und -typ 0bLLLLTTTT
|
0bLLLL1000
|
| S + 2 | uint8 |
FP-Funktionskarte | variiert |
FP-Funktionskarte
Die FP-Funktionsübersicht ist eine Bitmap, die die vom Anbieter unterstützten FP-Funktionen darstellt. Das erste Byte der Bitmap ist so definiert:
| Bitmap | Beschreibung |
|---|---|
| 0bRRRRRRSO | R – Reserviertes Bit, wird vom Sucher vorerst ignoriert und muss auf 0 gesetzt werden. S – Unterstützung für FP LE Audiofreigabe (auf 1 gesetzt, wenn aktiviert, andernfalls 0). O – Out of Box (OOB)-Bit, auf 1 gesetzt, wenn das Gerät fabrikneu ist. |
Wenn der Anbieter die FP LE Audiofreigabe-Spezifikation unterstützt (d. h. er unterstützt Temporäre Kopplung, LE Audio Sharing Advertising Payload und Hearable-Steuerung Version 2), setze das Bit für die FP LE Audiofreigabe-Unterstützung auf 1, andernfalls auf 0.
Wenn der Anbieter mit keinem FP-Sucher gekoppelt wurde und fabrikneu ist (d. h. es gibt keine FP-Kontoschlüssel auf dem Anbieter), setze das OOB-Bit auf 1, andernfalls auf 0.
Nutzlast für die Werbung mit Informationen zu koordinierten Sets: Daten zur Modell-ID für die Funktion „Schnelles Pairing“ und Informationen zu koordinierten Sets für die Funktion „Schnelles Pairing“
Die Dienstdaten müssen Folgendes enthalten:
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0 | uint8 |
Version und Flags 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Feldlänge und -typ 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | Modell-ID | variiert | |
| s + 1 | uint8 |
Feldlänge und -typ 0bLLLLTTTT
|
0b01101011
|
| S + 2 – S + 7 | uint48 |
FP – Koordinierte Set-Daten | 6-Byte-Daten, siehe FP Coordinated Set Info |
FP – Informationen zum koordinierten Set
Anhand der Informationen zum FP-koordinierten Set wird ermittelt, ob sich das Werbegerät im selben koordinierten Set befindet oder nicht.
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0 | uint8 |
Größe des koordinierten Sets | variiert |
| 1 | uint8 |
Mitgliedstyp für koordinierte Sets für „Schnelles Pairing“ | Kann einer der folgenden Werte sein:
|
| 2–5 | uint32 |
Hash für Identitätsauflösungsschlüssel festlegen | variiert |
Der Algorithmus zum Generieren des Hash-Werts des Set Identity Resolving Key ist
Verwenden Sie SHA256, um den SIRK-Wert zu hashen.
SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25eDie ersten vier Byte als Hash-Wert extrahieren
Hash Value of Set Identity Resolving Key = 0x2646036b
Weitere Informationen zum Set Identity Resolving Key finden Sie unter Coordinated Set Identification Service.
Werbung: Wenn nicht auffindbar
Wenn das Anbietergerät nicht sichtbar ist (d. h. sich nicht im Kopplungsmodus befindet), muss es die Kontodaten für die Funktion „Schnelles Pairing“ gemäß den folgenden Richtlinien bewerben.
Durch das Advertising der Kontodaten können Sucher in der Nähe erkennen, ob ein Anbieter zu ihrem Konto gehört, und die Kopplung initiieren, ohne den Anbieter zuerst wieder in den Kopplungsmodus versetzen 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 möchten oder die Übertragung nicht relevant ist (z. B. wenn sie bereits gekoppelt sind). Seeker filtern auch offensichtlich fehlerhafte Übertragungen automatisch heraus, z. B. wenn die Kontodaten falsch konfiguriert sind.
Advertising-Intervall: Wenn nicht sichtbar
Das Intervall zwischen den Advertisements sollte höchstens 250 ms (4 Hz) betragen.
Advertising-Nutzlast: „Schnelles Pairing“-Kontodaten
Die Anzeige muss den Datentyp „Service Data“ enthalten, siehe oben, § 1.11. Die UUID muss die UUID des Dienstes „Schnelles Pairing“ 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:
| 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 kann ein Sucher vor weiteren Interaktionen schnell prüfen, ob ein Anbieter einen bestimmten Kontoschlüssel hat (mit einer geringen Wahrscheinlichkeit für falsch positive Ergebnisse, im Durchschnitt weit unter 0,5 %). Der Seeker kann automatisch eine Verbindung herstellen und versuchen, den Vorgang zu starten, wenn er einen Filter mit dem Typ 0 sieht, d.h. mit einer UI-Anzeige, die möglicherweise einen seiner Kontoschlüssel enthält, um die Rate der falsch positiven Ergebnisse weiter zu reduzieren. In einigen Situationen möchte der Anbieter möglicherweise vom Sucher erkannt werden, obwohl er nicht für die Kopplung bereit ist. Wenn die Kopfhörer beispielsweise wieder in das Case gelegt werden, soll die nachfolgende Kopplungsbenachrichtigung nicht mehr angezeigt werden, da die 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 Kontoschlüsselliste.
- s, die Größe des Filters in Byte, ist (1,2* n + 3) abgeschnitten. Wenn beispielsweise 1 Schlüssel beibehalten wird, ist s = 4 Byte.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - Initialisieren Sie den Filter F als Array von s Byte, wobei jedes Byte auf 0 gesetzt ist.
uint8_t F[s] = {0}; Für jeden Kontoschlüssel K in der gespeicherten Kontoschlüsselliste:
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. Hashen Sie 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 vorzeichenlose 4-Byte-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. Rufen Sie das Byte in F am Index (M ÷ 8) ab, abgerundet.
iii. Setzen Sie das Bit im Byte 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 „Account Key Filter“ in die Werbedaten ein. Beachte, dass dieser Wert keine „Endianness“ hat, da es kein mehr oder weniger signifikantes Byte gibt. Ändere die Byte-Reihenfolge nicht.
Salzfeld
Der Salt ist ein zufälliger Wert, der beim Erstellen des Bloom-Filters an Kontoschlüssel angehängt wird. Dieser Salt sollte jedes Mal neu generiert werden, wenn die RPA für den Anbieter aktualisiert wird, um ein Tracking über die Adressrotation hinweg zu vermeiden.
So generieren Sie den Kontoschlüsselfilter mit dem Salt:
- Generiere ein zufälliges 2-Byte-S. Beachten Sie, dass dieser Wert keine „Endianness“ hat, da es kein mehr oder weniger signifikantes Byte gibt. Ändern Sie die Byte-Reihenfolge nicht.
- Verwenden Sie das 2-Byte-S als Salt.
- Füge in den beworbenen Kontodaten für die Funktion „Schnelles Pairing“ den generierten Filter in das Feld „Account Key Filter“ (Kontoschlüsselfilter) und S in das Feld „Salt“ ein.