Tín hiệu Quảng cáo của nhà cung cấp

Quảng cáo: Khi có thể phát hiện

Khi thiết bị Nhà cung cấp có thể phát hiện được BR/EDR (tức là ở chế độ ghép nối), thiết bị đó sẽ quảng cáo Dữ liệu mã nhận dạng mẫu Ghép nối nhanh qua BLE và địa chỉ BLE sẽ không được xoay.

Khoảng thời gian quảng cáo: Khi có thể khám phá

Khoảng thời gian giữa các quảng cáo không được lớn hơn 100 mili giây (10 Hz). Tốc độ nhanh cho phép Trình tìm kiếm nhanh chóng tìm thấy Nhà cung cấp, ngay cả khi quét ở chế độ tiết kiệm pin.

Trọng tải quảng cáo: Dữ liệu mã nhận dạng mẫu Ghép nối nhanh

Quảng cáo phải chứa loại dữ liệu Dữ liệu dịch vụ, tương tự như vậy, § 1.11. UUID này sẽ là UUID Dịch vụ ghép nối nhanh của 0xFE2C. Dữ liệu dịch vụ phải chứa những thông tin sau:

Octet Loại dữ liệu Mô tả Giá trị
0-2 uint24 Mã mẫu 24 bit thay đổi

Quảng cáo: Khi không thể tìm thấy

Khi không thể phát hiện (tức là không ở chế độ ghép nối), thiết bị của Nhà cung cấp sẽ quảng cáo Dữ liệu tài khoản Ghép nối nhanh theo các nguyên tắc sau.

Việc quảng cáo dữ liệu tài khoản cho phép Người tìm kiếm ở gần nhận ra thời điểm một nhà cung cấp thuộc về tài khoản của họ và bắt đầu ghép nối mà không cần phải buộc nhà cung cấp quay lại chế độ ghép nối trước (đây là nguyên nhân phổ biến khiến người dùng khiếu nại). Trình tìm kiếm sẽ cho phép người dùng bỏ qua thông báo truyền tin này trong trường hợp họ không đợi ghép nối với nhà cung cấp hoặc thông báo truyền tin không liên quan (ví dụ: nếu họ đã ghép nối). Trình tìm kiếm cũng sẽ tự động lọc ra các chương trình phát sóng rõ ràng là không tốt, chẳng hạn như khi dữ liệu tài khoản được định cấu hình không chính xác.

Khoảng thời gian quảng cáo: Khi không thể phát hiện

Khoảng thời gian giữa các quảng cáo tối đa là 250 mili giây (4 Hz).

Trọng tải quảng cáo: Dữ liệu tài khoản Ghép nối nhanh

Quảng cáo phải chứa loại dữ liệu Dữ liệu dịch vụ, Ibid., § 1.11. UUID này sẽ là UUID Dịch vụ ghép nối nhanh của 0xFE2C. Dữ liệu dịch vụ phải chứa những thông tin sau:

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Phiên bản và cờ
0bVVVVFFFF
  • V = phiên bản
  • F = cờ
0x00
(dành để sử dụng trong tương lai)
1 – biến đổi Dữ liệu khoá tài khoản biến đổi

Dữ liệu khoá tài khoản chứa:

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Độ dài và loại trường
0bLLLLTTTT
  • L = độ dài của bộ lọc khoá tài khoản tính bằng byte
  • T = loại
0bLLLL0000
  • length = 0bLLLL = varies
  • type = 0b0000 (hiển thị chỉ báo giao diện người dùng) hoặc 0b0010 (ẩn chỉ báo giao diện người dùng), Bộ lọc khoá tài khoản
1 – giây Bộ lọc khoá tài khoản thay đổi
s + 1 uint8 Độ dài và loại trường
0bLLLLTTTT
  • L = độ dài tính bằng byte
  • T = loại
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt thay đổi

Bộ lọc khoá tài khoản

Bộ lọc khoá tài khoản được quảng cáo cho phép Người tìm kiếm nhanh chóng kiểm tra xem Nhà cung cấp có thể sở hữu một khoá tài khoản nhất định hay không (với xác suất dương tính giả thấp, trung bình ít hơn 0,5% nhiều) trước khi tương tác thêm. Trình tìm kiếm có thể tự động kết nối và cố gắng bắt đầu quy trình khi thấy một bộ lọc đang được truyền tin với loại 0, tức là hiển thị chỉ báo giao diện người dùng, có thể chứa một trong các khoá tài khoản của bộ lọc đó, để giảm tỷ lệ dương tính giả hơn nữa. Trong một số trường hợp, Trình cung cấp có thể muốn Trình tìm kiếm nhận dạng mình trong khi chưa sẵn sàng ghép nối. Ví dụ: khi người dùng đặt lại tai nghe vào hộp, chúng ta muốn ngừng hiển thị thông báo ghép nối tiếp theo vì tai nghe có thể từ chối ghép nối đó.

Bộ lọc khoá tài khoản là một bộ lọc Bloom có độ dài biến đổi được tạo như sau:

  1. Giả sử n là số lượng khoá tài khoản (n >= 1) trong Danh sách khoá tài khoản ổn định.
  2. Giả sử s, kích thước của bộ lọc tính bằng byte, là (1,2*n + 3) bị cắt bớt. Ví dụ: nếu 1 khoá được duy trì, s = 4 byte.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Khởi chạy bộ lọc F dưới dạng một mảng gồm các byte s, mỗi byte được đặt thành 0.
    uint8_t F[s] = {0};
  4. Đối với mỗi khoá tài khoản K trong Danh sách khoá tài khoản ổn định:
    a. Gọi V là 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;
          ... }
    

    b. Hàm băm V bằng SHA256, nhận được giá trị 32 byte H = {H0, …, H31}.

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

    c. Chia H thành 8 số nguyên không dấu 4 byte theo thứ tự big-endian, X = {X0, …, X7}, trong đó 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. Đối với mỗi Xi:
    i. Gọi MXi theo số bit trong bộ lọc, (s * 8).
    ii. Lấy byte trong F tại chỉ mục (M / 8), làm tròn xuống.
    iii. Trong byte, hãy đặt bit tại chỉ mục (M % 8) thành 1.
    iv. Nói cách khác:

        // 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));
        }
    

Thêm bộ lọc F làm trường Bộ lọc khoá tài khoản trong dữ liệu quảng cáo. Xin lưu ý rằng không có "thứ tự byte" nào cho giá trị này, vì không có byte nào quan trọng hơn hoặc ít quan trọng hơn — đừng thay đổi thứ tự byte.

Ruộng muối

Giá trị băm là một giá trị ngẫu nhiên được thêm vào khoá tài khoản khi tạo bộ lọc bloom. Bạn nên tạo lại muối này mỗi khi cập nhật RPA để Nhà cung cấp tránh theo dõi việc xoay vòng địa chỉ.

Cách tạo Bộ lọc khoá tài khoản bằng muối:

  1. Tạo một S 2 byte ngẫu nhiên. Xin lưu ý rằng không có "thứ tự byte" đối với giá trị này, vì không có byte nào quan trọng hơn hoặc ít quan trọng hơn — đừng thay đổi thứ tự byte.
  2. Sử dụng S 2 byte làm Salt.
  3. Trong Dữ liệu tài khoản Ghép nối nhanh được quảng cáo, hãy đưa bộ lọc đã tạo vào trường Bộ lọc khoá tài khoản và S vào trường Salt (Muối).