Sygnał rozgłaszania aprowizatora

Reklamy: gdy są możliwe do znalezienia

Gdy urządzenie dostawcy jest wykrywalne w trybie BR/EDR (czyli w trybie parowania), powinno rozgłaszać dane identyfikatora modelu szybkiego parowania przez BLE, a adres BLE nie powinien być zmieniany.

Częstotliwość rozgłaszania: gdy urządzenie jest wykrywalne

Odstęp między rozgłaszaniem nie powinien przekraczać 100 ms (10 Hz). Szybkie tempo pozwala Poszukującemu szybko znaleźć Dostawcę, nawet podczas skanowania w trybie oszczędzania baterii.

Ładunek reklamowy: dane identyfikatora modelu Szybkiego parowania

Reklama musi zawierać typ danych Service Data, ibid., § 1.11. Identyfikator UUID powinien być identyfikatorem UUID usługi Szybkie parowanie o wartości 0xFE2C. Dane usługi powinny zawierać:

Oktet Typ danych Opis Wartość
0-2 uint24 24-bitowy identyfikator modelu różne

Dane reklamowe udostępniania dźwięku LE: dane identyfikatora modelu Szybkiego parowania i mapa funkcji Szybkiego parowania

Dane usługi zawierają:

Oktet Typ danych Opis Wartość
0 uint8 Wersja i flagi
0bVVVVFFFF
  • V = wersja
  • F = flagi
0x00
1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość identyfikatora modelu w bajtach
  • T = typ
0bLLLL0111
  • length = 0bLLLL = różne
  • type = 0b0111, identyfikator modelu
2 – s Identyfikator modelu różne
s + 1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość w bajtach
  • T = typ
0bLLLL1000
S + 2 uint8 Mapa możliwości FP różne
Mapa możliwości FP

Mapa funkcji FP to bitmapa reprezentująca funkcje FP obsługiwane przez dostawcę. Pierwszy bajt bitmapy jest zdefiniowany w ten sposób:

Bitmapa Opis
0bRRRRRRSO R – zarezerwowany bit, który będzie na razie ignorowany przez poszukiwacza i powinien być ustawiony na 0.
S – obsługa udostępniania dźwięku FP LE Audio (ustawiona na 1, jeśli jest włączona, w przeciwnym razie 0).
O – bit Out of Box (OOB), ustawiony na 1, jeśli urządzenie jest fabrycznie nowe.

Jeśli dostawca obsługuje specyfikację udostępniania dźwięku FP LE (co oznacza, że obsługuje parowanie tymczasowe, dane reklamowe udostępniania dźwięku LE i sterowanie urządzeniem słuchowym w wersji 2), ustaw bit obsługi udostępniania dźwięku FP LE na 1. W przeciwnym razie ustaw go na 0.

Jeśli dostawca nie został sparowany z żadnym urządzeniem poszukującym i jest fabrycznie nowy (co oznacza, że nie ma na nim kluczy konta FP), ustaw bit OOB na 1. W przeciwnym razie ustaw go na 0.

Dane reklamowe dotyczące skoordynowanego zestawu: dane identyfikatora modelu Szybkiego parowania i informacje o skoordynowanym zestawie Szybkiego parowania

Dane usługi zawierają:

Oktet Typ danych Opis Wartość
0 uint8 Wersja i flagi
0bVVVVFFFF
  • V = wersja
  • F = flagi
0x00
1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość identyfikatora modelu w bajtach
  • T = typ
0bLLLL0111
  • length = 0bLLLL = różne
  • type = 0b0111, identyfikator modelu
2 – s Identyfikator modelu różne
s + 1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość danych skoordynowanego zbioru
  • T = typ
0b01101011
  • length = 0b0110
  • type = 0b1011
S + 2 – S + 7 uint48 Dane skoordynowanego zestawu FP Dane 6-bajtowe, patrz Informacje o skoordynowanym zestawie FP
Informacje o skoordynowanym zestawie FP

Informacje o skoordynowanym zestawie FP służą do określenia, czy urządzenie reklamowe należy do tego samego skoordynowanego zestawu.

Oktet Typ danych Opis Wartość
0 uint8 Rozmiar zestawu skoordynowanego różne
1 uint8 Typ elementu zestawu skoordynowanego szybkiego parowania Możliwe wartości:
  • 0x00 : lewy komponent
  • 0x01 : prawy komponent
2–5 uint32 Ustawianie hasha klucza rozpoznawania tożsamości różne

Algorytm generowania wartości skrótu klucza rozpoznawania tożsamości zestawu to

  • Użyj algorytmu SHA256 do zahaszowania wartości SIRK.

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • Wyodrębnij pierwsze 4 bajty jako wartość skrótu.

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

Więcej informacji o kluczu rozpoznawania tożsamości zbioru znajdziesz w artykule Usługa skoordynowanej identyfikacji zbioru.

Rozgłaszanie: gdy urządzenie nie jest wykrywalne

Gdy urządzenie dostawcy nie jest wykrywalne (czyli nie jest w trybie parowania), powinno rozgłaszać dane konta Szybkiego parowania zgodnie z poniższymi wytycznymi.

