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
  • V = Version
  • F = Flaggen
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
  • L = Länge des Kontoschlüsselfilters in Byte
  • T = Typ
0 Mrd. LLC
  • Länge = 0bLLLL = variiert
  • type = 0b0000 (Anzeige auf der Benutzeroberfläche anzeigen) oder 0b0010 (Anzeige auf der Benutzeroberfläche ausblenden), Kontoschlüsselfilter
1–Sek. Kontoschlüsselfilter variiert
s + 1 uint8 Feldlänge und -typ
0bLLLLTTTT
  • L = Länge in Byte
  • T = Typ
+0b00100001
  • Länge = 0b0010 = 2
  • Typ = 0b0001, Salt
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:

  1. Es ist n die Anzahl der Kontoschlüssel (n >= 1) in der persistenten Liste der Kontoschlüssel.
  2. 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);
  3. Initialisieren Sie den Filter F als Array von s Byte, die jeweils auf 0 gesetzt sind.
    uint8_t F[s] = {0};
  4. 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:

  1. 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.
  2. Verwenden Sie das 2-Byte-S als Salt.
  3. Fügen Sie in den beworbenen Kontodaten für schnelles Pairing den generierten Filter im Feld "Kontoschlüsselfilter" und S im Feld "Salt" ein.