제공업체 광고 신호

광고: 검색 가능한 경우

제공자 기기가 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
  • V = 버전
  • F = 플래그
0x00
(나중에 사용하기 위해 예약됨)
1 - 다름 계정 키 데이터 계정 키 목록이 비어 있는 경우
또는 0x00 다름

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

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

계정 키 필터

광고된 계정 키 필터를 사용하면 탐색자가 제공업체가 특정 계정 키를 가지고 있을 수 있음 (거짓양성이 낮음) 확률은 평균적으로 0.5% 미만). 이 탐색자가 자동으로 연결되어 수술 시작을 시도할 수 있습니다. 유형 0으로 브로드캐스트되는 필터, 즉 잘못 인식될 가능성을 줄이기 위해 계정 키 중 하나를 포함할 수 있습니다 더 빠릅니다 경우에 따라 제공업자가 페어링할 준비가 되지 않은 경우 탐색자가 연결합니다. 한 가지 예는 다시 케이스로 돌아가면 후속 페어링 알림 표시를 중단하고 헤드셋이 거부할 수 있기 때문입니다.

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

  1. n을 영구 클러스터의 계정 키 수 (n >= 1)라고 계정 키 목록.
  2. 필터 크기(바이트 단위)인 s를 (1.2*n + 3)으로 자릅니다. 대상 예를 들어 1개의 키가 유지되면 s는 4바이트입니다.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. 필터 F를 각각 0으로 설정된 s 바이트의 배열로 초기화합니다.
    uint8_t F[s] = {0};
  4. 유지되는 계정 키 목록에 있는 각 계정 키 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가 업데이트될 때마다 이 솔트를 재생성해야 함 주소 순환 전체에 걸쳐 추적을 피할 수 있습니다.

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

  1. 임의의 2바이트 S를 생성합니다. 'endianness'는 없습니다. 이 더 많거나 적은 바이트가 없기 때문에 바이트를 변경하지 마세요. 있습니다.
  2. 2바이트 S를 솔트로 사용합니다.
  3. 광고된 빠른 페어링 계정 데이터에서 생성된 필터를 Account Key Filter(계정 키 필터) 필드 및 S(솔트 필드)를 입력합니다.