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

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

Khi thiết bị của 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ô hình 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 phát hiện được

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). Đáp tốc độ nhanh cho phép Người tìm kiếm nhanh chóng tìm thấy Nhà cung cấp, ngay cả khi quét trong chế độ tiết kiệm pin.

Tải trọng quảng cáo: Dữ liệu mã mô hình ghép nối nhanh

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

Bộ tám Loại dữ liệu Mô tả Giá trị
0-2 uint24 Mã mô hình 24 bit khác nhau

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

Khi không phát hiện được (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 được ghép nối nhanh theo các nguyên tắc sau.

Thông báo dữ liệu tài khoản giúp Người tìm kiếm ở gần nhận ra khi 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 phải buộc 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 đơn khiếu nại. Người tìm kiếm sẽ tạo cơ hội để người dùng có thể bỏ qua thông báo này trong trường hợp họ không chờ để 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 chúng đã được ghép nối). Người tìm kiếm cũng sẽ tự động lọc ra các thông báo hiển thị có nội dung kém chất lượng, chẳng hạn như khi dữ liệu tài khoản bị định cấu hình sai.

Khoảng thời gian quảng cáo: Khi không tìm thấy

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

Tải trọng 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. Chiến lược phát hành đĩa đơn UUID sẽ là UUID Dịch vụ ghép nối nhanh của 0xFE2C. Dữ liệu dịch vụ sẽ chứa thông tin sau:

Bộ tám 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 riêng để sử dụng trong tương lai)
1 - thay đổi Dữ liệu về khoá tài khoản thay đổi
hoặc 0x00 nếu Danh sách khoá tài khoản trống

Dữ liệu khoá tài khoản bao gồm:

Bộ tám 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
  • chiều dài = 0bLLLL = thay đổi
  • loại = 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 khác nhau
giây + 1 uint8 Độ dài và loại trường
0bLLLLTTTT
  • L = độ dài tính bằng byte
  • T = loại
0b00100001
  • chiều dài = 0b0010 = 2
  • loại = 0b0001, Muối
s + 2 - s + 3 uint16 Muối khác nhau

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 (với tỷ lệ dương tính giả thấp trung bình dưới 0, 5%), trước khi có các tương tác khác. Chiến lược phát hành đĩa đơn Người 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 phát sóng thuộc 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 để giảm tỷ lệ sai tích cực hơn nữa. Trong một số trường hợp, Nhà cung cấp có thể muốn được công nhận bởi Người tìm kiếm khi chưa sẵn sàng ghép nối. Một ví dụ là khi chồi được đặt 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 có độ dài biến đổi Bộ lọc mờ được tạo dưới dạng sau:

  1. Đặt n là số khóa tài khoản (n >= 1) còn lại Danh sách Khoá tài khoản.
  2. Cho phép s, kích thước của bộ lọc tính bằng byte, được cắt bớt (1,2*n + 3). Cho ví dụ: nếu 1 khoá được lưu, s = 4 byte.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Khởi tạo bộ lọc F dưới dạng một mảng gồm s byte, mỗi mảng đượ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 được duy trì:
    a. Cho V là nối(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 hàm SHA256, lấy 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 có kích thước 4 byte chưa ký ở 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. Đặt MXi mô-đun số bit trong bộ lọc, (giây * 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. Lưu ý rằng không có từ "endianness" với giá trị này, vì không có nhiều hơn hoặc ít hơn byte đáng kể – đừng thay đổi thứ tự byte.

Cánh đồng muối

Dữ liệu ngẫu nhiên 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 hoa. Dữ liệu ngẫu nhiên này phải được tạo lại mỗi khi cập nhật RPA cho Nhà cung cấp để tránh theo dõi qua xoay vòng địa chỉ.

Để tạo Bộ lọc khoá tài khoản bằng dữ liệu ngẫu nhiên, hãy làm như sau:

  1. Tạo một S có kích thước 2 byte ngẫu nhiên. Lưu ý rằng không có từ "endianness" vào nội dung này vì không có byte quan trọng nhiều hơn hoặc ít hơn – đừng thay đổi byte đơn đặt hàng.
  2. 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 thêm bộ lọc đã tạo trong thuộc tính trường Bộ lọc khoá tài khoản và S trong trường Salt.