สัญญาณการโฆษณาของผู้ให้บริการ

การโฆษณา: เมื่อค้นพบได้

เมื่ออุปกรณ์ของผู้ให้บริการสามารถค้นหา BR/EDR ได้ (นั่นคืออยู่ในโหมดการจับคู่) อุปกรณ์ จะต้องโฆษณาข้อมูลรหัสโมเดลการจับคู่ด่วนผ่าน BLE และจะต้องไม่ หมุนเวียนที่อยู่ BLE

ช่วงเวลาการโฆษณา: เมื่อค้นพบได้

ช่วงเวลาระหว่างโฆษณาควรมีค่าไม่เกิน 100 มิลลิวินาที (10 Hz) อัตราที่รวดเร็วช่วยให้ Seeker ค้นหา Provider ได้อย่างรวดเร็ว แม้ว่าจะสแกนใน โหมดประหยัดพลังงานก็ตาม

เพย์โหลดการโฆษณา: ข้อมูลรหัสโมเดลการจับคู่ด่วน

โฆษณาต้องมีประเภทข้อมูลของข้อมูลบริการ อ้างอิง § 1.11. UUID ต้องเป็น UUID ของบริการจับคู่ด่วนของ 0xFE2C ข้อมูลบริการต้องมีข้อมูลต่อไปนี้

Octet ประเภทข้อมูล คำอธิบาย ค่า
0-2 uint24 รหัสโมเดล 24 บิต แตกต่างกันไป

เพย์โหลดการโฆษณาการแชร์เสียง LE: ข้อมูลรหัสโมเดล Fast Pair และแผนที่ความสามารถของ FP

ข้อมูลบริการต้องมีข้อมูลต่อไปนี้

Octet ประเภทข้อมูล คำอธิบาย ค่า
0 uint8 เวอร์ชันและแฟล็ก
0bVVVVFFFF
  • V = เวอร์ชัน
  • F = flags
0x00
1 uint8 ความยาวและประเภทฟิลด์
0bLLLLTTTT
  • L = ความยาวของรหัสโมเดลในหน่วยไบต์
  • T = ประเภท
0bLLLL0111
  • length = 0bLLLL = แตกต่างกัน
  • type = 0b0111, Model ID
2 - รหัสโมเดล แตกต่างกันไป
s + 1 uint8 ความยาวและประเภทฟิลด์
0bLLLLTTTT
  • L = ความยาวในหน่วยไบต์
  • T = ประเภท
0bLLLL1000
s + 2 uint8 แผนที่ความสามารถของ FP แตกต่างกันไป
แผนที่ความสามารถของ FP

แผนที่ความสามารถของ FP คือบิตแมปที่แสดงฟีเจอร์ FP ที่ ผู้ให้บริการรองรับ ไบต์แรกของบิตแมปมีการกําหนดดังนี้

บิตแมป คำอธิบาย
0bRRRRRRSO R - บิตที่สงวนไว้ ปัจจุบันผู้ค้นหาจะไม่สนใจบิตนี้และจะตั้งค่าเป็น 0
S - รองรับการแชร์ FP LE Audio (ตั้งค่าเป็น 1 หากเปิดใช้ หรือ 0)
O - บิต Out of Box (OOB) ตั้งค่าเป็น 1 หากอุปกรณ์เป็นอุปกรณ์ใหม่จากโรงงาน

หากผู้ให้บริการรองรับข้อกำหนดการแชร์ LE Audio ของ FP (หมายความว่ารองรับการจับคู่ชั่วคราว เพย์โหลดการโฆษณาการแชร์ LE Audio และ Hearable control เวอร์ชัน 2) ให้ตั้งค่าบิตการรองรับการแชร์ LE Audio ของ FP เป็น 1 มิฉะนั้น ให้ตั้งค่าเป็น 0

หากผู้ให้บริการไม่ได้จับคู่กับผู้ค้นหา FP และเป็นอุปกรณ์ใหม่จากโรงงาน (หมายความว่าไม่มีคีย์บัญชี FP ในผู้ให้บริการ) ให้ตั้งค่าบิต OOB เป็น 1 มิฉะนั้นให้ตั้งค่าเป็น 0

การโฆษณา: เมื่อค้นหาไม่ได้

เมื่อตรวจหาไม่ได้ (คือไม่ได้อยู่ในโหมดการจับคู่) อุปกรณ์ของผู้ให้บริการจะต้อง โฆษณาข้อมูลบัญชีการจับคู่ด่วนโดยใช้หลักเกณฑ์ต่อไปนี้

การโฆษณาข้อมูลบัญชีช่วยให้ผู้ค้นหาที่อยู่ใกล้เคียงทราบว่าเมื่อใดที่ผู้ให้บริการ เป็นของบัญชีของตน และเริ่มการจับคู่ได้โดยไม่ต้องบังคับให้ ผู้ให้บริการกลับเข้าสู่โหมดการจับคู่ก่อน ซึ่งเป็นสาเหตุทั่วไปที่ทำให้ผู้ใช้ ร้องเรียน Seeker จะให้โอกาสผู้ใช้ในการละเว้น การออกอากาศนี้ในกรณีที่ผู้ใช้ไม่ต้องการรอจับคู่กับผู้ให้บริการหรือ การออกอากาศไม่เกี่ยวข้อง (เช่น หากจับคู่แล้ว) นอกจากนี้ Seekers ยังจะกรองการออกอากาศที่เห็นได้ชัดว่าไม่ดีออกโดยอัตโนมัติ เช่น เมื่อมีการกำหนดค่าข้อมูลบัญชีอย่างไม่ถูกต้อง