Rozgłaszanie danych na koncie pozwala urządzeniom poszukującym w pobliżu rozpoznać, kiedy dostawca należy do ich konta, i rozpocząć parowanie bez konieczności wymuszania powrotu dostawcy do trybu parowania, co jest częstą przyczyną skarg użytkowników. Poszukiwacze umożliwią użytkownikom ignorowanie tej transmisji, jeśli nie chcą parować urządzenia z dostawcą lub transmisja nie jest istotna (np. jeśli urządzenie zostało już sparowane). Poszukiwacze będą też automatycznie odfiltrowywać ewidentnie nieprawidłowe transmisje, np. gdy dane na koncie są nieprawidłowo skonfigurowane.

Częstotliwość rozgłaszania: gdy urządzenie nie jest wykrywalne

Odstęp między rozgłaszaniem powinien wynosić maksymalnie 250 ms (4 Hz).

Ładunek reklamowy: dane konta Szybkiego parowania

Reklama musi zawierać typ danych Service Data, Ibid., § 1.11. Identyfikator UUID powinien być identyfikatorem UUID usługi Szybkie parowanie o wartości 0xFE2C. Dane usługi powinny zawierać:

Oktet Typ danych Opis Wartość
0 uint8 Wersja i flagi
0bVVVVFFFF
  • V = wersja
  • F = flagi
0x00
(zarezerwowane do wykorzystania w przyszłości)
1 – różne Dane klucza konta różne

Kluczowe dane konta zawierają:

Oktet Typ danych Opis Wartość
0 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość filtra klucza konta w bajtach
  • T = typ
0bLLLL0000
  • length = 0bLLLL = różne
  • type = 0b0000 (pokaż wskaźnik interfejsu) lub 0b0010 (ukryj wskaźnik interfejsu), filtr klucza konta
1 – s Filtr klucza konta różne
s + 1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość w bajtach
  • T = typ
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
S + 2 – S + 3 uint16 Salt różne

Filtr klucza konta

Reklamowany filtr klucza konta pozwala Poszukującemu szybko sprawdzić, czy Dostawca może posiadać określony klucz konta (z niskim prawdopodobieństwem fałszywie dodatniego wyniku, średnio znacznie mniejszym niż 0,5%), przed dalszymi interakcjami. Poszukiwacz może automatycznie połączyć się i spróbować rozpocząć procedurę, gdy zobaczy, że filtr jest transmitowany z typem 0, czyli pokazuje wskazanie interfejsu, które potencjalnie zawiera jeden z jego kluczy konta, aby jeszcze bardziej zmniejszyć liczbę wyników fałszywie dodatnich. W niektórych sytuacjach dostawca może chcieć zostać rozpoznany przez poszukującego, mimo że nie jest gotowy do sparowania. Na przykład gdy słuchawki zostaną włożone z powrotem do etui, chcemy przestać wyświetlać kolejne powiadomienia o parowaniu, ponieważ parowanie może zostać odrzucone przez zestaw słuchawkowy.

Filtr klucza konta to filtr Blooma o zmiennej długości, który jest tworzony w ten sposób:

  1. Niech n będzie liczbą kluczy konta (n >= 1) na utrwalonej liście kluczy konta.
  2. Niech s, czyli rozmiar filtra w bajtach, będzie obciętą wartością (1,2* n + 3). Jeśli na przykład zachowany jest 1 klucz, s = 4 bajty.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Zainicjuj filtr F jako tablicę bajtów s, z których każdy jest ustawiony na 0.
    uint8_t F[s] = {0};
  4. W przypadku każdego klucza konta K na zapisanej liście kluczy kont:
    a. Niech V będzie 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. Zahaszuj V za pomocą SHA256, aby uzyskać 32-bajtową wartość H = {H0, …, H31}.

    uint8_t H[32] = {0};
    SHA256_hash_function(V, H);
    

    c. Podziel H na 8 4-bajtowych liczb całkowitych bez znaku w formacie big endian, X = {X0, …, X7}, gdzie 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. Dla każdego Xi:
    i. Niech M będzie Xi modulo liczba bitów w filtrze (s * 8).
    ii. Pobierz bajt w F o indeksie (M / 8) zaokrąglonym w dół.
    iii. W bajcie ustaw bit o indeksie (M % 8) na 1.
    iv. Innymi słowy:

        // 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));
        }
    

W danych reklamowych uwzględnij filtr F jako pole Filtruj klucz konta. Pamiętaj, że ta wartość nie ma „kolejności bajtów”, ponieważ nie ma bardziej ani mniej znaczącego bajtu – nie zmieniaj kolejności bajtów.

Pole soli

Sól to losowa wartość, która jest dołączana do kluczy konta podczas tworzenia filtra Blooma. Ten ciąg zaburzający powinien być generowany ponownie za każdym razem, gdy adres RPA jest aktualizowany dla dostawcy, aby uniknąć śledzenia podczas rotacji adresów.

Aby wygenerować filtr klucza konta za pomocą soli:

  1. Wygeneruj losową 2-bajtową wartość S. Pamiętaj, że ta wartość nie ma „kolejności bajtów”, ponieważ nie ma bardziej ani mniej znaczącego bajtu – nie zmieniaj kolejności bajtów.
  2. Użyj 2-bajtowego znaku S jako soli.
  3. W rozgłaszanych danych konta Szybkiego parowania uwzględnij wygenerowany filtr w polu Filtr klucza konta i S w polu Salt.