Indicador de publicidad del proveedor

Publicidad: Cuando es detectable

Cuando el dispositivo del proveedor es detectable en BR/EDR (es decir, en modo de vinculación), deberá anunciar datos de ID de modelo de par rápida a través de BLE, y la dirección BLE no debe rotó.

Intervalo de publicidad: Cuando es detectable

El intervalo entre anuncios no debe superar los 100 ms (10 Hz). R La velocidad rápida le permite al Buscador encontrar rápidamente al proveedor, incluso cuando busca en modo de bajo consumo.

Carga útil de publicidad: Datos de ID de modelo de vinculación rápida

El anuncio deberá contener el tipo de datos de Datos de servicio, ibid. § 1.11. El El UUID debe ser el UUID del servicio de vinculación rápida de 0xFE2C. Los datos del servicio deben contienen los siguientes elementos:

Octeto Tipo de datos Descripción Valor
0-2 uint24 ID del modelo de 24 bits varía

Publicidad: Cuando no es detectable

Cuando no sea detectable (es decir, no en modo de vinculación), el dispositivo del Proveedor deberá anunciar datos de Vinculación rápida de la cuenta siguiendo los lineamientos que se indican a continuación.

Anunciar los datos de la cuenta permite que los buscadores cercanos reconozcan cuando un proveedor pertenece a su cuenta e iniciar la vinculación sin tener que forzar la de nuevo al modo de vinculación, lo que es una causa común queja. Los buscadores les brindarán a los usuarios la oportunidad de ignorar esta transmisión en caso de que no espere para vincularse con el proveedor o la transmisión no es relevante (por ejemplo, si ya se sincronizaron). Además, estas opciones también filtrarán automáticamente las transmisiones obviamente malas, como las siguientes: cuando los datos de la cuenta están mal configurados.

Intervalo de publicidad: cuando no es detectable

El intervalo entre anuncios debe ser, como máximo, de 250 ms (4 Hz).

Carga útil de publicidad: Datos de cuenta de Vinculación rápida

El anuncio deberá contener el tipo de datos de Datos de servicio, Ibid. § 1.11. El El UUID debe ser el UUID del servicio de vinculación rápida de 0xFE2C. Los datos del servicio deben contienen los siguientes elementos:

Octeto Tipo de datos Descripción Valor
0 uint8 Versión y marcas
0bVVVVFFFF
  • V = versión
  • F = marcas
0x00
(reservado para uso futuro)
1 - varía Datos clave de la cuenta varía
o 0x00 si la lista de claves de la cuenta está vacía

Los datos clave de la cuenta contienen:

Octeto Tipo de datos Descripción Valor
0 uint8 Longitud y tipo de campo
0bLLTTTT
  • L = longitud del filtro de claves de la cuenta en bytes
  • T = tipo
0bLLLL0000
  • longitud = 0bLLLL = varía
  • tipo = 0b0000 (mostrar indicación de IU) o 0b0010 (ocultar la indicación de IU), filtro de clave de cuenta
1: s Filtro de clave de cuenta varía
s + 1 uint8 Longitud y tipo de campo
0bLLTTTT
  • L = longitud en bytes
  • T = tipo
0b00100001
  • longitud = 0b0010 = 2
  • tipo = 0b0001, Sal
s + 2 - s + 3 uint16 Salt varía

Filtro de clave de cuenta

El filtro de claves de cuenta anunciado permite que el usuario compruebe rápidamente si Es posible que el proveedor posea una clave de cuenta determinada (con un falso positivo bajo de probabilidad, en promedio mucho menor que 0.5%), antes de más interacciones. El Seeker puede conectarse automáticamente e intentar iniciar el procedimiento cuando detecte un filtro que se transmite con el tipo 0, es decir, que muestra una indicación de IU, que contiene potencialmente una de las claves de cuenta, para reducir la tasa de falsos los aspectos positivos. En algunas situaciones, es posible que el Proveedor quiera que se le reconozca por el Buscador cuando no está listo para la vinculación. Por ejemplo, cuando se ponen los auriculares volver a este caso, queremos dejar de mostrar la notificación de vinculación posterior ya que los auriculares podrían rechazar esa vinculación.

El filtro de claves de la cuenta tiene una longitud variable El filtro Bloom está construido como sigue:

  1. Supongamos que n es el número de claves de cuenta (n >= 1) en la Lista de claves de la cuenta.
  2. Hagamos que s, el tamaño del filtro en bytes, se trunque (1.2*n + 3). Para Por ejemplo, si 1 clave persiste, s = 4 bytes.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Inicializa el filtro F como un array de s bytes, cada uno establecido en 0.
    uint8_t F[s] = {0};
  4. Por cada clave de la cuenta K que aparece en la lista de claves de la cuenta persistente:
    a. Deja que V sea 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. Genera un hash V con SHA256 y obtén un valor de 32 bytes H = {H0, ..., H31}.

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

    c. Dividir H en ocho números enteros sin firma de 4 bytes en big-endian, X = {X0, ..., X7}, donde 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. Deja que M sea el módulo de la cantidad de bits en el filtro Xi. (s * 8).
    II. Obtén el byte de F en el índice (M / 8), redondeado hacia abajo.
    iii. Dentro del byte, establece el bit en el índice (M % 8) en 1.
    iv. En otras palabras:

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

En los datos de publicidad, incluye el filtro F como el campo Filtro de clave de cuenta. Ten en cuenta que no hay “endianness” a este valor, ya que no hay más ni menos byte importante, no alteres el orden de bytes.

Campo de sal

La sal es un valor aleatorio que se agrega a las claves de cuenta cuando se compila la filtro de flor. Esta sal se debe regenerar cada vez que se actualice la RPA de el proveedor para evitar el seguimiento en la rotación de direcciones.

Para generar el filtro de claves de la cuenta usando la sal, haz lo siguiente:

  1. Genera una S aleatoria de 2 bytes. Ten en cuenta que no hay “endianness” a este valor, ya que no hay un byte más ni menos importante, no lo modifiques en el orden personalizado.
  2. Usa la S de 2 bytes como la sal.
  3. En los datos de cuentas de Vinculación rápida anunciados, incluye el filtro generado en el Account Key Filter y S en el campo Sal.