Sygnał dostawcy dotyczący reklam
Reklamy: kiedy są dostępne
Gdy urządzenie dostawcy jest wykrywalne w trybie 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 szybkość pozwala na szybkie znalezienie dostawcy nawet podczas skanowania w trybie niskiego poboru mocy.
Dane reklamowe: dane identyfikatora modelu Fast Pair
Reklama musi zawierać typ danych „Dane usługi”, ibid. § 1.11. Identyfikator UUID musi być identyfikatorem usługi Szybkie parowanie firmy 0xFE2C
. Dane usługi muszą zawierać:
Octet | 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 zgodnie z tymi wytycznymi.
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ęstym powodem skarg użytkowników. Seekers da użytkownikom możliwość zignorowania tej transmisji, jeśli nie będą chcieli 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 reklamowy: gdy nie jest widoczny
Odstęp 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 usługi Szybkie parowanie firmy 0xFE2C
. Dane usługi muszą zawierać:
Octet | Typ danych | Opis | Wartość |
---|---|---|---|
0 | uint8 |
Wersja i flagi 0bVVVVFFFF
|
0x00 (zarezerwowany do użycia w przyszłości) |
1 – zmienna | Dane klucza konta | zmienia się |
Dane klucza konta zawierają:
Octet | Typ danych | Opis | Wartość |
---|---|---|---|
0 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0bLLLL0000
|
1 – s | Filtr klucza konta | zmienia się | |
s + 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0b00100001
|
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, który potencjalnie zawiera jeden z kluczy konta. Ma to na celu dalsze zmniejszenie liczby fałszywych wyników pozytywnych. 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, który jest tworzony w ten sposób:
- Niech n będzie liczbą kluczy konta (n >= 1) w zapisanej liście kluczy konta.
- 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);
- Inicjalizacja filtra F jako tablicy s bajtów, z których każdy ma wartość 0.
uint8_t F[s] = {0};
W przypadku 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. Wygeneruj skrót V za pomocą algorytmu SHA256, uzyskując 32-bajtową wartość H = {H0, …, H31}.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
c. Podziel H na 8 liczb całkowitych bez znaku o długości 4 bajty w systemie big-endian, gdzie X = {X0, …, X7}, a 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. Inaczej mówiąc:// 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 filtra klucza konta. Pamiętaj, że w przypadku tej wartości nie ma „orientacji bajtów”, ponieważ nie ma mniej ani bardziej znaczących bajtów – nie zmieniaj kolejności bajtów.
Pole solne
Sól to losowa wartość dołączana do kluczy konta podczas tworzenia filtra Bloom. Wartość cząsteczkową należy wygenerować ponownie za każdym razem, gdy dostawca zaktualizuje RPA, aby uniknąć śledzenia w ramach rotacji adresów.
Aby wygenerować filtr klucza konta za pomocą soli:
- 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.
- Jako sól użyj 2-bajtowego ciągu S.
- W reklamowanych danych konta Szybkie parowanie podaj wygenerowany filtr w polu „Filtr klucza konta”, a w polu „Sól” wpisz S.