ช่วงเวลาการโฆษณา: เมื่อไม่พบ

ช่วงเวลาระหว่างโฆษณาควรอยู่ที่ 250 มิลลิวินาที (4Hz) เป็นอย่างมาก

เพย์โหลดการโฆษณา: ข้อมูลบัญชีการจับคู่ด่วน

โฆษณาต้องมีประเภทข้อมูลของข้อมูลบริการ อ้างอิง § 1.11. UUID ต้องเป็น UUID ของบริการจับคู่ด่วนของ 0xFE2C ข้อมูลบริการต้องมีข้อมูลต่อไปนี้

Octet ประเภทข้อมูล คำอธิบาย ค่า
0 uint8 เวอร์ชันและแฟล็ก
0bVVVVFFFF
  • V = เวอร์ชัน
  • F = flags
0x00
(สงวนไว้สำหรับการใช้งานในอนาคต)
1 - แตกต่างกันไป ข้อมูลคีย์บัญชี แตกต่างกันไป

ข้อมูลคีย์บัญชีประกอบด้วยข้อมูลต่อไปนี้

Octet ประเภทข้อมูล คำอธิบาย ค่า
0 uint8 ความยาวและประเภทฟิลด์
0bLLLLTTTT
  • L = ความยาวของตัวกรองคีย์บัญชีในหน่วยไบต์
  • T = ประเภท
0bLLLL0000
  • length = 0bLLLL = แตกต่างกัน
  • type = 0b0000 (แสดงข้อบ่งชี้ UI) หรือ 0b0010 (ซ่อนข้อบ่งชี้ UI), ตัวกรองคีย์บัญชี
1 - s ตัวกรองคีย์บัญชี แตกต่างกันไป
s + 1 uint8 ความยาวและประเภทฟิลด์
0bLLLLTTTT
  • L = ความยาวในหน่วยไบต์
  • T = ประเภท
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt แตกต่างกันไป

ตัวกรองคีย์บัญชี

ตัวกรองคีย์บัญชีที่โฆษณาช่วยให้ผู้ค้นหาสามารถตรวจสอบได้อย่างรวดเร็วว่าผู้ให้บริการอาจมีคีย์บัญชีหนึ่งๆ หรือไม่ (โดยมีโอกาสเกิดผลบวกลวงต่ำ ซึ่งโดยเฉลี่ยต่ำกว่า 0.5% มาก) ก่อนที่จะโต้ตอบเพิ่มเติม Seeker อาจเชื่อมต่อโดยอัตโนมัติและพยายามเริ่มกระบวนการเมื่อเห็น ตัวกรองที่ออกอากาศโดยมีประเภทเป็น 0 ซึ่งหมายถึงการแสดงข้อบ่งชี้ UI ที่ อาจมีคีย์บัญชีอย่างน้อย 1 รายการ เพื่อลดอัตราผลบวกลวงให้ดียิ่งขึ้น ในบางสถานการณ์ ผู้ให้บริการอาจต้องการให้ผู้ค้นหารับรู้ถึงการมีอยู่ของตน ในขณะที่ยังไม่พร้อมสำหรับการจับคู่ ตัวอย่างเช่น เมื่อใส่หูฟังกลับเข้าไปในเคส เราต้องการหยุดแสดงการแจ้งเตือนการจับคู่ที่ตามมา เนื่องจากชุดหูฟังอาจปฏิเสธการจับคู่นั้น

ตัวกรองคีย์บัญชีเป็นตัวกรอง Bloom ที่มีความยาวตัวแปรซึ่งสร้างขึ้นดังนี้

  1. ให้ n เป็นจำนวนคีย์บัญชี (n >= 1) ใน รายการคีย์บัญชีที่คงอยู่
  2. ให้ s ซึ่งเป็นขนาดของตัวกรองในหน่วยไบต์เป็น (1.2*n + 3) ที่ตัดทอนแล้ว เช่น หากมีการคงคีย์ไว้ 1 คีย์ s = 4 ไบต์
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. เริ่มต้นตัวกรอง F เป็นอาร์เรย์ของไบต์ s โดยตั้งค่าแต่ละไบต์เป็น 0
    uint8_t F[s] = {0};
  4. สำหรับคีย์บัญชี 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 modulo จำนวนบิตในตัวกรอง (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 คือค่าแบบสุ่มที่ต่อท้ายคีย์บัญชีเมื่อสร้าง ฟิลเตอร์ Bloom ควรสร้าง Salt นี้ใหม่ทุกครั้งที่อัปเดต RPA สำหรับ ผู้ให้บริการเพื่อหลีกเลี่ยงการติดตามเมื่อมีการหมุนเวียนที่อยู่

วิธีสร้างตัวกรองคีย์บัญชีโดยใช้ Salt

  1. สร้าง S แบบสุ่ม 2 ไบต์ โปรดทราบว่าค่านี้ไม่มี "Endianness" เนื่องจากไม่มีไบต์ที่มีนัยสำคัญมากหรือน้อยกว่า ดังนั้นอย่าเปลี่ยนลำดับไบต์
  2. ใช้ S ขนาด 2 ไบต์เป็น Salt
  3. ในข้อมูลบัญชีการจับคู่ด่วนที่โฆษณา ให้ใส่ตัวกรองที่สร้างขึ้นในช่องตัวกรองคีย์บัญชี และใส่ S ในช่อง Salt