제공업체 광고 신호
광고: 검색 가능한 경우
제공자 기기가 BR/EDR을 검색할 수 있는 경우 (즉, 페어링 모드) 빠른 페어링 모델 ID 데이터를 BLE를 통해 광고해야 하며, BLE 주소는 회전할 수 있습니다.
광고 간격: 검색 가능한 경우
광고 사이의 간격은 100ms (10Hz) 이하여야 합니다. 가 빠른 속도를 사용하면 탐색자가 프로바이더를 빠르게 찾을 수 있습니다. 이는 저전력 모드
광고 페이로드: 빠른 페어링 모델 ID 데이터
광고에는 서비스 데이터 데이터 유형(ibid., 1.11조. 이
UUID는 0xFE2C
의 빠른 페어링 서비스 UUID입니다. 서비스 데이터는
포함:
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0-2 | uint24 |
24비트 모델 ID | 다름 |
광고: 검색할 수 없는 경우
검색 가능하지 않은 경우 (즉, 페어링 모드에 있지 않은 경우) 제공자 기기는 다음 가이드라인을 사용하여 빠른 페어링 계정 데이터를 광고합니다.
계정 데이터를 광고하면 근처에 있는 탐색자가 제공업체가 언제인지 알 수 있습니다. 사용자 계정에 연결하고 기기를 직접 초기화하지 않고도 페어링을 사용자가 가장 먼저 페어링 모드로 전환하는 이유는 있습니다. 탐색자는 사용자가 광고를 무시할 수 있는 기회를 제공합니다. 이 브로드캐스트를 수신할 수 있습니다. 방송이 관련이 없는 경우 (예: 이미 페어링된 경우) 탐색자는 또한 다음과 같이 명백히 잘못된 브로드캐스트를 자동으로 필터링합니다. 계정 데이터가 잘못 구성된 경우
광고 간격: 검색할 수 없는 경우
광고 간 간격은 250ms (4Hz) 이하여야 합니다.
광고 페이로드: 빠른 페어링 계정 데이터
광고에는 서비스 데이터 데이터 유형, Ibid., 1.11조. 이
UUID는 0xFE2C
의 빠른 페어링 서비스 UUID입니다. 서비스 데이터는
포함:
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 |
버전 및 플래그 0bVVVVFFFF
|
0x00 (나중에 사용하기 위해 예약됨) |
1 - 다름 | 계정 키 데이터 | 계정 키 목록이 비어 있는 경우 또는 0x00 다름 |
계정 키 데이터에는 다음이 포함됩니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 |
필드 길이 및 유형 0bLLLLTTTT
|
0bLL0000
|
1~초 | 계정 키 필터 | 다름 | |
s + 1 | uint8 |
필드 길이 및 유형 0bLLLLTTTT
|
0b00100001
|
s + 2 - s + 3 | uint16 |
Salt | 다름 |
계정 키 필터
광고된 계정 키 필터를 사용하면 탐색자가 제공업체가 특정 계정 키를 가지고 있을 수 있음 (거짓양성이 낮음) 확률은 평균적으로 0.5% 미만). 이 탐색자가 자동으로 연결되어 수술 시작을 시도할 수 있습니다. 유형 0으로 브로드캐스트되는 필터, 즉 잘못 인식될 가능성을 줄이기 위해 계정 키 중 하나를 포함할 수 있습니다 더 빠릅니다 경우에 따라 제공업자가 페어링할 준비가 되지 않은 경우 탐색자가 연결합니다. 한 가지 예는 다시 케이스로 돌아가면 후속 페어링 알림 표시를 중단하고 헤드셋이 거부할 수 있기 때문입니다.
계정 키 필터는 가변 길이입니다. 블룸 필터는 다음과 같이 구성됩니다. 다음과 같습니다.
- n을 영구 클러스터의 계정 키 수 (n >= 1)라고 계정 키 목록.
- 필터 크기(바이트 단위)인 s를 (1.2*n + 3)으로 자릅니다. 대상
예를 들어 1개의 키가 유지되면 s는 4바이트입니다.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
- 필터 F를 각각 0으로 설정된 s 바이트의 배열로 초기화합니다.
uint8_t F[s] = {0};
유지되는 계정 키 목록에 있는 각 계정 키 K에 대해 다음을 수행합니다.
a. 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; ... }
b. SHA256을 사용한 해시 V로 32바이트 값 H 가져오기 = {H0, ..., H31}
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
c. Big Endian에서 H를 부호 없는 4바이트 정수 8개로 나눕니다. 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); }
d. 각 Xi에 대해 다음을 수행합니다.
i입니다. M을 필터의 비트 수의 Xi 모듈로 가정합니다. (s * 8).
ii. 색인 (M / 8)에서 내림한 F의 바이트를 가져옵니다.
iii. 바이트 내에서 색인 (M % 8)의 비트를 1로 설정합니다.
iv. 즉,// 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'는 없습니다. 더 많거나 적지 않기 때문에 중요한 바이트인 경우 바이트 순서를 변경하지 마세요.
소금밭
솔트는 빌드 시 계정 키에 추가되는 임의의 값입니다. 블룸 필터 RPA가 업데이트될 때마다 이 솔트를 재생성해야 함 주소 순환 전체에 걸쳐 추적을 피할 수 있습니다.
솔트를 사용하여 계정 키 필터를 생성하려면 다음 안내를 따르세요.
- 임의의 2바이트 S를 생성합니다. 'endianness'는 없습니다. 이 더 많거나 적은 바이트가 없기 때문에 바이트를 변경하지 마세요. 있습니다.
- 2바이트 S를 솔트로 사용합니다.
- 광고된 빠른 페어링 계정 데이터에서 생성된 필터를 Account Key Filter(계정 키 필터) 필드 및 S(솔트 필드)를 입력합니다.