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
|
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
|
0bLLLL0000
|
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
|
0b00100001
|
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:
- Đặt n là số khóa tài khoản (n >= 1) còn lại Danh sách Khoá tài khoản.
- 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);
- 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};
Đố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 M là Xi 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:
- 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.
- Dùng S 2 byte làm Salt.
- 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.