Sygnał reklamowy dostawcy
Reklamy: gdy są możliwe do znalezienia
Gdy urządzenie dostawcy jest wykrywalne w trybie BR/EDR (czyli w trybie parowania), musi ono rozgłaszać dane identyfikatora modelu Szybkiego parowania przez BLE, a adres BLE nie może być zmieniany.
Interwał rozgłaszania: gdy urządzenie jest wykrywalne
Interwał między reklamami nie powinien być większy niż 100 ms (10 Hz). Szybkie skanowanie umożliwia urządzeniu wyszukującemu szybkie znalezienie urządzenia udostępniającego, nawet podczas skanowania w trybie niskiego zużycia energii.
Ładunek reklamowy: dane identyfikatora modelu Szybkiego parowania
Reklama musi zawierać typ danych „Dane usługi”, ibid., § 1.11. Identyfikator UUID musi być identyfikatorem UUID usługi Szybkiego parowania 0xFE2C. Dane usługi powinny zawierać te informacje:
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0-2 | uint24 |
24-bitowy identyfikator modelu | różni się |
Ładunek reklamy udostępniania dźwięku LE: dane identyfikatora modelu szybkiego parowania i mapa funkcji szybkiego parowania
Dane usługi powinny zawierać te informacje:
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0 | uint8 |
Wersja i flagi 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | Identyfikator modelu | różni się | |
| s + 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0bLLLL1000
|
| s + 2 | uint8 |
Mapa możliwości FP | różni się |
Mapa możliwości FP
Mapa możliwości FP to bitmapa przedstawiająca funkcje FP obsługiwane przez dostawcę. Pierwszy bajt mapy bitowej jest zdefiniowany w ten sposób:
| Bitmapa | Opis |
|---|---|
| 0bRRRRRRSO | R – bit zarezerwowany, obecnie ignorowany przez wyszukiwarkę, powinien być ustawiony na 0. S – obsługa udostępniania dźwięku LE Audio w przypadku szybkiego parowania (ustawiony na 1, jeśli jest włączona, w przeciwnym razie na 0). O – bit „po wyjęciu z pudełka” (OOB), ustawiony na 1, jeśli urządzenie jest fabrycznie nowe. |
Jeśli dostawca obsługuje specyfikację udostępniania dźwięku LE Audio FP (co oznacza, że obsługuje tymczasowe parowanie, ładunek reklamowy udostępniania dźwięku LE Audio i wersję 2 sterowania urządzeniem słuchowym), ustaw bit obsługi udostępniania dźwięku LE Audio FP na 1; w przeciwnym razie ustaw go na 0.
Jeśli dostawca nie został sparowany z żadnym urządzeniem FP Seeker 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.
Rozgłaszanie: gdy urządzenie jest niewidoczne
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 umożliwia osobom poszukującym w pobliżu rozpoznanie, kiedy dostawca należy do ich konta, i rozpoczęcie parowania bez konieczności wymuszania ponownego przejścia dostawcy w tryb parowania, co jest częstym powodem skarg użytkowników. Wyszukiwarki umożliwią użytkownikom zignorowanie tej transmisji w przypadku, gdy nie chcą czekać na sparowanie z dostawcą lub gdy transmisja nie jest dla nich istotna (np. jeśli użytkownik jest już sparowany). Wyszukiwarki będą też automatycznie odfiltrowywać oczywiście nieprawidłowe transmisje, np. gdy dane na koncie są nieprawidłowo skonfigurowane.
Interwał rozgłaszania: gdy urządzenie nie jest wykrywalne
Odstęp między reklamami powinien wynosić maksymalnie 250 ms (4 Hz).
Ładunek reklamowy: dane konta Szybkiego parowania
Reklama musi zawierać typ danych „Dane usługi”, Ibid., § 1.11. Identyfikator UUID musi być identyfikatorem UUID usługi Szybkiego parowania 0xFE2C. Dane usługi powinny zawierać te informacje:
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0 | uint8 |
Wersja i flagi 0bVVVVFFFF
|
0x00(zarezerwowany do wykorzystania w przyszłości) |
| 1 – różni się | Dane klucza konta | różni się |
Kluczowe dane konta obejmują:
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0bLLLL0000
|
| 1 – s | Filtr klucza konta | różni się | |
| s + 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0b00100001
|
| s + 2 - s + 3 | uint16 |
Salt | różni się |
Filtr klucza konta
Reklamowany filtr klucza konta umożliwia osobie poszukującej szybkie sprawdzenie, czy dostawca może posiadać określony klucz konta (przy niskim prawdopodobieństwie fałszywie pozytywnego wyniku, średnio znacznie mniejszym niż 0,5%) przed dalszymi interakcjami. Wyszukiwarka może automatycznie nawiązywać połączenie i próbować rozpocząć procedurę, gdy zobaczy filtr z rodzajem 0, czyli wskazujący interfejs, który potencjalnie zawiera jeden z kluczy konta. Ma to na celu dalsze zmniejszenie liczby fałszywych alarmów. W niektórych sytuacjach dostawca może chcieć być rozpoznawany przez osobę poszukującą, ale nie być gotowy na sparowanie. Na przykład gdy słuchawki zostaną włożone z powrotem do etui, chcemy przestać wyświetlać kolejne powiadomienie o parowaniu, ponieważ parowanie może zostać odrzucone przez słuchawki.
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) na trwałej liście kluczy konta.
- Niech s, czyli rozmiar filtra w bajtach, będzie równy (1,2*n + 3) po obcięciu. Jeśli na przykład zapisany jest 1 klucz, s = 4 bajty.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - Zainicjuj filtr F jako tablicę 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 konta:
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. Zastosuj algorytm SHA256 do wartości V, 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 wartością Xi modulo liczby bitów w filtrze, czyli (s * 8).
ii. Pobierz bajt w F na pozycji (M / 8), zaokrąglonej w dół.
iii. W bajcie ustaw bit na pozycji (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 dotyczących reklam uwzględnij filtr F jako pole filtra klucza konta. Zwróć uwagę, ż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 solne
Salt to losowa wartość dołączana do kluczy konta podczas tworzenia filtra Blooma. Aby uniknąć śledzenia w przypadku rotacji adresów, ten sól powinien być ponownie generowany za każdym razem, gdy RPA jest aktualizowany dla dostawcy.
Aby wygenerować filtr klucza konta za pomocą soli:
- Wygeneruj losowy 2-bajtowy 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.
- Użyj 2-bajtowego ciągu S jako soli.
- W reklamowanych danych konta Szybkiego parowania umieść wygenerowany filtr w polu Filtr klucza konta, a w polu Sól wpisz S.