제공업체 광고 신호
광고: 검색 가능한 경우
제공업체 기기가 BR/EDR을 검색할 수 있는 경우 (즉, 페어링 모드인 경우) BLE를 통해 빠른 페어링 모델 ID 데이터를 광고해야 하며, BLE 주소는 순환되지 않습니다.
광고 간격: 검색 가능
광고 간 간격은 100ms (10Hz) 이하여야 합니다. 빠른 속도를 사용하면 시커가 저전력 모드에서 스캔하는 경우에도 빠르게 제공업체를 찾을 수 있습니다.
광고 페이로드: 빠른 페어링 모델 ID 데이터
광고에는 서비스 데이터 데이터 유형, ibid., § 1.11. UUID는 0xFE2C
의 빠른 페어링 서비스 UUID입니다. 서비스 데이터에는 다음이 포함되어야 합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0~2년 | uint24 |
24비트 모델 ID | 다름 |
광고: 검색할 수 없는 경우
검색할 수 없는 경우 (즉, 페어링 모드가 아닌 경우) 제공자 기기는 다음 가이드라인에 따라 빠른 페어링 계정 데이터를 광고해야 합니다.
계정 데이터를 광고하면 근처에 있는 Seeker가 제공업체가 계정에 속할 때를 인식하고 제공업체를 먼저 페어링 모드로 전환하지 않고도 페어링을 시작할 수 있습니다. 이는 사용자가 불만을 제기하는 일반적인 원인입니다. 탐색자는 사용자가 제공업체와 페어링하기를 기다리지 않거나 브로드캐스트가 관련이 없는 경우 (예: 이미 페어링된 경우) 이 브로드캐스트를 무시할 수 있는 기회를 제공합니다. 또한 탐색자는 계정 데이터가 잘못 구성된 경우와 같이 명백하게 잘못된 브로드캐스트를 자동으로 필터링합니다.
광고 간격: 검색할 수 없는 경우
광고 간 간격은 최대 250ms (4Hz)여야 합니다.
광고 페이로드: 빠른 페어링 계정 데이터
광고에는 서비스 데이터 데이터 유형, Ibid., § 1.11. UUID는 0xFE2C
의 빠른 페어링 서비스 UUID입니다. 서비스 데이터에는 다음이 포함되어야 합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 |
버전 및 플래그 0bVVVVFFFF
|
0x00 (향후 사용을 위해 예약됨) |
1 - 다름 | 계정 키 데이터 | 다름 또는 계정 키 목록이 비어 있는 경우 0x00 |
계정 키 데이터에는 다음이 포함됩니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 |
입력란 길이 및 유형 0bLLLLTTTT
|
0LLLL0000
|
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를 연결합니다(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를 big-endian의 4바이트 부호 없는 정수 8개로 나눕니다. 여기서 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가 되도록 합니다.
2. 색인에서 F의 바이트를 가져옵니다(M/8).
3. 바이트 내에서 색인의 비트 (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를 포함합니다.