제공업체 광고 신호
광고: 검색 가능한 경우
제공업체 기기가 BR/EDR 검색 가능 (즉, 페어링 모드)인 경우 BLE를 통해 빠른 페어링 모델 ID 데이터를 광고해야 하며 BLE 주소는 회전되어서는 안 됩니다.
광고 간격: 검색 가능한 경우
광고 간격은 100ms (10Hz) 이하여야 합니다. 속도가 빠르면 탐색기가 저전력 모드에서 스캔하는 경우에도 제공자를 빠르게 찾을 수 있습니다.
광고 페이로드: 빠른 페어링 모델 ID 데이터
광고에는 서비스 데이터 데이터 유형이 포함되어야 합니다. § 1.11. UUID는 0xFE2C
의 빠른 페어링 서비스 UUID여야 합니다. 서비스 데이터에는 다음이 포함되어야 합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0-2 | uint24 |
24비트 모델 ID | 다름 |
광고: 검색할 수 없는 경우
검색할 수 없는 경우 (즉, 페어링 모드가 아님) 제공업체 기기는 다음 가이드라인에 따라 빠른 페어링 계정 데이터를 광고해야 합니다.
계정 데이터를 광고하면 근처의 검색자가 제공업체가 자신의 계정에 속하는지 인식하고 제공업체를 먼저 페어링 모드로 다시 전환하지 않고도 페어링을 시작할 수 있습니다. 이는 사용자 불만의 일반적인 원인입니다. 시커는 사용자가 제공업체와 페어링할 때까지 기다리지 않거나 브로드캐스트가 관련이 없는 경우 (예: 이미 페어링된 경우) 이 브로드캐스트를 무시할 수 있는 기회를 제공합니다. 또한 계정 데이터가 잘못 구성된 경우와 같이 분명히 잘못된 방송은 자동으로 필터링됩니다.
광고 간격: 검색할 수 없는 경우
광고 간격은 최대 250ms (4Hz)여야 합니다.
광고 페이로드: 빠른 페어링 계정 데이터
광고에는 서비스 데이터 데이터 유형이 포함되어야 합니다(Ibid.). § 1.11. UUID는 0xFE2C
의 빠른 페어링 서비스 UUID여야 합니다. 서비스 데이터에는 다음이 포함되어야 합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 |
버전 및 플래그 0bVVVVFFFF
|
0x00 (나중에 사용하기 위해 예약됨) |
1 - 다름 | 계정 키 데이터 | 다름 |
계정 키 데이터에는 다음이 포함됩니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 |
필드 길이 및 유형 0bLLLLTTTT
|
0bLLLL0000
|
1 - s | 계정 키 필터 | 다름 | |
s + 1 | uint8 |
필드 길이 및 유형 0bLLLLTTTT
|
0b00100001
|
s + 2 - s + 3 | uint16 |
Salt | 다름 |
계정 키 필터
광고된 계정 키 필터를 사용하면 검색자가 추가 상호작용 전에 제공업체가 특정 계정 키를 보유하고 있는지 빠르게 확인할 수 있습니다 (거짓양성 확률이 낮음, 평균 0.5% 미만). 거짓양성률을 더욱 줄이기 위해 시커는 유형 0으로 브로드캐스트되는 필터(즉, 계정 키 중 하나를 포함할 수 있는 UI 표시)를 감지하면 자동으로 연결되고 절차를 시작하려고 시도할 수 있습니다. 경우에 따라 제공업체가 페어링 준비가 되지 않은 상태에서 검색자에게 인식되기를 원할 수 있습니다. 한 가지 예로, 이어폰이 케이스에 다시 넣어지면 헤드셋에서 페어링을 거부할 수 있으므로 후속 페어링 알림을 표시하지 않는 것이 좋습니다.
계정 키 필터는 다음과 같이 구성된 가변 길이 블룸 필터입니다.
- 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. 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은 필터의 비트 수(s * 8)를 나눈 Xi입니다.
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를 계정 키 필터 필드로 포함합니다. 더 크거나 더 작은 중요한 바이트가 없으므로 이 값에는 '엔디언'이 없습니다. 바이트 순서를 변경하지 마세요.
소금밭
소금은 블룸 필터를 빌드할 때 계정 키에 추가되는 임의의 값입니다. 이 소금은 제공업체의 RPA가 업데이트될 때마다 재생성되어야 주소 순환에서 추적되지 않습니다.
솔트를 사용하여 계정 키 필터를 생성하려면 다음 단계를 따르세요.
- 임의의 2바이트 S를 생성합니다. 더 크거나 더 작은 중요한 바이트가 없으므로 이 값에는 '엔디언'이 없습니다. 바이트 순서를 변경하지 마세요.
- 2바이트 S를 Salt로 사용합니다.
- 광고된 빠른 페어링 계정 데이터에서 계정 키 필터 필드에 생성된 필터를 포함하고 Salt 필드에 S를 포함합니다.