Indicador de publicidade do provedor

Anúncio: quando detectável

Quando o dispositivo do provedor é detectável por BR/EDR (ou seja, no modo de pareamento), ele precisa anunciar os dados do ID do modelo de Pareamento Rápido por BLE, e o endereço BLE não pode ser alternado.

Intervalo de anúncio: quando detectável

O intervalo entre os anúncios não pode ser maior que 100 ms (10 Hz). Uma taxa rápida permite que o Buscador encontre rapidamente o Provedor, mesmo ao verificar no modo de baixo consumo de energia.

Payload de publicidade: dados do ID do modelo de Pareamento rápido

O anúncio precisa conter o tipo de dados de dados de serviço, ibid., § 1.11. O UUID será o UUID do serviço de Pareamento rápido de 0xFE2C. Os dados de serviço vão conter o seguinte:

Octeto Tipo de dado Descrição Valor
0-2 uint24 ID do modelo de 24 bits varia

Payload de publicidade do compartilhamento de áudio LE: dados de ID do modelo de Pareamento rápido e mapa de recursos de FP

Os dados de serviço devem conter o seguinte:

Octeto Tipo de dado Descrição Valor
0 uint8 Versão e flags
0bVVVVFFFF
  • V = versão
  • F = sinalizações
0x00
1 uint8 Comprimento e tipo do campo
0bLLLLTTTT
  • L = tamanho do ID do modelo em bytes
  • T = tipo
0bLLLL0111
  • comprimento = 0bLLLL = varia
  • type = 0b0111, ID do modelo
2 - s ID do modelo varia
s + 1 uint8 Comprimento e tipo do campo
0bLLLLTTTT
  • L = comprimento em bytes
  • T = tipo
0bLLLL1000
s + 2 uint8 Mapa de recursos de FP varia
Mapa de recursos de FP

O mapa de recursos de FP é um bitmap que representa os recursos de FP compatíveis com o provedor. O primeiro byte do bitmap é definido da seguinte forma:

Bitmap Descrição
0bRRRRRRSO R: bit reservado, será ignorado pelo buscador por enquanto e definido como 0.
S: suporte ao compartilhamento de áudio LE do FP (definido como 1 se ativado, caso contrário, 0).
O: bit pronto para uso (OOB, na sigla em inglês), definido como 1 se o dispositivo for novo de fábrica.

Se o provedor for compatível com a especificação de compartilhamento de áudio LE do FP (ou seja, com o pareamento temporário, o payload de publicidade de compartilhamento de áudio LE e o controle de fones de ouvido versão 2), defina o bit de suporte ao compartilhamento de áudio LE do FP como 1. Caso contrário, defina como 0.

Se o Provedor não tiver sido pareado com nenhum Buscador de FP e for novo de fábrica (ou seja, não houver chaves de conta de FP no provedor), defina o bit OOB como 1. Caso contrário, defina-o como 0.

Payload de publicidade de informações do conjunto coordenado: dados do ID do modelo de Pareamento rápido e informações do conjunto coordenado de Pareamento rápido

Os dados de serviço devem conter o seguinte:

Octeto Tipo de dado Descrição Valor
0 uint8 Versão e flags
0bVVVVFFFF
  • V = versão
  • F = sinalizações
0x00
1 uint8 Comprimento e tipo do campo
0bLLLLTTTT
  • L = tamanho do ID do modelo em bytes
  • T = tipo
0bLLLL0111
  • comprimento = 0bLLLL = varia
  • type = 0b0111, ID do modelo
2 - s ID do modelo varia
s + 1 uint8 Comprimento e tipo do campo
0bLLLLTTTT
  • L = comprimento dos dados do conjunto coordenado
  • T = tipo
0b01101011
  • length = 0b0110
  • type = 0b1011
s + 2 - s + 7 uint48 Dados do conjunto coordenado de FP Dados de 6 bytes, consulte Informações do conjunto coordenado de FP
Informações do conjunto coordenado de FP

As informações do conjunto coordenado do FP são usadas para identificar se o dispositivo de publicidade está no mesmo conjunto coordenado ou não.

Octeto Tipo de dado Descrição Valor
0 uint8 Tamanho do conjunto coordenado varia
1 uint8 Tipo de membro do conjunto coordenado de Pareamento Rápido Pode ser um dos seguintes:
  • 0x00 : componente esquerdo
  • 0x01 : componente direito
Dois a cinco uint32 Definir o hash da chave de resolução de identidade varia

O algoritmo para gerar o valor de hash da chave de resolução de identidade definida é

  • Usar SHA256 para gerar o hash do valor do SIRK

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • Extrair os primeiros quatro bytes como o valor de hash

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

Para a chave de resolução de conjunto de identidade, consulte Serviço de identificação de conjunto coordenado para mais informações.

Anúncio: quando não detectável

