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
|
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
|
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, ż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:
- 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};
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:
- 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.