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
|
0x00 |
| 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | Identyfikator modelu | różne | |
| s + 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
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
|
0x00 |
| 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | Identyfikator modelu | różne | |
| s + 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0b01101011
|
| 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:
|
| 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 = 0xe3b0c44298fc1c149afbf4c8996fb924SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25eWyodrę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
|
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
|
0bLLLL0000
|
| 1 – s | Filtr klucza konta | różne | |
| s + 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0b00100001
|
| 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:
- Niech n będzie liczbą kluczy konta (n >= 1) na utrwalonej liście kluczy konta.
- 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); - Zainicjuj filtr F jako tablicę bajtów s, z których każdy jest ustawiony na 0.
uint8_t F[s] = {0}; 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:
- 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.
- Użyj 2-bajtowego znaku S jako soli.
- W rozgłaszanych danych konta Szybkiego parowania uwzględnij wygenerowany filtr w polu Filtr klucza konta i S w polu Salt.