Сигнал поставщика рекламы

Объявление: когда устройство видно другим

Когда устройство поставщика обнаруживается по BR/EDR (то есть находится в режиме подключения), оно должно передавать данные об идентификаторе модели для быстрого подключения по BLE, а адрес BLE не должен меняться.

Интервал передачи данных: когда устройство видно другим

Интервал между объявлениями должен быть не больше 100 мс (10 Гц). Высокая частота позволяет Искателю быстро найти Поставщика, даже если сканирование выполняется в режиме энергосбережения.

Полезная нагрузка объявления: данные об идентификаторе модели быстрого подключения

Объявление должно содержать тип данных Service Data, ibid., § 1.11. В качестве UUID должен использоваться UUID сервиса быстрого подключения 0xFE2C. Данные сервиса должны содержать следующее:

Октет Тип данных Описание Значение
0–2 uint24 24-битный идентификатор модели varies

Полезная нагрузка объявления о передаче аудио через LE Audio: данные идентификатора модели быстрого подключения и карта возможностей быстрого подключения

Данные сервиса должны содержать следующее:

Октет Тип данных Описание Значение
0 uint8 Версия и флаги
0bVVVVFFFF
  • V – версия;
  • F – флаги;
0x00
1 uint8 Длина и тип поля
0bLLLLTTTT
  • L – длина идентификатора модели в байтах.
  • T = тип;
0bLLLL0111
  • length = 0bLLLL = varies
  • type = 0b0111, Model ID
2 – s Идентификатор модели varies
s + 1 uint8 Длина и тип поля
0bLLLLTTTT
  • L – длина в байтах;
  • T = тип;
0bLLLL1000
s + 2 uint8 Карта возможностей FP varies
Карта возможностей FP

Карта возможностей FP – это битовая карта, которая показывает, какие функции FP поддерживает поставщик. Первый байт битовой карты определяется следующим образом:

Растровое изображение Описание
0bRRRRRRSO R – зарезервированный бит, который пока игнорируется Искателем и должен быть установлен как 0.
S – поддержка передачи аудио через Быстрое подключение (установите значение 1, если она включена, или 0, если нет).
O – бит Out of Box (OOB), который устанавливается как 1, если устройство новое.

Если Поставщик поддерживает спецификацию FP LE Audio Sharing (то есть поддерживает временное подключение, рекламную полезную нагрузку LE Audio Sharing и Hearable control версии 2), установите для бита поддержки FP LE Audio Sharing значение 1. В противном случае установите значение 0.

Если поставщик не подключен ни к одному искателю и только что сошел с конвейера (то есть на нем нет ключей аккаунта), установите бит OOB на 1, в противном случае – на 0.

Полезная нагрузка рекламного пакета с информацией о скоординированном наборе: данные об идентификаторе модели быстрого подключения и информация о скоординированном наборе для быстрого подключения.

Данные сервиса должны содержать следующее:

Октет Тип данных Описание Значение
0 uint8 Версия и флаги
0bVVVVFFFF
  • V – версия;
  • F – флаги;
0x00
1 uint8 Длина и тип поля
0bLLLLTTTT
  • L – длина идентификатора модели в байтах.
  • T = тип;
0bLLLL0111
  • length = 0bLLLL = varies
  • type = 0b0111, Model ID
2 – s Идентификатор модели varies
s + 1 uint8 Длина и тип поля
0bLLLLTTTT
  • L – длина данных скоординированного набора.
  • T = тип;
0b01101011
  • length = 0b0110
  • type = 0b1011
S + 2 – S + 7 uint48 Данные о наборе согласованных параметров для семейного плана 6-байтовые данные, см. FP Coordinated Set Info
Информация о скоординированном наборе FP

Информация о скоординированном наборе Fast Pair используется для определения того, находится ли рекламное устройство в том же скоординированном наборе или нет.

Октет Тип данных Описание Значение
0 uint8 Количество в наборе изменяется
1 uint8 Тип участника скоординированного набора для быстрого подключения Возможные значения:
  • 0x00 : левый компонент
  • 0x01 : правый компонент
2–5 uint32 Задать хеш ключа разрешения идентификационных данных изменяется

Алгоритм создания значения хеша для ключа разрешения идентификатора набора:

  • Используйте SHA256 для хеширования значения SIRK.

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • Извлеките первые четыре байта в качестве значения хеша.

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

Подробную информацию о ключе разрешения набора идентификаторов можно найти в статье Coordinated Set Identification Service.

