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

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

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

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

ช่วงเวลาระหว่างโฆษณาต่างๆ ไม่ควรเกิน 100 มิลลิวินาที (10Hz) อัตราเร็วช่วยให้ผู้ร้องขอค้นหาผู้ให้บริการได้อย่างรวดเร็ว แม้ในการสแกนในโหมดใช้พลังงานต่ำ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ตัวกรองคีย์บัญชีที่โฆษณาช่วยให้ผู้ร้องขอตรวจสอบได้อย่างรวดเร็วว่าผู้ให้บริการอาจมีคีย์บัญชีหรือไม่ (ที่มีความน่าจะเป็นในเชิงบวกต่ำ โดยเฉลี่ยน้อยกว่า 0.5% มาก) ก่อนที่จะมีการโต้ตอบเพิ่มเติม ตัวค้นหาอาจเชื่อมต่อและพยายามเริ่มขั้นตอนโดยอัตโนมัติเมื่อพบตัวกรองเผยแพร่ด้วยประเภท 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 โมดูโลจำนวนบิตในตัวกรอง (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