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

Quảng cáo: Khi phát hiện được

Khi thiết bị của Nhà cung cấp có thể phát hiện BR/EDR (nghĩa là ở chế độ ghép nối), thiết bị đó sẽ quảng cáo Dữ liệu mã 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 có thể phát hiện

Khoảng thời gian giữa các quảng cáo không được lớn hơn 100 mili giây (10Hz). 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.

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

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

Bạch tuộc 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 phát hiện được

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 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 nhà cung cấp thuộc tài khoản của họ và bắt đầu ghép nối mà không 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 người dùng cơ hội 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 phù hợp (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 thông báo rõ ràng không hợp lệ, 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 thể tìm thấy

Khoảng thời gian giữa các quảng cáo không được vượt quá 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 sẽ chứa loại dữ liệu Dữ liệu dịch vụ, Ibid., § 1.11. UUID sẽ là UUID Dịch vụ ghép nối nhanh của 0xFE2C. Dữ liệu dịch vụ phải chứa các nội dung sau:

Bạch tuộc Loại dữ liệu Mô tả Giá trị
0 uint8 Phiên bản và cờ
0bVVVFFFF
  • V = phiên bản
  • F = cờ
0x00
(dành riêng để sử dụng trong tương lai)
1 – khác nhau Dữ liệu về khoá tài khoản thay đổi
hoặc 0x00 nếu Danh sách khóa tài khoản trống

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

Bạch tuộc 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 = khác nhau
  • 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 khác nhau
s + 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 Salt 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ể có 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 dưới 0,5%), trước khi có các tương tác tiếp theo. 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 thông báo loại 0, tức là đang hiển thị chỉ báo giao diện người dùng, có khả năng chứa một trong các khoá tài khoản của bộ lọc đó, để giảm thêm tỷ lệ dương tính giả. Trong một số trường hợp, Nhà cung cấp có thể muốn được Trình tìm kiếm nhận dạng trong khi chưa sẵn sàng ghép nối. Một ví dụ là khi tai nghe đặt lại tai nghe vào trường 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 hoạt động ghép nối đó.

Bộ lọc khoá tài khoản là bộ lọc Kiểu nở hoa có độ dài thay đổi được tạo như sau:

  1. Đặt n là số khoá tài khoản (n >= 1) trong Danh sách khoá tài khoản được duy trì.
  2. Giả sử s, kích thước của bộ lọc tính bằng byte, được cắt bớt (1.2*n + 3). 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 tạo bộ lọc F dưới dạng một mảng s byte, 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 hiện có:
    a. Đặt 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. Băm V bằng SHA256, nhận 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 hệ cuối lớn, 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, (s * 8).
    ii. Lấy byte trong F tại chỉ mục (M / 8), được làm tròn xuống.
    iii. Trong byte, đặ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));
        }
    

Bao gồ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ó "sự kết thúc" nào đối với giá trị này vì không có byte nào quan trọng hơn hoặc ít hơn, nên đừ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 bloom. Dữ liệu ngẫu nhiên này phải được tạo lại mỗi khi RPA được cập nhật cho Nhà cung cấp để tránh theo dõi khi xoay vòng địa chỉ.

Cách tạo Bộ lọc khoá tài khoản bằng dữ liệu ngẫu nhiên:

  1. Tạo một S 2 byte ngẫu nhiên. Lưu ý rằng không có "sự kết thúc" đối với giá trị này vì không có byte quan trọng nào nhiều hơn hoặc ít hơn - không thay đổi thứ tự byte.
  2. Sử dụng S 2 byte làm Dữ liệu ngẫu nhiên.
  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 trường Bộ lọc khoá tài khoản và S trong trường Salt.