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
|
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
|
0bLLLL0000
|
1 - sn | Hesap Anahtarı Filtresi | değişir | |
s + 1 | uint8 |
Alan uzunluğu ve türü 0bLLLLTTTT
|
0b00100001
|
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:
- n, kalıcı hesap anahtarı listesinde bulunan hesap anahtarlarının sayısı (n >= 1) olsun.
- 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);
- Filtre F'yi, her biri 0 olarak ayarlanmış s baytlık bir dizi olarak başlatın.
uint8_t F[s] = {0};
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:
- 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.
- Tuz olarak 2 baytlık S kullanın.
- 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.