Sygnał dostawcy dotyczący reklam

Reklamy: kiedy są widoczne

Gdy urządzenie dostawcy jest wykrywalne w sieci BR/EDR (czyli w trybie parowania), prezentuje dane identyfikatora modelu Szybkiego parowania przez BLE, a adres BLE nie jest rotowany.

Interval reklamy: kiedy można ją znaleźć

Interwał między reklamami nie powinien przekraczać 100 ms (10 Hz). Szybka częstotliwość umożliwia Szybkiemu wyszukiwaczowi szybkie znalezienie dostawcy nawet podczas skanowania w trybie niskiego poboru mocy.

Dane reklamowe: dane identyfikatora modelu Fast Pair

Reklama musi zawierać typ danych „Service Data”, ibid. § 1.11. Identyfikator UUID musi być identyfikatorem UUID usługi Szybkie parowanie w przypadku 0xFE2C. Dane usługi powinny zawierać te informacje:

Oktet Typ danych Opis Wartość
0-2 uint24 Identyfikator modelu 24-bitowy zmienia się

Reklamy: kiedy nie są widoczne

Gdy urządzenie dostawcy nie jest wykrywalne (czyli nie jest w trybie parowania), powinno reklamować dane konta Szybkiego parowania, korzystając z tych wytycznych.

Reklamowanie danych konta pozwala osobom poszukującym w pobliżu rozpoznać, kiedy dostawca należy do ich konta, i rozpocząć parowanie bez konieczności przymusowego przełączenia dostawcy z powrotem w tryb parowania, co jest częstą przyczyną skarg użytkowników. Użytkownicy będą mogli zignorować tę transmisję, jeśli nie będą czekać na sparowanie z dostawcą lub jeśli transmisja nie będzie dla nich odpowiednia (np. jeśli już się sparowali). Wyszukiwarka automatycznie odfiltrowuje też wyraźnie złe transmisje, np. gdy dane konta są źle skonfigurowane.

Interval reklamy: gdy nie jest widoczna

Interwał między reklamami powinien wynosić maksymalnie 250 ms (4 Hz).

Ładunek reklamowy: dane konta Szybkie parowanie

Reklama musi zawierać typ danych „Service Data”, Ibid., § 1.11. Identyfikator UUID musi być identyfikatorem UUID usługi Szybkie parowanie 0xFE2C. Dane usługi powinny zawierać te informacje:

Oktet Typ danych Opis Wartość
0 uint8 Wersja i flagi
0bVVVVFFFF
  • V = wersja
  • F = flagi
0x00
(zarezerwowane do użycia w przyszłości)
1 – zmienna Dane klucza konta zmienia się

Dane klucza konta obejmują:

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 = varies
  • type = 0b0000 (pokaż wskazanie w interfejsie) lub 0b0010 (ukryj wskazanie w interfejsie), Filtr klucza konta
1 – s Filtr klucza konta zmienia się
s + 1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość w bajtach
  • T = typ
0b00100001
  • długość = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt zmienia się

Filtr klucza konta

Filtr klucza konta reklamowanego umożliwia poszukującemu szybkie sprawdzenie, czy dostawca może mieć określony klucz konta (z niskim prawdopodobieństwem wyników fałszywie dodatnich, średnio poniżej 0,5%), zanim przejdzie do dalszych interakcji. Seeker może automatycznie połączyć się z urządzeniem i spróbować rozpocząć procedurę, gdy zobaczy filtr z typem 0, czyli z wskazaniem w interfejsie, że potencjalnie zawiera jeden z kluczy konta. Ma to na celu dalsze zmniejszenie liczby fałszywie dodatnich wyników. W niektórych sytuacjach dostawca może chcieć, aby usługa była rozpoznawana przez poszukującego, gdy nie jest gotowa do parowania. Przykładem może być sytuacja, gdy słuchawki są umieszczane z powrotem w etui – chcemy wtedy przestać wyświetlać kolejne powiadomienie o sparowaniu, ponieważ słuchawki mogą odrzucić to parowanie.

Filtr klucza konta to filtr Blooma o zmiennej długości zbudowany w ten sposób:

  1. Niech n będzie liczbą kluczy konta (n >= 1) w zapisanej liście kluczy konta.
  2. Niech s, czyli rozmiar filtra w bajtach, będzie (1,2*n + 3) zaokrąglone w dół. Jeśli na przykład zapisany jest 1 klucz, s = 4 bajty.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Inicjalizacja filtra F jako tablicy s bajtów, z których każdy ma wartość 0.
    uint8_t F[s] = {0};
  4. Dla każdego klucza konta K na trwałej 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. Hasz V za pomocą SHA256, uzyskując 32-bajtową wartość H = {H0, …, H31}.

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

    c. H podzielić na 8 liczb całkowitych bez znaku o długości 4 bajty w systemie 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. W przypadku każdego Xi:
    i. Niech M będzie Xi modulo liczba bitów w filtrze (s * 8).
    ii. Pobierz bajt w F pod indeksem (M / 8), zaokrąglony w dół.
    iii. W bajcie ustaw bit na pozycji (M modulo 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 dodaj filtr F jako pole Filtr klucza konta. Pamiętaj, że w przypadku tej wartości nie ma „orientacji bajtów”, ponieważ nie ma mniej ani bardziej istotnych bajtów – nie zmieniaj kolejności bajtów.

Pole solne

Sól to losowa wartość dołączana do kluczy konta podczas tworzenia filtra Blooma. Wartość soli powinna być generowana na nowo za każdym razem, gdy dostawca aktualizuje RPA, aby uniknąć śledzenia w ramach rotacji adresów.

Aby wygenerować filtr klucza konta za pomocą soli:

  1. Wygeneruj losowy 2-bajtowy S. Pamiętaj, że ta wartość nie ma „orientacji bajtów”, ponieważ nie ma bajtów o większym lub mniejszym znaczeniu – nie zmieniaj kolejności bajtów.
  2. Jako sól użyj 2-bajtowego ciągu S.
  3. W reklamowanych danych konta Szybkie parowanie podaj wygenerowany filtr w polu „Filtr klucza konta”, a w polu „Sól” wpisz S.