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
  • V = Version
  • F = Flags
0x00
1 uint8 Feldlänge und -typ
0bLLLLTTTT
  • L = Länge der Modell-ID in Byte
  • T = Typ
0bLLLL0111
  • Länge = 0bLLLL = variiert
  • type = 0b0111, Modell-ID
2 – s Modell-ID variiert
s + 1 uint8 Feldlänge und -typ
0bLLLLTTTT
  • L = Länge in Byte
  • T = Typ
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
  • V = Version
  • F = Flags
0x00
1 uint8 Feldlänge und -typ
0bLLLLTTTT
  • L = Länge der Modell-ID in Byte
  • T = Typ
0bLLLL0111
  • Länge = 0bLLLL = variiert
  • type = 0b0111, Modell-ID
2 – s Modell-ID variiert
s + 1 uint8 Feldlänge und -typ
0bLLLLTTTT
  • L = Länge der Daten des koordinierten Satzes
  • T = Typ
0b01101011
  • length = 0b0110
  • type = 0b1011
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:
  • 0x00 : linke Komponente
  • 0x01 : rechte Komponente
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 = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • Die 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
  • V = Version
  • F = Flags
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
  • L = Länge des Kontoschlüsselfilters in Byte
  • T = Typ
0bLLLL0000
  • Länge = 0bLLLL = variiert
  • type = 0b0000 (UI-Anzeige einblenden) oder 0b0010 (UI-Anzeige ausblenden), Kontoschlüsselfilter
1 – s Kontoschlüsselfilter variiert
s + 1 uint8 Feldlänge und -typ
0bLLLLTTTT
  • L = Länge in Byte
  • T = Typ
0b00100001
  • Länge = 0b0010 = 2
  • type = 0b0001, Salt
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:

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

  1. 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.
  2. Verwenden Sie das 2-Byte-S als Salt.
  3. 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.