Sağlayıcı bildirme sinyali

Reklam: Bulunabilir olduğunda

Sağlayıcı cihaz BR/EDR ile bulunabilir olduğunda (yani eşleme modundayken) BLE üzerinden Hızlı Eşleme Model Kimliği Verileri'ni yayınlar ve BLE adresi döndürülmez.

Reklam aralığı: Bulunabilir olduğunda

Reklamlar arasındaki aralık 100 ms'den (10 Hz) uzun olmamalıdır. Hızlı tarama, düşük güç modunda tarama yaparken bile İstemci'nin Sağlayıcı'yı hızlı bir şekilde bulmasını sağlar.

Reklam yükü: Hızlı Eşleme Model Kimliği Verileri

Reklam, Hizmet Verileri veri türünü içermelidir. § 1.11. UUID, 0xFE2C'nın Hızlı Eşleme Hizmeti UUID'si olmalıdır. Hizmet verileri aşağıdakileri içermelidir:

Sekizlik Veri türü Açıklama Değer
0-2 uint24 24 bit model kimliği değişir

LE Audio Sharing Advertising yükü: Hızlı Eşleme Model ID Data ve FP Capability Map

Hizmet verileri aşağıdakileri içermelidir:

Sekizlik Veri türü Açıklama Değer
0 uint8 Sürüm ve işaretler
0bVVVVFFFF
  • V = sürüm
  • F = işaretler
0x00
1 uint8 Alan uzunluğu ve türü
0bLLLLTTTT
  • L = model kimliğinin bayt cinsinden uzunluğu
  • T = type
0bLLLL0111
  • uzunluk = 0bLLLL = değişken
  • type = 0b0111, Model ID
2 - s Model Kimliği değişir
s + 1 uint8 Alan uzunluğu ve türü
0bLLLLTTTT
  • L = bayt cinsinden uzunluk
  • T = type
0bLLLL1000
s + 2 uint8 FP Capability Map değişir
FP Capability Map

FP Capability Map, Sağlayıcı'nın desteklediği FP özelliklerini temsil eden bir bit eşlemidir. Bit eşlemin ilk baytı şu şekilde tanımlanır:

Bit eşlem Açıklama
0bRRRRRRSO R: Ayrılmış bit. Şimdilik arayan tarafından yoksayılır ve 0 olarak ayarlanır.
S: FP LE Audio Sharing desteği (etkinse 1, değilse 0 olarak ayarlanır).
O: Kutudan çıkarma (OOB) biti. Cihaz fabrika çıkışı yeniyse 1 olarak ayarlanır.

