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
  • V = wersja
  • F = flagi
0x00
1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość identyfikatora modelu w bajtach
  • T = type
0bLLLL0111
  • length = 0bLLLL = zmienna
  • type = 0b0111, Identyfikator modelu
2 – s Identyfikator modelu różni się
s + 1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość w bajtach
  • T = type
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
  • V = wersja
  • F = flagi
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
  • L = długość filtra klucza konta w bajtach
  • T = type
0bLLLL0000
  • length = 0bLLLL = zmienna
  • type = 0b0000 (pokaż wskaźnik interfejsu) lub 0b0010 (ukryj wskaźnik interfejsu), filtr klucza konta
1 – s Filtr klucza konta różni się
s + 1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość w bajtach
  • T = type
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
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:

  1. Niech n będzie liczbą kluczy konta (n >= 1) na trwałej liście kluczy konta.
  2. 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);
  3. Zainicjuj filtr F jako tablicę 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 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:

  1. 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.
  2. Użyj 2-bajtowego ciągu S jako soli.
  3. W reklamowanych danych konta Szybkiego parowania umieść wygenerowany filtr w polu Filtr klucza konta, a w polu Sól wpisz S.