Quando não estiver detectável (ou seja, não estiver no modo de pareamento), o dispositivo provedor vai anunciar os dados da conta de Pareamento rápido, usando as diretrizes a seguir.

Anunciar os dados da conta permite que os Seekers por perto reconheçam quando um provedor pertence à conta deles e iniciem o pareamento sem precisar forçar o provedor a voltar ao modo de pareamento primeiro, o que é uma causa comum de reclamações dos usuários. Os buscadores vão oferecer aos usuários a oportunidade de ignorar essa transmissão caso eles não queiram parear com o provedor ou se a transmissão não for relevante (por exemplo, se eles já tiverem feito o pareamento). Os Seekers também filtram automaticamente transmissões obviamente ruins, como quando os dados da conta estão configurados incorretamente.

Intervalo de anúncio: quando não detectável

O intervalo entre os anúncios precisa ser de no máximo 250 ms (4 Hz).

Payload de publicidade: dados da conta de Pareamento rápido

O anúncio precisa conter o tipo de dados de dados de serviço, Ibid., § 1.11. O UUID será o UUID do serviço de Pareamento rápido de 0xFE2C. Os dados de serviço vão conter o seguinte:

Octeto Tipo de dado Descrição Valor
0 uint8 Versão e flags
0bVVVVFFFF
  • V = versão
  • F = sinalizações
0x00
(reservado para uso futuro)
1 - varia Dados da chave da conta varia

Os dados da chave de conta contêm:

Octeto Tipo de dado Descrição Valor
0 uint8 Comprimento e tipo do campo
0bLLLLTTTT
  • L = comprimento do filtro de chave de conta em bytes
  • T = tipo
0bLLLL0000
  • comprimento = 0bLLLL = varia
  • tipo = 0b0000 (mostrar indicação da interface) ou 0b0010 (ocultar indicação da interface), filtro de chave de conta
1 - s Filtro de chave de conta varia
s + 1 uint8 Comprimento e tipo do campo
0bLLLLTTTT
  • L = comprimento em bytes
  • T = tipo
0b00100001
  • comprimento = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt varia

Filtro de chave de conta

O filtro de chave de conta anunciado permite que um buscador verifique rapidamente se um provedor pode ter uma determinada chave de conta (com uma baixa probabilidade de falso positivo, em média, muito menor que 0,5%) antes de outras interações. O Buscador pode se conectar automaticamente e tentar iniciar o procedimento quando vê um filtro sendo transmitido com o tipo 0, ou seja, mostrando uma indicação de interface que pode conter uma das chaves de conta, para reduzir ainda mais a taxa de falsos positivos. Em algumas situações, o Provedor pode querer ser reconhecido pelo Buscador, mesmo que não esteja pronto para o pareamento. Por exemplo, quando os fones de ouvido são colocados de volta no estojo, queremos parar de mostrar a notificação de pareamento subsequente, já que esse pareamento pode ser rejeitado pelo fone de ouvido.

O filtro de chave de conta é um filtro de Bloom de comprimento variável construído da seguinte maneira:

  1. Considere n como o número de chaves de conta (n >= 1) na lista de chaves de conta persistente.
  2. Seja s, o tamanho do filtro em bytes, (1,2*n + 3) truncado. Por exemplo, se uma chave for mantida, s = 4 bytes.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Inicialize o filtro F como uma matriz de bytes s, cada um definido como 0.
    uint8_t F[s] = {0};
  4. Para cada chave de conta K na lista de chaves de conta persistente:
    a. Considere V como 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. Gere o hash de V usando SHA256, obtendo um valor de 32 bytes H = {H0, …, H31}.

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

    c. Divida H em oito números inteiros sem sinal de 4 bytes em big-endian, X = {X0, …, X7}, em que 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. Para cada Xi:
    i. Seja M o módulo de Xi do número de bits no filtro, (s * 8).
    ii. Receba o byte em F no índice (M / 8), arredondado para baixo.
    iii. No byte, defina o bit no índice (M % 8) como 1.
    iv. Em outras palavras:

        // 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));
        }
    

Inclua o filtro F como o campo "Filtro de chave da conta" nos dados de publicidade. Não há "endianness" para esse valor, já que não há byte mais ou menos significativo. Não altere a ordem dos bytes.

Campo de sal

O sal é um valor aleatório anexado às chaves de conta ao criar o filtro de Bloom. Esse salt precisa ser gerado novamente sempre que o RPA for atualizado para o provedor, para evitar o rastreamento na rotação de endereços.

Para gerar o filtro de chave de conta usando o salt:

  1. Gere um S aleatório de 2 bytes. Não há "endianness" nesse valor, já que não há byte mais ou menos significativo. Não altere a ordem dos bytes.
  2. Use o S de 2 bytes como o salt.
  3. Nos dados da conta do Pareamento rápido anunciados, inclua o filtro gerado no campo Filtro de chave da conta e S no campo Salt.