제공업체 광고 신호
광고: 검색 가능한 경우
제공업체 기기가 BR/EDR 검색 가능(즉, 페어링 모드)이면 BLE를 통해 빠른 페어링 모델 ID 데이터를 광고해야 하며(shall) BLE 주소는 순환되지 않아야 합니다(shall not).
광고 간격: 검색 가능할 때
광고 간 간격은 100ms (10Hz) 이하여야 합니다. 빠른 속도를 사용하면 탐색기가 저전력 모드에서 스캔할 때도 제공자를 빠르게 찾을 수 있습니다.
광고 페이로드: 빠른 페어링 모델 ID 데이터
광고에는 서비스 데이터 데이터 유형이 포함되어야 합니다(ibid.). § 1.11. UUID는 빠른 페어링 서비스 UUID인 0xFE2C여야 합니다. 서비스 데이터에는 다음이 포함되어야 합니다.
| 옥텟 | 데이터 유형 | 설명 | 값 |
|---|---|---|---|
| 0-2 | uint24 |
24비트 모델 ID | 다름 |
LE 오디오 공유 광고 페이로드: 빠른 페어링 모델 ID 데이터 및 FP 기능 맵
서비스 데이터에는 다음이 포함되어야 합니다.
| 옥텟 | 데이터 유형 | 설명 | 값 |
|---|---|---|---|
| 0 | uint8 |
버전 및 플래그 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
필드 길이 및 유형 0bLLLLTTTT
|
0bLLLL0111
|
| 2 - | 모델 ID | 다름 | |
| s + 1 | uint8 |
필드 길이 및 유형 0bLLLLTTTT
|
0bLLLL1000
|
| s + 2 | uint8 |
FP 기능 맵 | 다름 |
FP 기능 맵
FP 기능 맵은 공급자가 지원하는 FP 기능을 나타내는 비트맵입니다. 비트맵의 첫 번째 바이트는 다음과 같이 정의됩니다.
| 비트맵 | 설명 |
|---|---|
| 0bRRRRRRSO | R - 예약된 비트입니다. 현재 시커에서 무시되며 0으로 설정해야 합니다. S - FP LE 오디오 공유 지원 (사용 설정된 경우 1, 그렇지 않은 경우 0으로 설정) O - 초기 상태 (OOB) 비트입니다. 기기가 새 제품인 경우 1로 설정됩니다. |
제공자가 FP LE 오디오 공유 사양을 지원하는 경우 (즉, 임시 페어링, LE 오디오 공유 광고 페이로드, 히어러블 제어 버전 2 지원) FP LE 오디오 공유 지원 비트를 1로 설정하고 그렇지 않으면 0으로 설정합니다.
공급자가 FP 시커와 페어링되지 않았고 새 제품인 경우 (즉, 공급자에 FP 계정 키가 없는 경우) OOB 비트를 1로 설정하고, 그렇지 않으면 0으로 설정합니다.
광고: 검색할 수 없는 경우
검색 가능하지 않은 경우 (즉, 페어링 모드가 아님) 제공업체 기기는 다음 가이드라인을 사용하여 빠른 페어링 계정 데이터를 광고해야 합니다.
계정 데이터를 광고하면 근처의 탐색기가 제공업체가 자신의 계정에 속하는지 인식하고 제공업체를 먼저 페어링 모드로 강제하지 않고도 페어링을 시작할 수 있습니다. 이는 사용자 불만의 일반적인 원인입니다. Seeker는 사용자가 제공자와 페어링되기를 기다리지 않거나 브로드캐스트가 관련이 없는 경우 (예: 이미 페어링된 경우) 이 브로드캐스트를 무시할 수 있는 기회를 제공합니다. 또한 계정 데이터가 잘못 구성된 경우와 같이 명백히 잘못된 브로드캐스트는 자동으로 필터링됩니다.
광고 간격: 검색 불가능한 경우
광고 간 간격은 최대 250ms (4Hz)여야 합니다.
광고 페이로드: 빠른 페어링 계정 데이터
광고에는 서비스 데이터 데이터 유형이 포함되어야 합니다(Ibid., § 1.11. UUID는 빠른 페어링 서비스 UUID인 0xFE2C여야 합니다. 서비스 데이터에는 다음이 포함되어야 합니다.
| 옥텟 | 데이터 유형 | 설명 | 값 |
|---|---|---|---|
| 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 표시를 보여줌)에 계정 키 중 하나가 포함되어 있을 수 있는 경우 자동으로 연결하고 절차를 시작하려고 시도하여 거짓양성률을 더욱 줄일 수 있습니다. 경우에 따라 제공자는 페어링 준비가 되지 않은 상태에서 탐색기에게 인식되기를 원할 수 있습니다. 한 가지 예로, 이어폰이 케이스에 다시 넣어지면 헤드셋에서 페어링이 거부될 수 있으므로 후속 페어링 알림을 표시하지 않으려고 합니다.
계정 키 필터는 다음과 같이 구성된 가변 길이 Bloom 필터입니다.
- n을 지속된 계정 키 목록의 계정 키 수라고 하겠습니다 (n >= 1).
- s(필터 크기(바이트))를 (1.2*n + 3)으로 잘린 값이라고 가정합니다. 예를 들어 키 1개가 유지되면 s = 4바이트입니다.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - 필터 F를 s 바이트 배열로 초기화합니다. 각 바이트는 0으로 설정됩니다.
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. F에서 (M / 8) 색인의 바이트를 가져옵니다(내림).
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를 솔트로 사용합니다.
- 광고된 빠른 페어링 계정 데이터에서 생성된 필터를 계정 키 필터 필드에 포함하고 S를 솔트 필드에 포함합니다.