Сигнал поставщика рекламы
Объявление: когда устройство видно другим
Когда устройство поставщика обнаруживается по BR/EDR (то есть находится в режиме подключения), оно должно передавать данные об идентификаторе модели для быстрого подключения по BLE, а адрес BLE не должен меняться.
Интервал передачи данных: когда устройство видно другим
Интервал между объявлениями должен быть не больше 100 мс (10 Гц). Высокая частота позволяет Искателю быстро найти Поставщика, даже если сканирование выполняется в режиме энергосбережения.
Полезная нагрузка объявления: данные об идентификаторе модели быстрого подключения
Объявление должно содержать тип данных Service Data, ibid., § 1.11. В качестве UUID должен использоваться UUID сервиса быстрого подключения 0xFE2C. Данные сервиса должны содержать следующее:
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0–2 | uint24 |
24-битный идентификатор модели | varies |
Полезная нагрузка объявления о передаче аудио через LE Audio: данные идентификатора модели быстрого подключения и карта возможностей быстрого подключения
Данные сервиса должны содержать следующее:
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 | uint8 |
Версия и флаги 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
Длина и тип поля 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | Идентификатор модели | varies | |
| s + 1 | uint8 |
Длина и тип поля 0bLLLLTTTT
|
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
|
0x00 |
| 1 | uint8 |
Длина и тип поля 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | Идентификатор модели | varies | |
| s + 1 | uint8 |
Длина и тип поля 0bLLLLTTTT
|
0b01101011
|
| S + 2 – S + 7 | uint48 |
Данные о наборе согласованных параметров для семейного плана | 6-байтовые данные, см. FP Coordinated Set Info |
Информация о скоординированном наборе FP
Информация о скоординированном наборе Fast Pair используется для определения того, находится ли рекламное устройство в том же скоординированном наборе или нет.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 | uint8 |
Количество в наборе | изменяется |
| 1 | uint8 |
Тип участника скоординированного набора для быстрого подключения | Возможные значения:
|
| 2–5 | uint32 |
Задать хеш ключа разрешения идентификационных данных | изменяется |
Алгоритм создания значения хеша для ключа разрешения идентификатора набора:
Используйте SHA256 для хеширования значения SIRK.
SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924SHA256(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
|
0x00(зарезервировано для использования в будущем) |
| 1 – зависит от страны | Данные ключа аккаунта | varies |
Ключевые данные аккаунта включают:
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 | uint8 |
Длина и тип поля 0bLLLLTTTT
|
0bLLLL0000
|
| 1 – s | Фильтр по ключу аккаунта | varies | |
| s + 1 | uint8 |
Длина и тип поля 0bLLLLTTTT
|
0b00100001
|
| S + 2 – S + 3 | uint16 |
Salt | varies |
Фильтр по ключу аккаунта
Фильтр ключа аккаунта позволяет Искателю быстро проверить, есть ли у Поставщика определенный ключ аккаунта (с низкой вероятностью ложного срабатывания, в среднем намного меньше 0,5 %), прежде чем продолжить взаимодействие. Искатель может автоматически подключиться и попытаться начать процедуру, когда обнаружит трансляцию фильтра типа 0, то есть с индикацией в интерфейсе, который потенциально содержит один из ключей аккаунта. Это позволяет снизить частоту ложных срабатываний. В некоторых ситуациях Поставщик может захотеть, чтобы Искатель его распознал, но не готов к подключению. Например, когда наушники помещаются обратно в чехол, мы хотим прекратить показ последующего уведомления о подключении, поскольку это подключение может быть отклонено гарнитурой.
Фильтр ключей аккаунта – это фильтр Блума переменной длины, который создается следующим образом:
- Пусть n – количество ключей аккаунта (n >= 1) в сохраненном списке ключей аккаунта.
- Пусть s – размер фильтра в байтах, усеченный до (1, 2* n + 3). Например, если сохраняется один ключ, то s = 4 Б.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - Инициализируйте фильтр F как массив из s байтов, каждый из которых равен 0.
uint8_t F[s] = {0}; Для каждого ключа аккаунта 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 обновляется для поставщика, чтобы избежать отслеживания при ротации адресов.
Чтобы сгенерировать фильтр ключа аккаунта с помощью соли:
- Сгенерируйте случайное двухбайтовое значение S. Обратите внимание, что у этого значения нет порядка байтов, поскольку нет более или менее значимого байта. Не изменяйте порядок байтов.
- В качестве соли используйте двухбайтовое значение S.
- В рекламируемых данных в аккаунте для быстрого подключения укажите сгенерированный фильтр в поле Account Key Filter (Фильтр ключа аккаунта) и S в поле Salt (Соль).