Sağlayıcı reklamcılık sinyali

Reklamcılık: Ne zaman bulunabilir?

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

Reklam aralığı: Keşfedilebilir olduğunda

Reklamlar arasındaki aralık en fazla 100 ms (10 Hz) olmalıdır. Yüksek hız, Arayanın düşük güç modunda tarama yaparken bile Sağlayıcıyı hızlıca bulmasını sağlar.

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

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

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

Reklamcılık: Keşfedilebilir olmadığında

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

Hesap verilerinin reklamını yapmak, yakındaki arayanların bir sağlayıcının kendi hesaplarına ait olduğunu tanımasına ve sağlayıcıyı önce eşleme moduna geri döndürmek zorunda kalmadan eşlemeyi başlatmasına olanak tanır. Bu, kullanıcı şikayetlerinin yaygın bir nedenidir. Aracılar, kullanıcıların sağlayıcıyla eşlemeyi beklemediği veya yayının alakalı olmadığı durumlarda (ör. zaten eşleşmişse) bu yayını yoksaymasına olanak tanır. Aracılar, hesap verileri yanlış yapılandırıldığında olduğu gibi, açıkça kötü yayınları da otomatik olarak filtreler.

Reklam verme aralığı: Keşfedilebilir olmadığında

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

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

Reklam, Hizmet Verileri veri türünü içermelidir. § 1.11. UUID, 0xFE2C için Hızlı Eşleme Hizmeti UUID'si olmalıdır. Hizmet verileri şunları 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ılmak üzere 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 = tür
0bLLLL0000
  • length = 0bLLLL = değişir
  • type = 0b0000 (kullanıcı arayüzü göstergesi göster) veya 0b0010 (kullanıcı arayüzü göstergesini gizle), Hesap Anahtarı Filtresi
1 - sn Hesap Anahtarı Filtresi değişir
s + 1 uint8 Alan uzunluğu ve türü
0bLLLLTTTT
  • L = bayt cinsinden uzunluk
  • T = tür
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, arayanların daha fazla etkileşimden önce sağlayıcının belirli bir hesap anahtarına sahip olup olmadığını hızlıca kontrol etmesine olanak tanır (yanlış pozitif olasılığı düşüktür, ortalama olarak %0,5'ten çok daha azdır). Arayan, yanlış pozitif oranını daha da azaltmak için 0 türünde bir filtrenin yayınlandığını (ör.kullanıcı arayüzü göstergesi gösteriliyor) gördüğünde otomatik olarak bağlanıp işlemi başlatmayı deneyebilir. Bu filtre, hesabının anahtarlarından birini içerebilir. Bazı durumlarda, sağlayıcı eşlemeye hazır olmasa bile arayan tarafından tanınmak isteyebilir. Örneğin, kulaklık kılıfına geri yerleştirildiğinde eşleme kulaklıklı mikrofon seti tarafından reddedilebileceği için sonraki eşleme bildirimini göstermeyi durdurmak isteriz.

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

  1. n, kalıcı hesap anahtarı listesinde bulunan hesap anahtarlarının sayısı (n >= 1) olsun.
  2. Filtrenin bayt cinsinden boyutu olan s, (1, 2*n + 3) kesilmiş olsun. Örneğin, 1 anahtar kalıcıysa s = 4 bayttır.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Filtre F'yi, her biri 0 olarak ayarlanmış s baytlık bir dizi olarak başlatın.
    uint8_t F[s] = {0};
  4. Kayıtlı hesap anahtarı listesinde 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'yi karma oluşturarak 32 baytlık bir değer H = {H0, …, H31} elde edin.

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

    c. H değerini büyük endian olarak sekiz adet 4 baytlık işaretsiz tam sayıya bölün. X = {X0, …, X7}. Bu ifadede 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ına (s * 8) modulo Xi olsun.
    ii. F'deki M / 8 dizinli baytı (aşağı yuvarlanıp) alın.
    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 verilerine, hesap anahtarı filtresi alanı olarak F filtresini ekleyin. Daha fazla veya daha az önemli bayt olmadığından bu değerde "endianness" olmadığını unutmayın. Bayt sırasını değiştirmeyin.

Tuz tarlası

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

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

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