Sağlayıcı, FP LE Audio Sharing spesifikasyonunu destekliyorsa (yani Geçici Eşleme, LE Audio Sharing Advertising Payload ve Hearable control version 2'yi destekliyorsa) FP LE Audio Sharing destek bitini 1 olarak ayarlayın; aksi takdirde 0 olarak ayarlayın.

Sağlayıcı herhangi bir FP arayanla eşleştirilmemişse ve fabrika çıkışı yeniyse (yani sağlayıcıda FP hesap anahtarı yoksa) OOB bitini 1 olarak ayarlayın. Aksi takdirde, 0 olarak ayarlayın.

Reklam: Bulunabilir olmadığında

Bulunabilir olmadığında (yani eşleme modunda olmadığında) Sağlayıcı cihaz, aşağıdaki yönergeleri kullanarak Hızlı Eşleme Hesap Verileri'nin reklamını yapmalıdır.

Hesap verilerinin reklamının yapılması, yakındaki Talep Sahiplerinin bir sağlayıcının kendi hesaplarına ait olduğunu anlamasına ve sağlayıcıyı önce eşleme moduna geri döndürmek zorunda kalmadan eşleme başlatmasına olanak tanır. Bu, kullanıcı şikayetlerinin yaygın bir nedenidir. İstek sahipleri, sağlayıcıyla eşleşmeyi beklememeleri veya yayınla ilgilenmemeleri (ör. daha önce eşleşmişlerse) durumunda kullanıcıların bu yayını yoksayabilmelerini sağlar. Arayanlar, hesap verilerinin yanlış yapılandırılması gibi açıkça kötü olan yayınları da otomatik olarak filtreler.

Reklam aralığı: Bulunabilir olmadığında

Reklamlar arasındaki aralık en fazla 250 ms (4 Hz) olmalıdır.

Reklam yükü: Hızlı Eşleme Hesap Verileri

Reklam, Hizmet Verileri veri türünü içermelidir, Ibid., § 1.11. UUID, 0xFE2C'nın Hızlı Eşleme Hizmeti UUID'si olmalıdır. Hizmet verileri aşağıdakileri içermelidir:

Sekizlik Veri türü Açıklama Değer
0 uint8 Sürüm ve işaretler
0bVVVVFFFF
  • V = sürüm
  • F = işaretler
0x00
(gelecekte kullanım için ayrılmıştır)
1 - değişir Hesap Anahtarı Verileri değişir

Hesap Anahtarı Verileri şunları içerir:

Sekizlik Veri türü Açıklama Değer
0 uint8 Alan uzunluğu ve türü
0bLLLLTTTT
  • L = hesap anahtarı filtresinin bayt cinsinden uzunluğu
  • T = type
0bLLLL0000
  • uzunluk = 0bLLLL = değişken
  • type = 0b0000 (kullanıcı arayüzü göstergesini göster) veya 0b0010 (kullanıcı arayüzü göstergesini gizle), Hesap Anahtarı Filtresi
1 - s Hesap anahtarı filtresi değişir
s + 1 uint8 Alan uzunluğu ve türü
0bLLLLTTTT
  • L = bayt cinsinden uzunluk
  • T = type
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt değişir

Hesap anahtarı filtresi

Reklamı yapılan Hesap Anahtarı Filtresi, bir Talep Sahibi'nin daha fazla etkileşimde bulunmadan önce bir Sağlayıcı'nın belirli bir hesap anahtarına sahip olup olmadığını hızlıca kontrol etmesine olanak tanır (ortalama olarak %0,5'ten çok daha düşük bir yanlış pozitif olasılığıyla). Arayan, 0 türünde yayınlanan bir filtre gördüğünde (yani kullanıcı arayüzü göstergesi gösterildiğinde) otomatik olarak bağlanabilir ve prosedürü başlatmaya çalışabilir. Bu filtre, yanlış pozitif oranını daha da azaltmak için hesap anahtarlarından birini içerebilir. Bazı durumlarda Sağlayıcı, eşlemeye hazır değilken Arayıcı tarafından tanınmak isteyebilir. Örneğin, kulaklıklar kutuya geri konduğunda, kulaklığın eşleştirmeyi reddetme ihtimaline karşı sonraki eşleştirme bildiriminin gösterilmesini durdurmak istiyoruz.

Hesap anahtarı filtresi, aşağıdaki şekilde oluşturulan değişken uzunluklu bir Bloom filtresidir:

  1. Kalıcı hesap anahtarı listesindeki hesap anahtarlarının sayısı n olsun (n >= 1).
  2. Filtrenin bayt cinsinden boyutu olan s, (1, 2*n + 3) olarak kesilir. Örneğin, 1 anahtar kalıcı hale getirilirse s = 4 bayt olur.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. F filtresini, her biri 0 olarak ayarlanmış s baytlık bir dizi olarak başlatın.
    uint8_t F[s] = {0};
  4. Kalıcı Hesap Anahtarı listesindeki her hesap anahtarı K için:
    a. V, concat(K, Salt) olsun.

    // 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. SHA256 kullanarak V karmasını oluşturun ve 32 baytlık bir değer elde edin: H = {H0, …, H31}.

    uint8_t H[32] = {0};
    SHA256_hash_function(V, H);
    

    c. H'yi büyük endian biçiminde sekiz adet 4 baytlık işaretsiz tam sayıya bölün. X = {X0, …, X7}, burada 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. Her Xi için:
    i. M, filtredeki bit sayısının (s * 8) modülü olan Xi olsun.
    ii. (M / 8) dizinindeki F baytını alın (aşağı yuvarlanır).
    iii. Bayt içinde, dizindeki biti (M % 8) 1 olarak ayarlayın.
    iv. Başka bir deyişle:

        // 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));
        }
    

Reklam verilerinde, hesap anahtarı filtresi alanı olarak F filtresini ekleyin. Daha veya daha az önemli bir bayt olmadığından bu değerin "endianness" özelliği olmadığını unutmayın. Bayt sırasını değiştirmeyin.

Tuz tarlası

Takviye, bloom filtresi oluşturulurken hesap anahtarlarına eklenen rastgele bir değerdir. Bu tuz, adres rotasyonu boyunca izlemeyi önlemek için RPA, Sağlayıcı için her güncellendiğinde yeniden oluşturulmalıdır.

Tuz kullanarak hesap anahtarı filtresi oluşturmak için:

  1. Rastgele 2 baytlık bir S oluşturun. Daha veya daha az önemli bir bayt olmadığından bu değerin "endianness" özelliği yoktur. Bayt sırasını değiştirmeyin.
  2. Tuz olarak 2 baytlık S değerini kullanın.
  3. Reklamı yapılan Hızlı Eşleme Hesap Verileri'nde, oluşturulan filtreyi Hesap Anahtarı Filtresi alanına ve tuz alanına S değerini ekleyin.