제공업체 광고 신호

광고: 검색 가능한 경우

제공업체 기기가 BR/EDR 검색 가능 (페어링 모드)이면 BLE를 통해 빠른 페어링 모델 ID 데이터를 알려야 하며 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
  • V = 버전
  • F = 플래그
0x00
(나중에 사용할 수 있도록 예약됨)
1 - 다름 계정 키 데이터 다름
또는 계정 키 목록이 비어 있는 경우 0x00

계정 키 데이터에는 다음이 포함됩니다.

옥텟 데이터 유형 설명 가치
0 uint8 필드 길이 및 유형
0bLLLLTTTT
  • L = 계정 키 필터의 길이(바이트)
  • T = 유형
0bLLLL0,000
  • 길이 = 0bLLLL = 다름
  • 유형 = 0b0000 (UI 표시 표시) 또는 0b0010 (UI 표시 숨기기), 계정 키 필터
1~ 계정 키 필터 경우에 따라 다름
+ 1 uint8 필드 길이 및 유형
0bLLLLTTTT
  • L = 바이트의 길이
  • T = 유형
0b00100001
  • 길이 = 0b0010 = 2
  • 유형 = 0b0001, Salt
+ 2 - + 3 uint16 Salt 경우에 따라 다름

계정 키 필터

공지된 계정 키 필터를 사용하면 탐색자가 추가 상호작용에 앞서 제공자가 특정 계정 키를 보유하고 있을 수 있는지 (평균 거짓양성 확률이 평균 0.5%보다 훨씬 낮음) 확인할 수 있습니다. 탐색자는 유형이 0인 필터가 브로드캐스트되는 것을 확인하면 자동으로 연결하여 절차를 시작하려고 할 수 있습니다. 즉, 거짓양성률을 더 줄이기 위해 계정 키 중 하나를 포함할 가능성이 있는 UI 표시를 보여줍니다. 경우에 따라 페어링 준비가 되지 않은 상태에서 제공자가 시커에서 인식하기를 원할 수 있습니다. 한 가지 예로 이어폰을 케이스에 다시 넣을 때 헤드셋에서 페어링을 거부할 수 있으므로 후속 페어링 알림 표시를 중지하려고 합니다.

계정 키 필터는 다음과 같이 구성된 가변 길이의 블룸 필터입니다.

  1. n은 유지되는 계정 키 목록에 있는 계정 키의 수 (n >= 1)입니다.
  2. (1.2*n + 3) 필터의 크기인 s를 잘라냅니다. 예를 들어 1개의 키가 유지되는 경우 s는 4바이트입니다.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. 각각 0으로 설정된 s 바이트 배열로 F 필터를 초기화합니다.
    uint8_t F[s] = {0};
  4. 저장된 계정 키 목록에 있는 각 계정 키 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을 사용하여 32바이트 값 H = {H0, ..., H31}을 얻는 해시 V입니다.

    uint8_t H[32] = {0};
    SHA256_hash_function(V, H);
    

    c. H를 big-endian의 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가 업데이트될 때마다 이 솔트를 다시 생성해야 합니다.

솔트를 사용하여 계정 키 필터를 생성하려면 다음 단계를 따르세요.

  1. 임의의 2바이트 S를 생성합니다. 더 많거나 덜 중요한 바이트가 없으므로 이 값에는 '엔디언'이 없습니다. 바이트 순서를 변경하지 마세요.
  2. 2바이트 S를 솔트로 사용합니다.
  3. 공지된 빠른 페어링 계정 데이터에서 생성된 필터를 계정 키 필터 필드에 포함하고 솔트 필드에 S를 포함합니다.