v1.3
“查找中心”网络 (FHN) 配件规范定义了一种端到端加密方法,用于跟踪信标蓝牙低功耗 (BLE) 设备。本页介绍了 FHN 作为 Fast Pair 规范的扩展功能。 如果提供商有与 FHN 兼容的设备,并且愿意为这些设备启用位置信息跟踪,则应启用此扩展服务。
GATT 规范
应向快速配对服务添加一个额外的通用属性 (GATT) 特征,其语义如下:
| 快速配对服务特征 | 已加密 | 权限 | UUID |
|---|---|---|---|
| 信标操作 | 否 | 读取、写入和通知 | FE2C1238-8366-4814-8EB0-01DE32100BEA |
表 1:FHN 的快速配对服务特征。
身份验证
此扩展程序所需的操作以写入操作的形式执行,并通过质询-响应机制进行保护。在执行任何操作之前,搜索器应从表 1 中的特征执行读取操作,从而获得以下格式的缓冲区:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 协议主版本号 | 0x01 |
| 1 - 8 | 字节数组 | 一次性随机数 | 各不相同 |
每次读取操作都应生成不同的随机数,并且单个随机数应仅对单个操作有效。即使操作失败,也必须使相应 nonce 失效。
然后,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 所示。本部分稍后将更详细地介绍每项操作。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 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 - 变量 | 字节数组 <0x | 其他数据 <0x |
|
表 2:信标配置请求。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 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:信标配置密钥恢复请求。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 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:响铃请求。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 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 之前发送。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 <0x0 | uint8 | 数据 ID <0x |
|
| 1 | uint8 | 数据长度 | 各不相同 |
| 2 - 9 | 字节数组 | 身份验证 | 详细的每项操作 |
| 10 - 变量 <0x0A | 字节数组 <0x | 其他数据 <0x |
|
表 6:Beacon 服务响应。
表 7 列出了操作可能返回的 GATT 错误代码。
| 代码 | 说明 | 备注 |
|---|---|---|
| 0x80 | 未通过身份验证 | 在身份验证失败(包括使用旧随机数的情况)时,针对写入请求返回。 |
| 0x81 | 值无效 | 当提供任何无效值或收到的数据具有意外的字节数时返回。 |
| 0x82 | 未征得用户同意 | 当设备未处于配对模式时,在响应数据 ID 为 0x04:在征得用户同意的情况下读取临时身份密钥 的写入请求时返回。 |
表 7:GATT 错误代码。
读取 beacon 的参数
Seeker 可以通过对包含数据 ID 为 0x00 的表 2 中的请求的特征执行写入操作,来向 Provider 查询 beacon 的参数。提供方会验证所提供的一次性身份验证密钥是否与设备上存储的任何账号密钥相匹配。
如果验证失败,提供程序会返回未经身份验证的错误。
成功后,提供程序会发送表 6 中的响应,并将数据 ID 设置为 0x00。提供方按如下方式构建数据细分:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 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)进行通知。提供方按如下方式构建数据细分:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 <0x0 | uint8 | 配置状态 | 具有以下值的位掩码:
|
| 1 - 20 或 32 | 字节数组 | 当前临时标识符 | 20 或 32 字节(取决于所用的加密方法),用于指示信标当前广播的临时 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 信号标,或更改已配置的提供方的临时身份密钥,搜索方会向包含表 2 中数据 ID 为 0x02 的请求的特征执行写入操作。提供商会验证以下信息:
- 提供的一次性身份验证密钥与所有者账号密钥一致。
- 如果提供了临时身份密钥的哈希值,则该哈希值与当前的临时身份密钥相匹配。
- 如果未提供临时身份密钥的哈希值,请验证提供方是否尚未预配为 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 的请求。提供方按如下方式构建数据细分:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 <0x0 | uint8 | 响铃操作 | 具有以下值的位掩码:
|
| 1 - 2 | uint16 | 超时 <0x0 | 超时时间(以分秒为单位)。不得为零,且不得超过 10 分钟的等效值。 提供方使用此值来确定在自行静音之前应响铃多长时间。如果设备的任何组件已在响铃,则超时会替换已生效的超时。 如果将振铃操作设置为 0x00,则系统会忽略超时。 |
| 3 <0x0 | uint8 | Volume <0x0 |
|
收到请求后,提供商会验证以下内容:
- 提供的一次性身份验证密钥与铃声密钥一致。
- 所请求的状态与可响铃的组件相匹配。
如果提供方未预配为 FHN 信标或验证失败,则返回未经身份验证的错误。不过,如果提供方的不必要跟踪保护处于有效状态,并且触发不必要跟踪保护的请求已开启跳过响铃身份验证标志,则提供方应跳过该检查。身份验证数据仍应由 Seeker 提供,但可以设置为任意值。
当响铃开始或结束时,系统会发送如表 6 所示的通知,数据 ID 为 0x05。通知的内容定义如下:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 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)进行通知。提供方按如下方式构建数据细分:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 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。
启用“不必要的跟踪保护”模式时
提供方按如下方式构建数据细分:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 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 个字节。
精确查找
本部分详细介绍了精确查找所需的流程和其他操作。GATT 特征和身份验证的规则与 GATT 规范部分中定义的规则相同。精确定位是可选的。
精确定位发现结果的类型取决于参与精确定位的设备支持的测距技术类型。如需了解支持的测距技术,请参阅测距:带外消息序列和载荷规范。后续部分将探讨基于所用测距技术可以获得何种精度的查找体验。
精确查找流程
本部分将探讨精确定位的 FHNA 消息流。图 1 显示了消息的流向,各段落更详细地说明了每条消息。

