v1.3
“查找中心”网络 (FHN) 配件规范定义了一种端到端加密方法,用于跟踪发出信标的低功耗蓝牙 (BLE) 设备。本页介绍了 FHN 作为 Fast Pair 规范的扩展功能。 如果提供商有与 FHN 兼容的设备,并且愿意为这些设备启用位置信息跟踪,则应启用此扩展程序。
如果您有兴趣为头戴式耳机或 TWS 耳机添加“查找中心”支持,请改为填写快速配对设备提案表单。
GATT 规范
应向快速配对服务添加一个额外的通用属性 (GATT) 特征,其语义如下:
快速配对服务特征 | 已加密 | 权限 | UUID |
---|---|---|---|
信标操作 | 否 | 读取、写入和通知 | FE2C1238-8366-4814-8EB0-01DE32100BEA |
表 1:FHN 的快速配对服务特征。
身份验证
此扩展程序所需的操作以写入操作的形式执行,并通过质询-响应机制进行保护。在执行任何操作之前,搜索器应从表 1 中的特征执行读取操作,从而获得以下格式的缓冲区:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 协议主要版本号 | 0x01 |
1 - 8 | 字节数组 | 一次性随机数 | 各不相同 |
每次读取操作都应生成不同的随机数,并且单个随机数仅对一次操作有效。即使操作失败,也必须使相应随机数失效。
然后,Seeker 会计算一次性身份验证密钥,以用于后续的写入请求。身份验证密钥的计算方式如表 2 至表 5 中所述。根据所请求的操作,寻求者需要证明自己知道以下一个或多个密钥:
账号密钥:16 字节的快速配对账号密钥,如快速配对规范中所定义。
所有者账号密钥:当搜索者首次访问 Beacon Actions 特征时,提供者会选择一个现有账号密钥作为所有者账号密钥。在提供程序恢复出厂设置之前,无法更改所选的所有者账号密钥。当提供方用完免费账号密钥槽时,不得移除所有者账号密钥。
如果提供商在首次配对时已支持 FHN(或在恢复出厂设置后配对时支持 FHN),则选择第一个账号密钥,因为在配对期间,当 Seeker 读取配置状态时,这是唯一现有的账号密钥。
在配对后获得 FHN 支持的提供商(例如,通过固件更新)可以选择任何现有的账号密钥。假设执行更新的用户是提供方的当前所有者,那么在固件更新后,选择用于从 beacon 操作特征读取配置状态的第一个账号密钥是合理的。
临时身份密钥 (EIK):在执行 FHN 配置流程时,由搜索者随机选择的 32 字节密钥。此密钥用于派生加密密钥,这些密钥用于对位置信息报告进行端到端加密。搜索者绝不会向后端透露此信息。
恢复密钥:定义为
SHA256(ephemeral identity key || 0x01)
,截断为前 8 个字节。密钥存储在后端,搜索者可以使用该密钥 恢复 EIK,前提是用户通过按下设备上的按钮表示同意。环形密钥:定义为
SHA256(ephemeral identity key || 0x02)
,截断为前 8 个字节。该密钥存储在后端,查找者只能使用它来使设备响铃。不必要的跟踪保护密钥:定义为
SHA256(ephemeral identity key || 0x03)
,截断为前 8 个字节。密钥存储在后端,Seeker 只能使用该密钥来激活不必要的跟踪保护模式。
运维
写入特征的数据的格式如表 2 至表 5 所示。本部分稍后将更详细地介绍每项操作。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 数据 ID |
|
1 | uint8 | 数据长度 | 各不相同 |
2 - 9 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(account key, protocol major version number || the last nonce
read from the characteristic || data ID || data length || additional data) 的前 8 个字节 |
10 - var | 字节数组 <0x | 其他数据 <0x |
|
表 2:Beacon 配置请求。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 数据 ID | 0x04:在征得用户同意的情况下读取临时身份密钥 |
1 | uint8 | 数据长度 | 0x08 |
2 - 9 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(recovery key, protocol major version number || the last nonce
read from the characteristic || data ID || data length) 的前 8 个字节 |
表 3:信标配置密钥恢复请求。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 数据 ID |
|
1 | uint8 | 数据长度 | 各不相同 |
2 - 9 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(ring key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data) 的前 8 个字节 |
10 - var | 字节数组 | 其他数据 |
|
表 4:响铃请求。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 数据 ID |
|
1 | uint8 | 数据长度 | 各不相同 |
2 - 9 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(unwanted tracking protection key, protocol major version number
|| the last nonce read from the characteristic || data ID || data length ||
additional data) 的前 8 个字节 |
10 - var | 字节数组 | 其他数据 |
|
表 5:不需要的跟踪保护请求。
成功写入会触发表 6 中列出的通知。
数据 ID 不是 0x05:响铃状态更改的通知应在触发通知的写入交易完成之前发送,即在发送写入请求的响应 PDU 之前发送。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 <0x0 | uint8 | 数据 ID <0x |
|
1 | uint8 | 数据长度 | 各不相同 |
2 - 9 | 字节数组 | 身份验证 | 详细的每项操作 |
10 - var < | 字节数组 <0x | 其他数据 <0x |
|
表 6:Beacon 服务响应。
表 7 列出了操作可能返回的 GATT 错误代码。
代码 | 说明 | 备注 |
---|---|---|
0x80 | 未通过身份验证 | 在身份验证失败(包括使用旧随机数的情况)时,针对写入请求返回。 |
0x81 | 值无效 | 当提供任何无效值或接收到的数据具有意外的字节数时返回。 |
0x82 | 未征得用户同意 | 在设备未处于配对模式时,针对数据 ID 为 0x04:在征得用户同意的情况下读取临时身份密钥 的写入请求返回。 |
表 7:GATT 错误代码。
读取 beacon 的参数
Seeker 可以通过对包含数据 ID 为 0x00 的表 2 中的请求的特征执行写入操作,来向 Provider 查询 beacon 的参数。提供方会验证所提供的一次性身份验证密钥是否与设备上存储的任何账号密钥相匹配。
如果验证失败,提供方会返回未经身份验证的错误。
成功后,提供程序会发送表 6 中的响应(数据 ID 为 0x00)进行通知。提供方按如下方式构建数据细分:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 校准后的功率 | 在 0 米处接收到的校准后功率(一个介于 [-100, 20] 范围内的值)。以有符号整数表示,分辨率为 1 dBm。 |
1 - 4 | uint32 | 时钟值 | 以秒为单位的当前时钟值(大端字节序)。 |
5 | uint8 | 曲线选择 | 用于加密的椭圆曲线:
|
6 <0x0 | uint8 | 组件 <0x0 | 能够响铃的组件数量:
|
7 <0x0 | uint8 | 响铃功能 | 支持的选项包括:
|
8-15 | 字节数组 | 内边距 | AES 加密的零填充。 |
数据应使用用于对请求进行身份验证的账号密钥通过 AES-ECB-128 加密。
身份验证段定义为 HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data after
encryption || 0x01)
的前 8 个字节。
读取信标的配置状态
Seeker 可以通过对包含表 2 中数据 ID 为 0x01 的请求的特征执行写入操作,来查询 Provider 的 beacon 配置状态。提供方会验证所提供的一次性身份验证密钥是否与设备上存储的任何账号密钥匹配。
如果验证失败,提供方会返回未经身份验证的错误。
成功后,提供方会发送表 6 中的响应(数据 ID 为 0x01)进行通知。提供方按如下方式构建数据细分:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 <0x0 | uint8 | 配置状态 | 具有以下值的位掩码:
|
1 - 20 或 32 | 字节数组 | 当前临时标识符 | 20 或 32 字节(取决于所用的加密方法),用于指示信标当前广播的临时 ID(如果设备设置了临时 ID)。 |
身份验证段定义为 HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data || 0x01)
的前 8 个字节。
设置临时身份密钥
如需将未配置的提供方配置为 FHN 信号标,或更改已配置的提供方的临时身份密钥,搜索方会向包含数据 ID 为 0x02 的表 2 中的请求的特征执行写入操作。提供商会验证以下信息:
- 提供的一次性身份验证密钥与所有者账号密钥一致。
- 如果提供了临时身份密钥的哈希值,则该哈希值与当前的临时身份密钥相匹配。
- 如果未提供临时身份密钥的哈希值,请验证提供方是否已预配为 FHN 信标。
如果验证失败,提供方会返回未经身份验证的错误。
如果成功,系统会使用匹配的账号密钥通过 AES-ECB-128 解密来恢复临时身份密钥。密钥应持久保存在设备上,从那时起,提供程序应开始广播 FHN 帧。新的临时身份密钥会在 BLE 连接终止后立即生效。提供程序会发送表 6 中的响应(数据 ID 为 0x02)进行通知。
身份验证段定义为 HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || 0x01)
的前 8 个字节。
清除临时身份密钥
若要取消配置提供方的信标部分,搜索者会对特征执行写入操作,该操作包含来自表 2 的请求(数据 ID 为 0x03)。提供商会验证以下信息:
- 提供的一次性身份验证密钥与所有者账号密钥一致。
- 哈希处理后的临时身份密钥与当前的临时身份密钥一致。
如果提供方未预配为 FHN 信标或验证失败,则返回未经身份验证的错误。
成功后,提供方会忘记密钥并停止播发 FHN 帧。提供方会发送表 6 中的响应,其中包含数据 ID 0x03。身份验证段定义为 HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || 0x01)
的前 8 个字节。
在征得用户同意后读取临时身份密钥
此选项仅用于恢复丢失的密钥,因为密钥仅由 Seeker 本地存储。因此,只有当设备处于配对模式时,或者在用户按下设备上的实体按钮(表示用户同意)后的有限时间内,此功能才可用。
搜索者必须在后端存储恢复密钥,以便能够恢复明文密钥,但它不会存储 EIK 本身。
为了读取 EIK,Seeker 对特征执行写入操作,该操作包含来自表 3 的请求(数据 ID 为 0x04)。提供方验证:
- 经过哈希处理的恢复密钥与预期恢复密钥一致。
- 设备处于 EIK 恢复模式。
如果验证失败,提供方会返回未经身份验证的错误。
如果设备未处于配对模式,提供程序会返回“未征得用户同意”错误。
成功后,提供程序会发送表 6 中的响应,其中包含数据 ID 0x04。
身份验证段定义为 HMAC-SHA256(recovery key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data || 0x01)
的前 8 个字节。
响铃操作
寻求者可以通过对特征执行写入操作来请求提供者播放声音,该特征包含来自表 4 的数据 ID 为 0x05 的请求。提供方按如下方式构建数据细分:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 <0x0 | uint8 | 响铃操作 | 具有以下值的位掩码:
|
1 - 2 | uint16 | 超时 <0x0 | 超时时间(以分秒为单位)。不得为零,且不得超过相当于 10 分钟的时间。 提供方使用此值来确定在自行静音之前应响铃多长时间。如果设备的任何组件已在响铃,则超时会替换已生效的超时。 如果将振铃操作设置为 0x00,则会忽略超时。 |
3 <0x0 | uint8 | Volume <0x0 |
|
收到请求后,提供方会验证以下内容:
- 提供的一次性身份验证密钥与铃声密钥一致。
- 请求的状态与可响铃的组件相匹配。
如果提供方未预配为 FHN 信标或验证失败,则返回未经身份验证的错误。不过,如果提供方已启用不需要的跟踪保护功能,并且触发不需要的跟踪保护功能的请求已开启跳过响铃身份验证标志,则提供方应跳过该检查。身份验证数据仍应由 Seeker 提供,但可以设置为任意值。
当响铃开始或结束时,系统会发送一条如表 6 所示的通知,数据 ID 为 0x05。通知的内容定义如下:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 <0x0 | uint8 | 响铃状态 |
|
1 | uint8 | 响铃组件 | 请求中定义的正在响铃的组件的位掩码。 |
2 - 3 | uint16 | 超时 | 响铃的剩余时间(以十分之一秒为单位)。如果设备已停止响铃,则应返回 0x0000。 |
身份验证段定义为 HMAC-SHA256(ring key, protocol major version number || the nonce used to
initiate the ringing command || data ID || data length || additional data ||
0x01)
的前 8 个字节。
如果设备在收到响铃或停止响铃请求时已处于请求的响铃状态,则提供程序应发送响铃状态通知,分别为 0x00:已开始或 0x04:已停止(GATT 请求)。此请求会替换现有状态的参数,以便延长响铃时长。
如果提供方有实体按钮(或已启用触控感应),则当响铃处于有效状态时,按下该按钮应停止响铃功能。
获取信标的响铃状态
为了获取信标的响铃状态,搜索器对特征执行写入操作,该操作包含来自表 4 的请求(数据 ID 为 0x06)。提供方验证所提供的一次性身份验证密钥是否与环密钥匹配。
如果提供方未预配为 FHN 信标,或者验证失败,则提供方会返回未经身份验证的错误。
成功后,提供方会发送表 6 中的响应(数据 ID 为 0x06)进行通知。提供方按如下方式构建数据细分:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 响铃组件 | 正在响铃的组件,如响铃请求中所定义。 |
1 - 2 | uint16 | 超时 | 响铃的剩余时间(以十分之一秒为单位)。请注意,如果设备未响铃,则应返回 0x0000。 |
身份验证段定义为 HMAC-SHA256 (ring key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data || 0x01)
的前 8 个字节。
恶意追踪保护模式
不必要的跟踪保护模式旨在让任何客户端在不进行服务器通信的情况下识别滥用设备。默认情况下,提供程序应按照 ID 轮替中所述轮替所有标识符。“查找中心”服务可以通过“查找中心”网络中继不需要的追踪保护模式激活请求。这样做后,服务会使提供方暂时使用固定的 MAC 地址,从而允许客户端检测设备并警告用户可能存在不必要的跟踪。
为了激活或停用信标的不必要跟踪保护模式,搜索者对特征执行写入操作,该操作包含来自表 5 的请求,数据 ID 分别为 0x07 或 0x08。
启用“不必要的跟踪保护”模式时
提供方按如下方式构建数据细分:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 <0x0 | uint8 | 控制标志 <0x |
这些标志仅在停用不必要的跟踪保护模式之前有效。 |
提供方验证所提供的一次性身份验证密钥是否与不必要的跟踪保护密钥匹配。如果提供方未预配为 FHN 信标或验证失败,则返回未经身份验证的错误。
当启用“不必要的跟踪”保护模式时,信标应将 MAC 私有地址轮换频率降低到每 24 小时一次。所宣传的临时标识符应像往常一样保持轮换。帧类型应设置为 0x41。该状态也会反映在哈希标记部分中。
停用不需要的跟踪保护模式
提供商会验证以下信息:
- 提供的一次性身份验证密钥与不必要的跟踪保护密钥一致。
- 哈希处理后的临时身份密钥与当前的临时身份密钥一致。
如果提供方未预配为 FHN 信标或验证失败,则提供方会返回未经身份验证的错误。
当不必要的跟踪保护模式停用后,信标应再次开始以正常速率轮换 MAC 地址,并与临时标识符轮换同步。帧类型应重新设置为 0x40。该状态也会反映在哈希标志部分中。
成功后,提供程序会发送表 6 中的响应(数据 ID 为 0x07 或 0x08)进行通知。
身份验证段定义为 HMAC-SHA256(unwanted tracking protection key, protocol major version number ||
the last nonce read from the characteristic || data ID || data length ||
0x01)
的前 8 个字节。
通告的帧
完成配置后,提供方应至少每 2 秒播送一次 FHN 帧。如果通告了快速配对框架,提供方应将 FHN 框架穿插在常规的快速配对广告中。例如,每隔 2 秒,提供方应通告 7 个快速配对广告和 1 个 FHN 广告。
FHN 广告的传导蓝牙发射功率应设置为至少 0 dBm。
FHN 帧携带一个公钥,任何支持众包网络的客户端都可以使用该公钥加密位置信息报告。有两种类型的椭圆曲线密钥可供使用:一种是适合旧版 BLE 4 帧的 160 位密钥,另一种是需要 BLE 5 且具有扩展广告功能的 256 位密钥。提供程序的实现决定了使用哪条曲线。
FHN 帧的结构如下。
八位字节 | 值 | 说明 |
---|---|---|
0 | 0x02 | 长度 |
1 | 0x01 | 标志数据类型值 |
2 | 0x06 | 标志数据 |
3 | 0x18 或 0x19 | 长度 |
4 | 0x16 | 服务数据数据类型值 |
5 | 0xAA | 16 位服务 UUID |
6 | 0xFE | … |
7 | 0x40 或 0x41 | 具有不需要的跟踪保护模式指示的 FHN 框架类型 |
8..27 | 20 字节的临时标识符 | |
28 | 哈希标志 |
表 8:支持 160 位曲线的 FHN 帧。
表 9 显示了 256 位曲线的字节偏移量和值。
八位字节 | 值 | 说明 |
---|---|---|
0 | 0x02 | 长度 |
1 | 0x01 | 标志数据类型值 |
2 | 0x06 | 标志数据 |
3 | 0x24 或 0x25 | 长度 |
4 | 0x16 | 服务数据数据类型值 |
5 | 0xAA | 16 位服务 UUID |
6 | 0xFE | … |
7 | 0x40 或 0x41 | 具有不需要的跟踪保护模式指示的 FHN 框架类型 |
8..39 | 32 字节的临时标识符 | |
40 | 哈希标志 |
表 9:支持 256 位曲线的 FHN 框架。
临时标识符 (EID) 计算
通过使用临时身份密钥对以下数据结构进行 AES-ECB-256 加密来生成随机数:
八位字节 | 字段 | 说明 |
---|---|---|
0 - 10 | 内边距 | 值 = 0xFF |
11 | K | 轮替周期指数 |
12 - 15 | TS[0]...TS[3] | 信标时间计数器,采用 32 位大端格式。清除最低的 K 位。 |
16 - 26 | 内边距 | 值 = 0x00 |
27 | K | 轮替周期指数 |
28 - 31 | TS[0]...TS[3] | 信标时间计数器,采用 32 位大端格式。清除最低的 K 位。 |
表 10:伪随机数的构造。
此计算的结果是一个 256 位数字,表示为 r'
。
在其余计算中,SECP160R1
或 SECP256R1
用于椭圆曲线加密操作。有关曲线定义,请参阅
SEC 2:推荐的椭圆曲线域参数,其中定义了接下来会引用的 Fp
、n
和 G
。
现在,通过计算 r = r' mod n
,r'
会投影到有限域 Fp
。
最后,计算 R = r * G
,这是曲线上的一个点,表示正在使用的公钥。信标会广播 Rx
(即 R
的 x
坐标)作为其临时标识符。
哈希标志
哈希标志字段的计算方式如下(位从最高有效位到最低有效位):
- 位 0-4:保留(设置为零)。
- 第 5-6 位表示设备的电池电量,如下所示:
- 00:不支持电池电量指示
- 01:电池电量正常
- 10:电池电量低
- 11:电池电量严重不足(需要尽快更换电池)
- 如果信标处于不必要的跟踪保护模式,则将位 7 设置为 1,否则设置为 0。
为了生成此字节的最终值,它与 SHA256(r)
的最低有效字节进行异或运算。
请注意,r 应与曲线的大小保持一致。如果其表示形式短于 160 或 256 位,则添加零作为最高有效位;如果其表示形式长于 160 或 256 位,则应截断最高有效位。
如果信标不支持电池电量指示,并且未处于不必要的跟踪保护模式,则允许从广告中完全省略此字节。
使用 EID 进行加密
若要加密消息 m
,发现者(已从信标读取 Rx
)将执行以下操作:
- 在
Fp
中选择一个随机数s
,如 EID 计算部分中所定义。 - 计算
S = s * G
。 - 通过在曲线方程中进行替换并从可能的结果中选择任意
Ry
值来计算R = (Rx, Ry)
。 - 计算 256 位 AES 密钥
k = HKDF-SHA256((s * R)x)
,其中(s * R)x
是曲线乘法结果的x
坐标。未指定盐。 - 假设
URx
和LRx
分别是Rx
的高 80 位和低 80 位(采用大端字节序格式)。以类似方式为S
定义USx
和LSx
。 - 计算
nonce = LRx || LSx
。 - 计算
(m’, tag) = AES-EAX-256-ENC(k, nonce, m)
。 - 向所有者发送
(URx, Sx, m’, tag)
,可能通过不可信的远程服务发送。
解密使用 EID 加密的值
拥有 EIK 和轮换周期指数的所有者的客户端按如下方式解密消息:
- 给定
URx
,获取URx
所基于的信标时间计数器值。 为此,所有者的客户端可以计算最近过去和不久将来的信标时间计数器值的Rx
值。 - 根据
URx
所基于的信标时间计数器值,计算 EID 计算部分中定义的r
的预期值。 - 计算
R = r * G
,并验证是否与观测者提供的URx
值匹配。 - 通过在曲线方程中进行替换并从可能的结果中选择任意
Sy
值来计算S = (Sx, Sy)
。 - 计算
k = HKDF-SHA256((r * S)x)
,其中(r * S)x
是曲线乘法结果的x
坐标。 - 计算
nonce = LRx || LSx
。 - 计算
m = AES-EAX-256-DEC(k, nonce, m’, tag)
。
ID 轮替
必须使用可解析 (RPA) 或不可解析 (NRPA) 的 BLE 地址来广播 FHN 帧。对于 LE 音频 (LEA) 设备,RPA 是必需的;对于其他设备,建议使用 RPA,但未使用绑定的定位器标签除外。
快速配对广告、FHN 广告和相应的 BLE 地址应同时轮换。平均每 1024 秒轮换一次。信标开始播发新标识符的确切时间点必须在窗口内随机确定。
随机化轮替时间的推荐方法是将其设置为下一个预期轮替时间(如果未应用随机化),再加上 1 到 204 秒范围内的正随机时间因子。
当设备处于“防范不必要的追踪”模式时,FHN 广播的 BLE 地址应固定不变,但 FP 不可发现广播(例如快速配对)的 RPA 必须保持轮转。对于不同的协议,可以使用不同的地址。
从断电中恢复
临时标识符的解析与广告投放时的时钟值密切相关,因此,如果出现断电情况,提供方能够恢复其时钟值非常重要。建议提供方至少每天将当前时钟值写入非易失性内存一次,并在启动时检查 NVM,看看是否有可用于初始化的值。临时标识符的解析器将实现足够时间窗口内的解析,以允许合理的时钟漂移和此类断电恢复。
提供商仍应尽一切努力最大限度地减少时钟漂移,因为解决时间窗口有限。应实现至少一种额外的时钟同步方法(通过广播不可发现的快速配对帧或实现消息流)。
快速配对实现指南
本部分介绍了支持 FHN 的提供程序上快速配对实现的特殊方面。
定位追踪器专用指南
- 如果提供方已配对,但 FHN 未在 5 分钟内完成配置(或者在设备已配对但未完成 FHN 配置时应用了 OTA 更新),提供方应恢复为出厂配置并清除存储的账号密钥。
- 配对后,提供方在 FHN 预配完成之前或 5 分钟内不应更改其 MAC 地址。
- 如果从设备中清除临时身份密钥,设备应执行恢复出厂设置并清除存储的账号密钥。
- 提供程序应拒绝正常的蓝牙配对尝试,仅接受快速配对。
- 提供商必须包含一种机制,让用户能够在不恢复出厂设置的情况下暂时停止广告(例如,按下一组按钮)。
- 断电后,设备应广播不可发现的快速配对帧,直到下次调用读取信标参数。这样一来,即使发生严重的时钟漂移,Seeker 也能检测到设备并同步时钟。
- 在宣传不可发现的快速配对框架时,不应启用界面指示。
- 当提供程序已为 FHN 配置时,不应广播可发现的快速配对框架。
- 提供方不应以未经身份验证的方式公开任何身份识别信息(例如名称或标识符)。
标准蓝牙设备专用指南
本部分介绍了支持 FHN 的传统蓝牙设备的特殊方面。
已配对设备的 FHN 配置
当提供者与搜寻者配对时,不一定会立即为 FHN 配置提供者,而是在配对后的一段时间。在这种情况下,提供方可能没有建立 GATT 连接所需的最新 BLE MAC 地址。提供方必须支持以下至少一种方式,以便搜索方在已配对的情况下获取其 BLE 地址:
- 提供方可以定期广播 Fast Pair 账号数据,以便寻求方通过 BLE 扫描找到其 BLE 地址。
此方法适合不实现消息流的提供方。 - 提供方可以通过传统蓝牙上的快速配对消息流提供此数据。
此方法适用于在通过蓝牙连接到搜索设备时,不广播快速配对框架的提供方。
同时支持这两种方法可提高用户为 FHN 配置设备的机会。
快速配对消息流
提供方可以实现快速配对消息流,并使用它来通知搜寻方有关设备信息。实现消息流可启用本部分中所述的某些功能。
每次建立消息流 RFCOMM 渠道时,提供方都应发送设备信息消息。
固件版本(设备信息代码 0x09)和跟踪功能
当固件更新为提供方添加 FHN 支持时,已连接的搜索方可以通知用户并提供配置选项。否则,用户必须手动前往蓝牙设备列表,才能启动 FHN 配置。
为了实现此目的,提供方应使用固件版本属性(代码 0x09)报告表示固件版本的字符串值。此外,提供方应支持一种协议,让搜寻方能够了解因固件更新而导致的功能变更。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 设备信息事件 | 0x03 |
1 | uint8 | 固件版本 | 0x09 |
2 - 3 | uint16 | 其他数据长度 | 各不相同 |
var | 字节数组 | 版本字符串 | 各不相同 |
表 11:设备信息事件:更新后的固件版本。
在收到功能更新请求 (0x0601) 后,如果提供方已启用对 FHN 跟踪的支持,则应按表 12 所示进行响应。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 设备功能同步事件 | 0x06 |
1 | uint8 | FHN 跟踪 | 0x03 |
2 - 3 | uint16 | 其他数据长度 | 0x0007 |
4 | uint8 | FHN 配置状态 | 如果未配置,则为 0x00;如果已由任何账号配置,则为 0x01 |
5 - 10 | 字节数组 | 设备的当前 BLE MAC 地址 | 各不相同 |
表 12:设备功能同步事件:添加了跟踪功能。
当前临时标识符(设备信息代码 0x0B)
当提供方已配置为使用 FHN 时,可以使用当前临时标识符(代码 0x0B)来报告当前 EID 和时钟值,以便在出现时钟漂移(例如,由于电池电量耗尽)时同步搜索方。否则,搜索者会为此目的发起费用更高且可靠性更低的连接。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 设备信息事件 | 0x03 |
1 | uint8 | 当前临时标识符 | 0x0B |
2 - 3 | uint16 | 其他数据长度 | 0x0018 或 0x0024 |
4 - 7 | 字节数组 | 时钟值 | 示例:0x13F9EA80 |
8 - 19 或 31 | 字节数组 | 当前 EID | 示例: 0x1122334455667788990011223344556677889900 |
表 13:设备信息事件:时钟同步。
恢复出厂设置
对于支持恢复出厂设置的设备:如果执行恢复出厂设置,提供方必须停止信标广播,并清除临时身份密钥和所有已存储的账号密钥,包括所有者的账号密钥。
在恢复出厂设置(手动或以程序化方式)后,提供方不应立即开始播报快速配对,以防止配对流程在用户删除设备后立即开始。
防范恶意追踪
经过认证的 FHN 设备还必须满足 检测不必要的定位追踪器 (DULT) 的跨平台规范的实现版本中的要求。
与 FHN 相关的特定准则(符合 DULT 规范):
- 任何与 FHN 兼容的设备都必须在 Nearby Device Console 中注册,并且已启用“查找 Hub”功能。
- 设备必须实现 DULT 规范的实现版本中定义的配件非所有者服务和特征,包括配件信息操作和非所有者控制。
- 在 DULT 规范中定义的向后兼容性期间,不会对本文档中定义的已宣传帧进行任何更改。
- 本文档中定义的“不必要的跟踪保护模式”对应于 DULT 规范中定义的“分离状态”。
- 实现配件信息操作码的指南:
- Get_Product_Data 应返回控制台提供的模型 ID,并用零填充以满足 8 字节的要求。例如,模型 ID 0xFFFFFF 会以 0x0000000000FFFFFF 的形式返回。
- Get_Manufacturer_Name 和 Get_Model_Name 应与控制台中提供的值一致。
- 如果没有其他类别更适合设备类型,Get_Accessory_Category 可以返回通用的“位置跟踪器”值。
- Get_Accessory_Capabilities 必须指明对响铃和 BLE 标识符查找的支持。
- Get_Network_ID 应返回 Google 的标识符 (0x02)。
- 实现 Get_Identifier 操作码的指南:
- 在用户激活“识别”模式(需要组合按键)后的 5 分钟内,该操作应仅返回有效响应。应通过视觉或音频信号向用户指示提供方已进入该模式。必须向 Google 提供用于激活该模式的特定于型号的说明,作为认证要求,并且必须在对说明进行任何更新或修改之前至少 10 天提供。
- 响应的构造方式如下:当前临时标识符的前 10 个字节,后跟
HMAC-SHA256(recovery key, the truncated current ephemeral identifier)
的前 8 个字节。
- 通过 NFC 实现标识符的指南:
- 作为网址,请使用
find-my.googleapis.com/lookup
。 - 对于
e
参数,请使用为 Get_Identifier 构建的相同响应(以十六进制编码)。 - 对于
pid
参数,请使用为 Get_Product_Data 构建的相同响应(以十六进制编码)。
- 作为网址,请使用
- 设备必须包含发声器并支持响铃功能。根据 DULT 规范,发声器必须发出声音,其峰值响度至少为 60 方(根据 ISO 532-1:2017 的定义)。
- 实现 Sound_Start 操作码的指南:
- 该命令应触发所有可用组件响铃。
- 应使用支持的最大音量。
- 建议的响铃时长为 12 秒。
- 定位器标签必须包含一种机制,让用户可以在不恢复出厂设置的情况下暂时停止广播(例如,按下一组按钮)。
- 停用说明必须记录在公开提供的网址中,并作为认证要求提供给 Google,且必须在对说明进行任何更新或修改之前至少 10 天提供给 Google。
- 网址应支持本地化。根据客户端的不同,语言将以查询参数(例如“hl=en”)或使用“accept-language”HTTP 标头提供。
可切换协议指南
- 一次只能使用一种协议。确保设备上同时运行的网络不超过一个。此要求旨在确保不同协议之间不会混杂敏感用户数据。
- 建议在设备中加入硬重置工作流,以便用户使用其他网络重新设置设备。
- 将设备更新到网络的过程应简单易用,并且在不同网络之间保持公平。用户必须能够选择要使用的网络,而无需优先选择某个网络。此流程需要获得 Google 团队的批准。
固件更新
合作伙伴应使用自己的移动应用或 Web 应用工作流来管理 OTA 更新的流程和分发。
快速配对支持向用户发送通知,告知用户有可用的 OTA 更新。如需使用此机制,请执行以下操作:
- 应在附近设备控制台中更新最新的固件版本。
- 应在“附近设备”控制台中设置配套应用。它应支持固件更新 intent。
- 提供方应实现固件版本 GATT 特征。
为防止跟踪,应限制对固件修订版本特征的访问。Seeker 将首先读取配置状态并提供身份验证密钥(如本规范中所定义),然后才会读取固件修订版本。此操作将通过同一连接完成。如果尝试读取固件修订版本,但提供程序未绑定,或者未通过同一连接成功完成经过身份验证的操作,则提供程序应返回未经身份验证的错误。
兼容性
如要使用“查找中心”网络,必须开启位置信息服务和蓝牙。 需要移动网络服务或互联网连接。适用于 Android 9 及更高版本,并且仅限部分国家/地区内符合年龄要求的用户使用。
更新日志
FHN 版本 | 日期 | 评论 |
---|---|---|
v1 | FHN 规范的初始抢先体验版本。 | |
v1.1 | 2023 年 2 月 |
|
v1.2 | 2023 年 4 月 |
|
v1.3 | 2023 年 12 月 |
|