Indicador de publicidade do provedor
Publicidade: quando detectável
Quando o dispositivo provedor estiver detectável por BR/EDR (ou seja, no modo de pareamento), ele vai anunciar dados de ID do modelo de Pareamento rápido por BLE, e o endereço BLE não será alternado.
Intervalo de publicidade: 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 Seeker encontre o Provider rapidamente, mesmo ao fazer a varredura no modo de baixo consumo de energia.
Payload de publicidade: dados do ID do modelo do Fast Pair
O anúncio precisa conter o tipo de dados de dados do serviço, ibid., § 1.11. O
UUID precisa ser o UUID do serviço de Pareamento Rápido de 0xFE2C. Os dados de serviço precisam conter o seguinte:
| Octet | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0-2 | uint24 |
ID do modelo de 24 bits | varies |
Payload de publicidade de compartilhamento de áudio LE: dados de ID do modelo do Fast Pair e mapa de recursos do FP
Os dados de serviço precisam conter o seguinte:
| Octet | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 |
Versão e flags 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0bLLLL0111
|
| 2 - s | ID do modelo | varies | |
| s + 1 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0bLLLL1000
|
| s + 2 | uint8 |
Mapa de recursos de FP | varies |
Mapa de recursos de FP
O mapa de recursos do FP é um bitmap que representa quais recursos do FP o provedor aceita. O primeiro byte do bitmap é definido da seguinte maneira:
| Bitmap | Descrição |
|---|---|
| 0bRRRRRRSO | R: bit reservado, será ignorado pelo buscador por enquanto e será definido como 0. S: suporte ao compartilhamento de áudio LE do FP (definido como 1 se ativado, caso contrário, 0). O: bit de configuração inicial (OOB), definido como 1 se o dispositivo for novo. |
Se o provedor for compatível com a especificação de compartilhamento de áudio LE do FP (ou seja, se ele for compatível com pareamento temporário, carga útil de publicidade de compartilhamento de áudio LE e versão 2 do controle de dispositivo auditivo), defina o bit de suporte de compartilhamento de áudio LE do FP como 1. Caso contrário, defina como 0.
Se o provedor não tiver sido pareado com nenhum FP Seeker e for novo de fábrica (ou seja, não houver chaves de conta do FP no provedor), defina o bit OOB como 1. Caso contrário, defina como 0.
Publicidade: quando não é possível descobrir
Quando não está detectável (ou seja, não está no modo de pareamento), o dispositivo provedor precisa anunciar dados da conta do Pareamento rápido usando as seguintes diretrizes.
Ao anunciar os dados da conta, os usuários do Seeker nas proximidades conseguem reconhecer quando um provedor pertence à conta deles e iniciar o pareamento sem precisar forçar o provedor de volta ao modo de pareamento primeiro, o que é uma causa comum de reclamação do usuário. Os buscadores vão oferecer aos usuários a opção de ignorar essa transmissão caso não queiram esperar para parear com o provedor ou se a transmissão não for relevante (por exemplo, se já tiverem feito o pareamento). O recurso também filtra automaticamente transmissões obviamente ruins, como quando os dados da conta estão mal configurados.
Intervalo de publicidade: 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 do Pareamento rápido
O anúncio deve conter o tipo de dados de dados de serviço, Ibid., § 1.11. O
UUID precisa ser o UUID do serviço de Pareamento Rápido de 0xFE2C. Os dados de serviço precisam conter o seguinte:
| Octet | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 |
Versão e flags 0bVVVVFFFF
|
0x00(reservado para uso futuro) |
| 1 - varia | Dados da chave da conta | varies |
Os dados principais da conta contêm:
| Octet | Tipo de dado | Descrição | Valor |
|---|---|---|---|
| 0 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0bLLLL0000
|
| 1 - s | Filtro de chave da conta | varies | |
| s + 1 | uint8 |
Comprimento e tipo do campo 0bLLLLTTTT
|
0b00100001
|
| s + 2 - s + 3 | uint16 |
Salt | varies |
Filtro de chave da conta
O filtro de chave de conta anunciada permite que um usuário 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 Seeker 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 potencialmente contém uma das chaves da conta. Isso reduz ainda mais a taxa de falsos positivos. Em algumas situações, o provedor pode querer ser reconhecido pelo solicitante sem estar 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 headset.
O filtro de chave da conta é um filtro de Bloom de comprimento variável construído da seguinte maneira:
- Seja n o número de chaves de conta (n >= 1) na lista de chaves de conta persistente.
- 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); - Inicialize o filtro F como uma matriz de bytes s, cada um definido como 0.
uint8_t F[s] = {0}; Para cada chave de conta K na lista de chaves de conta persistente:
a. Seja 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. Gere o hash 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 igual a Xi módulo o número de bits no filtro, (s * 8).
ii. Recebe 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á um byte mais ou menos significativo. Não altere a ordem dos bytes.
Salina
O sal é um valor aleatório anexado às chaves de conta ao criar o filtro de Bloom. Esse salt precisa ser regenerado sempre que a RPA for atualizada para o provedor, evitando o rastreamento na rotação de endereços.
Para gerar o filtro de chave da conta usando o salt:
- Gere um S aleatório de 2 bytes. Não há "endianness" para esse valor, já que não há bytes mais ou menos significativos. Não altere a ordem dos bytes.
- Use o S de dois bytes como o Salt.
- 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".