Объявление: когда устройство невидимо

Если устройство поставщика невидимо (то есть не находится в режиме подключения), оно должно передавать данные аккаунта для быстрого подключения в соответствии со следующими рекомендациями.

Благодаря этому Искатели могут распознавать, когда Поставщик принадлежит к их аккаунту, и инициировать подключение без необходимости принудительно переводить Поставщика в режим подключения, что часто вызывает жалобы пользователей. Искатели предоставят пользователям возможность игнорировать эту трансляцию, если они не хотят подключаться к поставщику или трансляция нерелевантна (например, если они уже подключились). Искатели также автоматически отфильтровывают явно плохие трансляции, например когда данные в аккаунте настроены неправильно.

Интервал рекламы: когда устройство невидимо

Интервал между объявлениями должен быть не более 250 мс (4 Гц).

Полезная нагрузка объявления: данные в аккаунте для быстрого подключения

Объявление должно содержать тип данных Service Data, Ibid., § 1.11. В качестве UUID должен использоваться UUID сервиса быстрого подключения 0xFE2C. Данные сервиса должны содержать следующее:

Октет Тип данных Описание Значение
0 uint8 Версия и флаги
0bVVVVFFFF
  • V – версия;
  • F – флаги;
0x00
(зарезервировано для использования в будущем)
1 – зависит от страны Данные ключа аккаунта varies

Ключевые данные аккаунта включают:

Октет Тип данных Описание Значение
0 uint8 Длина и тип поля
0bLLLLTTTT
  • L – длина фильтра ключа аккаунта в байтах.
  • T = тип;
0bLLLL0000
  • length = 0bLLLL = varies
  • type = 0b0000 (показать индикатор в интерфейсе) или 0b0010 (скрыть индикатор в интерфейсе), Account Key Filter
1 – s Фильтр по ключу аккаунта varies
s + 1 uint8 Длина и тип поля
0bLLLLTTTT
  • L – длина в байтах;
  • T = тип;
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
S + 2 – S + 3 uint16 Salt varies

Фильтр по ключу аккаунта

Фильтр ключа аккаунта позволяет Искателю быстро проверить, есть ли у Поставщика определенный ключ аккаунта (с низкой вероятностью ложного срабатывания, в среднем намного меньше 0,5 %), прежде чем продолжить взаимодействие. Искатель может автоматически подключиться и попытаться начать процедуру, когда обнаружит трансляцию фильтра типа 0, то есть с индикацией в интерфейсе, который потенциально содержит один из ключей аккаунта. Это позволяет снизить частоту ложных срабатываний. В некоторых ситуациях Поставщик может захотеть, чтобы Искатель его распознал, но не готов к подключению. Например, когда наушники помещаются обратно в чехол, мы хотим прекратить показ последующего уведомления о подключении, поскольку это подключение может быть отклонено гарнитурой.

Фильтр ключей аккаунта – это фильтр Блума переменной длины, который создается следующим образом:

  1. Пусть n – количество ключей аккаунта (n >= 1) в сохраненном списке ключей аккаунта.
  2. Пусть s – размер фильтра в байтах, усеченный до (1, 2* n + 3). Например, если сохраняется один ключ, то s = 4 Б.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Инициализируйте фильтр F как массив из s байтов, каждый из которых равен 0.
    uint8_t F[s] = {0};
  4. Для каждого ключа аккаунта K в сохраненном списке ключей аккаунтов:
    а. Пусть 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;
          ... }
    

    Б. Хешируйте V с помощью SHA256, чтобы получить 32-байтовое значение H = {H0, …, H31}.

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

    В. Разделите H на восемь 4-байтовых беззнаковых целых чисел с прямым порядком байтов: 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:
    1. Пусть M – это Xi по модулю количества битов в фильтре (s * 8).
    2. Получите байт в F по индексу (M / 8), округленному в меньшую сторону.
    3. Внутри байта установите бит с индексом (M % 8) равным 1.
    4. Другими словами:

        // 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. Сгенерируйте случайное двухбайтовое значение S. Обратите внимание, что у этого значения нет порядка байтов, поскольку нет более или менее значимого байта. Не изменяйте порядок байтов.
  2. В качестве соли используйте двухбайтовое значение S.
  3. В рекламируемых данных в аккаунте для быстрого подключения укажите сгенерированный фильтр в поле Account Key Filter (Фильтр ключа аккаунта) и S в поле Salt (Соль).