图 1 精确查找消息的典型流程
发起方设备是指安装了“查找中心”应用并从中启用了“精准查找”功能的设备。发起方是尝试查找另一设备的设备。
响应方设备是指正被发起方设备尝试查找的设备。
发起方设备向响应方设备发送测距功能请求消息,其中会列出发起方设备希望从响应方设备了解的测距技术。响应方设备将回复测距功能响应通知,其中包含有关支持哪些测距技术及其功能的信息。回答者将仅包含发起者请求的信息。功能列表将根据响应方设备偏好的测距技术的优先级进行排序,列表中的第一个功能具有最高优先级。
然后,发起方设备将发送测距配置消息,其中将定义它要使用的每种测距技术的配置。在收到此消息后,响应方设备必须使用提供的配置开始测距(针对适用的技术)。响应方设备将发回测距配置响应通知,其中包含每项测距技术是否成功启动的结果。有些测距技术必须在发起方和响应方设备上同时启动才能成功进行测距会话,而对于其他技术,只需在发起方设备上启动即可,但响应方设备仍必须回复成功结果。有关特定测距技术行为的更多信息,请参阅后面的部分。
当发起方设备准备好停止精确定位会话时,它会向响应方发送“停止测距”消息,指明哪些测距技术必须停止测距。响应方设备将通过“停止测距响应”通知进行响应,表明其已成功停止使用所请求的测距技术进行测距。
如果 FHNA BLE GATT 通信渠道在精确查找会话期间断开连接,但部分测距技术仍在测距,则响应方设备将实现超时机制,以确保不会无限期测距。具体细节取决于每个用例。
请注意,响应方设备不得假定操作顺序始终相同。例如,响应方设备必须能够连续处理多个测距功能请求操作,甚至能够直接处理测距配置操作,而无需先进行功能请求。
精确查找操作
表 8 显示了本文档定义的、需要用于精准查找的 FHNA 操作。每个子部分都定义了相应操作的 FHNA 消息,而其他数据字段内容则参考了测距:带外消息序列和载荷规范。
| 操作 | 数据 ID | 说明 |
|---|---|---|
| 测距功能请求 | 0x0A | 由发起方设备发送到响应方设备的功能请求操作。此操作的数据内容将列出发起方希望从响应方设备了解的所有测距技术。 |
| 测距功能响应 | 0x0A | 这是对测距功能请求操作的通知响应。它包含有关发起方请求的每种受支持的测距技术的功能的信息。 |
| 测距配置 | 0x0B | 测距配置操作包含发起方设备想要开始与响应方设备进行测距的测距技术配置。 |
| 测距配置响应 | 0x0B | 这是对测距配置操作的通知响应。它包含有关 Responder 设备是否已根据提供的配置成功开始使用所请求的测距技术进行测距的数据。 |
| RFU | 0x0C | 具有此数据 ID 的操作未使用,预留以供将来使用。 |
| 停止测距 | 0x0D | 发起方设备发送的“停止测距”操作包含的信息用于指示响应方设备必须停止使用哪些测距技术。 |
| 停止测距响应 | 0x0D | 这是对停止测距操作的通知响应。它包含有关特定测距技术的停止操作是否成功的数据。 |
表 8:精准查找操作。
测距功能请求操作
表 9 定义了测距功能请求消息。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 数据 ID | 0x0A - 测距功能请求操作 |
| 1 | uint8 | 数据长度 | 不定 |
| 2 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(账号密钥,协议主要版本号 || 从特征读取的最后一个随机数 || 数据 ID || 数据长度 || 附加数据) 的前 8 个字节。 |
| 10 | 字节数组 | 其他数据 | 测距功能请求消息,如测距:带外消息序列和载荷规范中所定义(包括标头和载荷) |
表 9:测距功能请求。
测距功能响应操作
表 10 定义了测距功能响应消息。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 数据 ID | 0x0A:测距功能响应 |
| 1 | uint8 | 数据长度 | 不定 |
| 2 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(账号密钥,协议主要版本号 || 从特征读取的最后一个随机数 || 数据 ID || 数据长度 || 其他数据 || 0x01) 的前 8 个字节。 |
| 10 | 字节数组 | 其他数据 | 测距功能响应消息,如测距:带外消息序列和载荷规范中所定义(包括标头和载荷) |
表 10:测距功能响应。
测距配置操作
表 11 定义了测距配置消息。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 数据 ID | 0x0B - 设置测距配置 |
| 1 | uint8 | 数据长度 | 不定 |
| 2 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(账号密钥,协议主要版本号 || 从特征读取的最后一个随机数 || 数据 ID || 数据长度 || 附加数据) 的前 8 个字节。 |
| 10 | 字节数组 | 其他数据 | 测距:带外消息序列和载荷规范中定义的测距配置消息(包括标头和载荷) |
表 11:测距配置。
测距配置响应操作
表 12 定义了测距配置响应消息。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 数据 ID | 0x0B - 设置测距配置响应 |
| 1 | uint8 | 数据长度 | 不定 |
| 2 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(账号密钥,协议主要版本号 || 从特征读取的最后一个随机数 || 数据 ID || 数据长度 || 其他数据 || 0x01) 的前 8 个字节。 |
| 10 | 字节数组 | 其他数据 | 测距:带外消息序列和载荷规范中定义的测距配置响应消息(包括标头和载荷) |
表 12:测距配置响应。
停止测距操作
表 13 定义了停止测距消息。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 数据 ID | 0x0D - 测距停止 |
| 1 | uint8 | 数据长度 | 不定 |
| 2 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(账号密钥,协议主要版本号 || 从特征读取的最后一个随机数 || 数据 ID || 数据长度) 的前 8 个字节。 |
| 10 | 字节数组 | 其他数据 | 测距:带外消息序列和载荷规范中定义的停止测距消息(包括标头和载荷) |
表 13:停止测距。
停止测距响应操作
表 14 定义了停止测距响应消息。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 数据 ID | 0x0D - 测距停止响应 |
| 1 | uint8 | 数据长度 | 不定 |
| 2 | 字节数组 | 一次性身份验证密钥 | HMAC-SHA256(账号密钥,协议主要版本号 || 从特征读取的最后一个随机数 || 数据 ID || 数据长度 || 其他数据 || 0x01) 的前 8 个字节。 |
| 10 | 字节数组 | 其他数据 | 停止测距响应消息,如 Ranging: Out-of-band message sequence and payload 规范(包括标头和载荷)中所定义 |
表 14:停止测距响应。
包含精确查找功能的恶意追踪防护
当启动“不必要的跟踪保护”模式时(如“不必要的跟踪保护”部分中所述),对于想要支持此功能的设备,跳过响铃消息的身份验证检查的流程同样适用于本文档中定义的所有“精准查找”消息。
精确查找的测距技术规格
此部分包含测距技术特有的详细信息。
超宽带 (UWB) 规范
UWB 特有的详细信息。
精确查找级别
使用 UWB 作为测距技术的精准查找会话可以显示距离和方向信息。测距间隔至少需要 240 毫秒,最好为 96 毫秒,以便获得最佳引导效果。
配置 ID
为 UWB 交换的带外配置数据不包含 UWB 启动 UWB 测距会话所需的完整的一组可用可配置参数。某些形参由所选配置 ID 隐式选择。
每个配置 ID 都是一组预定义的 UWB 配置参数, 已公开记录。 对于“精准查找”使用情形,响应方设备必须支持 config ID 6,并且可以选择性地支持 config ID 3。
UWB 启动器和响应器
对于“精准查找”使用情形,本文档中标记为“发起方设备”的设备将是 UWB 应答方,而本文档中标记为“应答方设备”的设备将是 UWB 发起方。这是因为 UWB 启动器设备比 UWB 应答器设备消耗的电量更少,而且在大多数情况下,应答器设备将是电池电量有限的外围设备。
这意味着,响应方设备需要在测距功能响应消息中指明其支持作为 UWB 启动方角色。
其他与 UWB 相关的参数
- 必须支持频道 9
- 为获得最佳指导,建议使用 96 毫秒的测距间隔,否则必须支持 240 毫秒的测距间隔。
- 建议使用 1 毫秒的时隙时长以节省电池电量,但系统也支持 2 毫秒的时隙时长。
- UWB 芯片必须至少符合 FIRA v1.2 + P-STS 标准。
- BPRF 为强制性,HPRF 为推荐性,但可选。支持的模式或所选模式由支持的或所选的前导序列索引确定。
- 会话安全类型:P-STS
BLE 信道探测 (CS) 规范
BLE CS 特有的详细信息。
精确查找级别
使用 CS 作为测距技术的精准查找会话只会提供距离测量结果,目前不提供方向性信息。
设备之间所需的配对
如果设备未配对,则无法使用信道探测进行精确定位。发起方设备与响应方设备之间必须存在现有绑定。此规范未提供在设备之间创建绑定的方法。相反,用例的开发者需要负责在设备之间建立这种绑定关系。
客服人员需要采取行动
与 UWB 不同的是,在 UWB 中,两个设备都需要显式调用 UWB 启动测距和停止测距 API;而在 CS 中,只有发起方设备需要通过调用蓝牙堆栈来启动 CS 测距,响应方设备上的其余初始化操作则通过蓝牙 (BT) 带内进行。这意味着,在收到 CS 的测距配置消息或停止测距消息后,如果已启用 BT,响应方无需执行任何操作,只需回复测距配置响应消息通知即可。响应方设备可能会使用这些消息作为触发器来更新显示屏上的界面,或者无论是否有显示屏,都可以使用这些消息来提供有关设备状态的视觉反馈,例如闪烁设备 LED。
Wi-Fi NAN RTT
Wi-Fi NAN RTT 的具体详细信息。
精确查找级别
使用 Wi-Fi NAN RTT 作为测距技术的精准查找会话只会测量距离,目前不提供方向性。
BLE RSSI
BLE RSSI 具体详情。
精确查找级别
如果仅使用 BLE RSSI 作为测距技术,精准查找会话将无法获取距离或方向信息,因为 BLE RSSI 并非精确的测距技术。用户会看到指示设备靠近或设备远离的指导信息。
通告的帧
完成配置后,提供方应至少每 2 秒播送一次 FHN 帧。如果通告了快速配对帧,提供方应将 FHN 帧穿插在常规快速配对广告中。例如,提供方应每隔 2 秒通告 7 个快速配对通告和 1 个 FHN 通告。
FHN 广告的传导蓝牙发射功率应设置为至少 0 dBm。
FHN 帧包含一个公钥,任何支持众包网络的客户端都可以使用该公钥来加密位置信息报告。有两种类型的椭圆曲线密钥可供使用:一种是适合旧版 BLE 4 帧的 160 位密钥,另一种是需要 BLE 5 且具有扩展广告功能的 256 位密钥。提供程序的实现决定了使用哪条曲线。
FHN 帧的结构如下。
| Octet | 值 | 说明 |
|---|---|---|
| 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 | 哈希标志 |
表 15:支持 160 位曲线的 FHN 帧。
表 16 显示了 256 位曲线的字节偏移量和值。
| Octet | 值 | 说明 |
|---|---|---|
| 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 | 哈希标志 |
表 16:支持 256 位曲线的 FHN 帧。
临时标识符 (EID) 计算
通过使用临时身份密钥对以下数据结构进行 AES-ECB-256 加密来生成随机数:
| Octet | 字段 | 说明 |
|---|---|---|
| 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 位。 |
表 17:伪随机数的构造。
此计算的结果是一个 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)将执行以下操作:
- 选择 EID 计算部分中定义的
Fp中的随机数s。 - 计算
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所基于的 beacon 时间计数器值。 为此,所有者的客户端可以计算最近过去和不久将来的信标时间计数器值的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 地址。
- 如果从设备中清除临时身份密钥,设备应执行恢复出厂设置,并清除存储的账号密钥。
- 提供程序应拒绝正常的蓝牙配对尝试,仅接受快速配对。
- 提供方必须包含一种机制,让用户能够在不恢复出厂设置的情况下暂时停止广告(例如,按下一组按钮)。
- 断电后,设备应广播不可发现的快速配对帧,直到下次调用读取信标参数。这样一来,即使发生严重的时钟漂移,搜索器也能检测到设备并同步时钟。
- 在宣传不可发现的快速配对框架时,不应启用界面指示。
- 当提供程序已为 FHN 配置时,不应广播可发现的快速配对框架。
- 提供方不应以未经身份验证的方式公开任何身份识别信息(例如名称或标识符)。
标准蓝牙设备专用指南
本部分介绍了支持 FHN 的传统蓝牙设备的特殊方面。
已配对设备的 FHN 配置
当提供者与搜寻者配对时,不一定会立即为 FHN 配置提供者,而是在配对后的一段时间。在这种情况下,提供方可能没有建立 GATT 连接所需的最新 BLE MAC 地址。提供方必须支持以下至少一种方式,以便搜索方在已配对的情况下获取其 BLE 地址:
- 提供方可以定期广播快速配对账号数据,以便搜寻方通过 BLE 扫描找到其 BLE 地址。
此方法适用于未实现消息流的提供程序。 - 提供方可以通过传统蓝牙上的快速配对消息流提供此数据。
此方法适用于在通过蓝牙连接到搜索者时,不宣传快速配对框架的提供者。
同时支持这两种方法可提高用户为 FHN 配置设备的机会。
快速配对消息流
提供方可以实现快速配对消息流,并使用它来通知搜寻方设备信息。实现消息流可启用本部分中所述的某些功能。
每次建立消息流 RFCOMM 通道时,提供程序都应发送一次设备信息消息。
固件版本(设备信息代码 0x09)和跟踪功能
当固件更新为提供方添加 FHN 支持时,已连接的搜索方可以通知用户并提供配置选项。否则,用户必须手动前往蓝牙设备列表,才能启动 FHN 配置。
为了实现此目的,提供方应使用固件版本属性(代码 0x09)报告表示固件版本的字符串值。此外,提供程序应支持一种协议,让搜寻器能够了解因固件更新而导致的功能变更。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 设备信息事件 | 0x03 |
| 1 | uint8 | 固件版本 | 0x09 |
| 2 - 3 | uint16 | 其他数据长度 | 各不相同 |
| var | 字节数组 | 版本字符串 | 各不相同 |
表 18:设备信息事件:更新的固件版本。
在收到功能更新请求 (0x0601) 后,如果提供方已启用对 FHN 跟踪的支持,则应按表 12 所示进行响应。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 设备功能同步事件 | 0x06 |
| 1 | uint8 | FHN 跟踪 | 0x03 |
| 2 - 3 | uint16 | 其他数据长度 | 0x0007 |
| 4 | uint8 | FHN 配置状态 | 如果未配置,则为 0x00;如果已由任何账号配置,则为 0x01 |
| 5 - 10 | 字节数组 | 设备的当前 BLE MAC 地址 | 各不相同 |
表 19:设备功能同步事件:添加了跟踪功能。
当前临时标识符(设备信息代码 0x0B)
提供方可以使用当前临时标识符(代码 0x0B)在为 FHN 配置提供方时报告当前 EID 和时钟值,以便在出现时钟漂移(例如,由于电池电量耗尽)时同步搜索方。否则,搜索者会为此目的发起费用更高且可靠性更低的连接。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 设备信息事件 | 0x03 |
| 1 | uint8 | 当前临时标识符 | 0x0B |
| 2 - 3 | uint16 | 其他数据长度 | 0x0018 或 0x0024 |
| 4 - 7 | 字节数组 | 时钟值 | 示例:0x13F9EA80 |
| 8 - 19 或 31 | 字节数组 | 当前 EID | 示例: 0x1122334455667788990011223344556677889900 |
表 20:设备信息事件:时钟同步。
恢复出厂设置
对于支持恢复出厂设置的设备:如果执行恢复出厂设置,提供方必须停止信标广播,并清除临时身份密钥和所有已存储的账号密钥,包括所有者的账号密钥。
在恢复出厂设置(手动或以程序化方式)后,提供方不应立即开始播报快速配对,以防止在用户删除设备后立即开始配对流程。
防范恶意追踪
经过认证的 FHN 设备还必须满足 检测不必要的定位追踪器 (DULT) 的跨平台规范的实现版本中的要求。
与 FHN 相关的特定指南(符合 DULT 规范):
- 任何与 FHN 兼容的设备都必须在“附近的设备”控制台中注册,并且已启用“查找 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 特征。
为防止跟踪,应限制对固件修订版本特征的访问权限。搜索器将首先读取配置状态并提供身份验证密钥(如本规范中所定义),然后才会读取固件修订版本。此操作将通过同一连接完成。如果尝试读取固件修订版本,但提供程序未绑定,或者未通过同一连接成功完成经过身份验证的操作,则提供程序应返回未经身份验证的错误。
兼容性
如要使用“查找中心”网络,必须开启位置信息服务和蓝牙。 需要移动网络服务或互联网连接。适用于 Android 9 及更高版本,并且仅限部分国家/地区内符合年龄要求的用户使用。
更新日志
| FHN 版本 | 日期 | 评论 |
|---|---|---|
| v1 | 面向抢先体验用户的 FHN 规范初始版本。 | |
| v1.1 | 2023 年 2 月 |
|
| v1.2 | 2023 年 4 月 |
|
| v1.3 | 2023 年 12 月 |
|