Werbesignal des Anbieters
Werbung: wenn sichtbar
Wenn das Gerät des Anbieters für BR/EDR sichtbar ist (d. h. im Kopplungsmodus), wird es wird Modell-ID-Daten für schnelles Pairing über BLE bewerben. Die BLE-Adresse darf keine gedreht werden soll.
Werbeintervall: wenn sichtbar
Das Intervall zwischen den Anzeigen sollte nicht größer als 100 ms (10 Hz) sein. A kann der Seeker den Dienstleister schnell finden, auch wenn er Energiesparmodus.
Werbenutzlast: Modell-ID-Daten für schnelles Pairing
Die Anzeige muss den Dienstdaten-Datentyp ebd. enthalten, § 1.11. Die
Die UUID ist die UUID des Dienstes für schnelles Pairing von 0xFE2C
. Die Dienstdaten müssen
Folgendes enthalten:
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0–2 | uint24 |
24-Bit-Modell-ID | variiert |
Werbung: wenn nicht sichtbar
Wenn das Gerät des Anbieters nicht sichtbar ist (d. h. nicht im Kopplungsmodus) Werben Sie für Kontodaten über die Funktion „Schnelles Pairing“. Beachten Sie dabei die folgenden Richtlinien.
Durch das Bewerben der Kontodaten können Interessenten in der Nähe erkennen, wenn ein Anbieter die zum Konto gehören, und starten die Kopplung, ohne wieder in den Kopplungsmodus zurück. Sucher geben Nutzern die Möglichkeit, für den Fall, dass sie nicht auf die Kopplung mit dem Anbieter oder Die Übertragung ist nicht relevant (z. B. wenn sie bereits gekoppelt sind). Außerdem werden offensichtlich schlechte Übertragungen automatisch herausgefiltert, z. B. wenn die Kontodaten falsch konfiguriert sind.
Werbeintervall: wenn nicht sichtbar
Das Intervall zwischen den Anzeigen sollte höchstens 250 ms (4 Hz) betragen.
Werbenutzlast: Kontodaten über schnelles Pairing
Die Anzeige muss den Dienstdaten-Datentyp Ebd., § 1.11. Die
Die UUID ist die UUID des Dienstes für schnelles Pairing von 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 Kontoschlüsselliste leer ist |
Die Kontoschlüsseldaten enthalten Folgendes:
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0 | uint8 |
Feldlänge und Typ 0bLLLLTTTT
|
0bLLLL0000
|
1 – s | Filter für Kontoschlüssel | variiert | |
s + 1 | uint8 |
Feldlänge und Typ 0bLLLLTTTT
|
0b00100001
|
s + 2 – s + 3 | uint16 |
Salt | variiert |
Filter für Kontoschlüssel
Mit dem beworbenen Kontoschlüsselfilter kann ein Sucher schnell überprüfen, Der Anbieter besitzt möglicherweise einen bestimmten Kontoschlüssel (mit einer geringen Anzahl falsch positiver Ergebnisse). durchschnittlich viel weniger als 0,5%) vor weiteren Interaktionen. Die Der Sucher kann automatisch eine Verbindung herstellen und versuchen, den Vorgang zu starten, wenn er Folgendes erkennt: Ein Filter vom Typ 0, der die Benutzeroberfläche anzeigt, einen seiner Kontoschlüssel enthält, um die Rate der Falschmeldungen positive Ergebnisse weiter. In einigen Fällen möchte der Dienstleister erkannt werden, aber noch nicht zum Koppeln bereit sind. Ein Beispiel ist, dass, wenn Buds Wir möchten, dass die nachfolgende Benachrichtigung zur Kopplung nicht mehr angezeigt wird. da das Koppeln vom Headset abgelehnt werden kann.
Der Kontoschlüsselfilter hat eine variable Länge Bloom-Filter wird folgendermaßen aufgebaut: folgt:
- Lassen Sie n die Anzahl der Kontoschlüssel (n >= 1) im Liste der Kontoschlüssel.
- Lassen Sie s, die Größe des Filters in Byte, durch (1,2*n + 3) gekürzt. Für
Wenn beispielsweise 1 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 aus 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) Lassen Sie V concat(K, Salt) sein.// 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. Sie hashen V mit SHA256. Sie erhalten einen 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, X = {X0, ..., X7}, wobei X0 = 0 × H0H1H2H3.
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) Lass M Xi-Modulo für die Anzahl der Bits im Filter sein, (s * 8)
ii. Ruft das Byte in F bei Index (M / 8) ab, abgerundet.
iii. Setzen Sie im Byte das Bit bei 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 Filterfeld für den Kontoschlüssel in die Werbedaten ein. Hinweis: Es gibt keine Endianness. auf diesen Wert anwenden, da nicht mehr oder weniger Byte-Reihenfolge – ändern Sie nicht die Byte-Reihenfolge.
Salzfeld
Der Salt ist ein zufälliger Wert, der beim Erstellen des Bloom-Filter. Dieser Salt sollte jedes Mal neu generiert werden, wenn der RPA für den Anbieter, 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. Hinweis: Es gibt keine Endianness. zu diesem -Wert, da es kein mehr oder weniger wichtiges Byte gibt – ändern Sie das Byte nicht Reihenfolge.
- Verwenden Sie das 2-Byte-S als Salt.
- Fügen Sie in den beworbenen Konten für die Funktion „Schnelles Pairing“ den generierten Filter in die Account Key Filter (Kontoschlüsselfilter) und S im Salt-Feld.