สัญญาณการโฆษณาของผู้ให้บริการ
การโฆษณา: เมื่อค้นพบได้
เมื่ออุปกรณ์ผู้ให้บริการค้นพบได้ BR/EDR ได้ (ในโหมดการจับคู่) จะโฆษณาข้อมูลรหัสโมเดลการจับคู่ด่วนผ่าน BLE และที่อยู่ BLE จะต้องไม่ หมุนเวียนได้
ช่วงเวลาการโฆษณา: เมื่อค้นพบได้
ช่วงเวลาระหว่างโฆษณาไม่ควรเกิน 100 มิลลิวินาที (10Hz) ต อัตราเร็วทำให้ Seeker ค้นหาผู้ให้บริการได้อย่างรวดเร็วแม้ในขณะที่กำลังสแกน โหมดใช้พลังงานต่ำ
เพย์โหลดโฆษณา: ข้อมูลรหัสโมเดลการจับคู่ด่วน
โฆษณาต้องมีประเภทข้อมูลบริการ ibid มาตรา 1.11
UUID จะเป็น UUID ของบริการจับคู่ด่วนของ 0xFE2C
ข้อมูลบริการจะ
ประกอบด้วยข้อมูลต่อไปนี้
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0-2 | uint24 |
รหัสโมเดล 24 บิต | แตกต่างกัน |
การโฆษณา: เมื่อค้นพบไม่ได้
เมื่อไม่พบ (ไม่ได้อยู่ในโหมดการจับคู่) อุปกรณ์ผู้ให้บริการจะต้อง โฆษณาข้อมูลบัญชีการจับคู่ด่วนโดยใช้หลักเกณฑ์ต่อไปนี้
การโฆษณาข้อมูลบัญชีช่วยให้ผู้ค้นหาที่อยู่ใกล้เคียงสามารถจดจำได้เมื่อมีผู้ให้บริการ เป็นของบัญชีของตนและเริ่มการจับคู่โดยไม่ได้บังคับให้ ให้เข้าสู่โหมดจับคู่ก่อน ซึ่งเป็นสาเหตุทั่วไปสำหรับผู้ใช้ การร้องเรียน ผู้ค้นหาจะเปิดโอกาสให้ผู้ใช้สามารถละเว้น ในกรณีที่ลูกค้าไม่ต้องรอจับคู่กับผู้ให้บริการ หรือ การแพร่ภาพดังกล่าวไม่เกี่ยวข้อง (เช่น หากจับคู่แล้ว) นอกจากนี้ ผู้ค้นหาจะกรองการออกอากาศที่ไม่เหมาะสมออกไปโดยอัตโนมัติด้วย เช่น เมื่อข้อมูลบัญชีได้รับการกำหนดค่าอย่างไม่ถูกต้อง
ช่วงเวลาการโฆษณา: เมื่อไม่สามารถค้นพบได้
ช่วงเวลาระหว่างโฆษณาไม่ควรเกิน 250 มิลลิวินาที (4Hz)
เพย์โหลดโฆษณา: ข้อมูลบัญชีการจับคู่ด่วน
โฆษณาต้องมีประเภทข้อมูลบริการ คือ Ibid, มาตรา 1.11
UUID จะเป็น UUID ของบริการจับคู่ด่วนของ 0xFE2C
ข้อมูลบริการจะ
ประกอบด้วยข้อมูลต่อไปนี้
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0 | uint8 |
เวอร์ชันและแฟล็ก 0bVVVVFFFF
|
0x00 (สงวนไว้สำหรับการใช้งานในอนาคต) |
1 - แตกต่างกันไป | ข้อมูลคีย์บัญชี | varies หรือ 0x00 หากรายการคีย์บัญชีว่างเปล่า |
ข้อมูลคีย์บัญชีประกอบด้วย
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0 | uint8 |
ความยาวและประเภทของช่อง 0bLLLLTTTT
|
0bLLLL0000
|
1 - วินาที | ตัวกรองคีย์บัญชี | แตกต่างกัน | |
s + 1 | uint8 |
ความยาวและประเภทของช่อง 0bLLLLTTTT
|
0b00100001
|
s + 2 - s + 3 | uint16 |
เกลือ | แตกต่างกัน |
ตัวกรองคีย์บัญชี
ตัวกรองคีย์บัญชีที่โฆษณาทำให้ผู้ค้นหาสามารถตรวจสอบได้อย่างรวดเร็วว่า ผู้ให้บริการอาจมีคีย์บัญชีบางรายการ (มีค่าบวกเท็จต่ำ โดยเฉลี่ย โดยเฉลี่ย จะน้อยกว่า 0.5%) ก่อนที่จะมีการโต้ตอบเพิ่มเติม ผู้ค้นหาอาจเชื่อมต่อโดยอัตโนมัติและพยายามเริ่มขั้นตอนเมื่อเห็น ตัวกรองที่เผยแพร่ประเภท 0 นั่นคือแสดงสัญญาณบอกสถานะ UI ซึ่ง อาจมีคีย์บัญชีรายการใดรายการหนึ่ง เช่น เพื่อลดอัตราการเท็จ ในแง่บวกยิ่งขึ้นไปอีก ในบางสถานการณ์ ผู้ให้บริการอาจต้องการเป็นที่รับรู้ โดย Seeker ขณะที่ยังไม่พร้อมสำหรับการจับคู่ ตัวอย่างหนึ่งคือเมื่อหูฟังเอียร์บัด กลับเข้าไปในกรณีที่ต้องการ เราต้องการหยุดแสดงการแจ้งเตือนการจับคู่อุปกรณ์ที่ตามมา เนื่องจากชุดหูฟังอาจปฏิเสธการจับคู่ดังกล่าว
ตัวกรองคีย์บัญชีมีความยาวแปรผัน ฟิลเตอร์บลูมสร้างเป็น ดังต่อไปนี้:
- กำหนดให้ n คือจำนวนคีย์บัญชี (n >= 1) ใน รายการคีย์บัญชี
- ให้ s ซึ่งเป็นขนาดของตัวกรองในหน่วยไบต์จะถูกตัด (1.2*n + 3) สำหรับ
เช่น หากยังคงมี 1 คีย์ s = 4 ไบต์
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
- เริ่มต้นตัวกรอง F เป็นอาร์เรย์ขนาด s ไบต์ โดยแต่ละค่าจะเป็น 0
uint8_t F[s] = {0};
สำหรับคีย์บัญชีแต่ละรายการ K ในรายการคีย์บัญชีที่มีอยู่ ให้ทำดังนี้
ก. ให้ V เป็น 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; ... }
ข. แฮช V โดยใช้ SHA256 เพื่อให้ได้ค่า 32 ไบต์ H = {H0, ..., H31}
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
ค. หาร H ด้วยจำนวนเต็มที่ไม่มีเครื่องหมาย 4 ไบต์ 8 ใน Big Endian X = {X0, ..., X7} โดยที่ 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); }
ง. สำหรับ Xi แต่ละรายการ:
1. ให้ M เป็น Xi โมดูโลจำนวนบิตในตัวกรอง (s * 8)
2. หาไบต์ในหน่วย F ที่ดัชนี (M / 8) ที่ปัดเศษลง
3. ภายในไบต์ ให้ตั้งค่าบิตที่ดัชนี (M % 8) เป็น 1
4. กล่าวคือ// 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)); }
ใส่ตัวกรอง F เป็นช่องตัวกรองคีย์บัญชีในข้อมูลการโฆษณา โปรดทราบว่าไม่มี "endianness" แทนค่านี้ได้ เนื่องจากมี ไม่มากหรือน้อยกว่า ไบต์ที่สำคัญ อย่าเปลี่ยนลำดับไบต์
นาเกลือ
Salt เป็นค่าสุ่มที่ต่อท้ายคีย์บัญชีเมื่อสร้าง ฟิลเตอร์บลูม Salt นี้ควรสร้างขึ้นใหม่ทุกครั้งที่มีการอัปเดต RPA สำหรับ ของผู้ให้บริการเพื่อหลีกเลี่ยงการติดตามในการหมุนเวียนที่อยู่
วิธีสร้างตัวกรองคีย์บัญชีโดยใช้ Salt
- สร้าง S ขนาด 2 ไบต์แบบสุ่ม โปรดทราบว่าไม่มี "endianness" เป็น เนื่องจากไม่มีไบต์ที่มีนัยสำคัญมากกว่าหรือน้อยกว่า ดังนั้นอย่าแก้ไขไบต์ คำสั่งซื้อ
- ใช้ S แบบ 2 ไบต์เป็น Salt
- ในข้อมูลบัญชีการจับคู่ด่วนที่โฆษณา ให้ใส่ตัวกรองที่สร้างขึ้นในส่วน ช่องตัวกรองคีย์บัญชี และ S ในช่อง Salt