v1.3
“查找我的设备网络”(FMDN) 配件规范定义了一种端到端加密方法,用于跟踪蓝牙低功耗 (BLE) 设备的信标。本页将介绍 FMDN 作为快速配对规范的扩展。 如果设备与 FMDN 兼容并愿意为这些设备启用位置信息跟踪功能,提供商应启用此扩展程序。
GATT 规范
应使用以下语义向快速配对服务添加其他通用属性 (GATT) 特征:
快速配对服务特征 | 已加密 | 权限 | UUID |
---|---|---|---|
信标操作 | 否 | 读取、写入和通知 | FE2C1238-8366-4814-8EB0-01DE32100BEA |
表 1:FMDN 的快速配对服务特征。
身份验证
此扩展程序所需的操作以写入操作的形式执行,并受到质询响应机制的保护。在执行任何操作之前,跳转者应根据表 1 中的特征执行读取操作,这将生成以下格式的缓冲区:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 协议主要版本号 | 0x01 |
1 - 8 | 字节数组 | 一次性随机 Nonce | 不固定 |
每个读取操作应产生不同的 Nonce,并且单个 Nonce 应仅对单个操作有效。即使操作失败,Nonce 也必须失效。
然后, Seeker 会计算一个一次性身份验证密钥,以便在后续写入请求中使用。身份验证密钥的计算方式如表 2 到表 5 所述。根据所请求的操作,探索器会证明对以下一个或多个键的了解:
账号密钥:快速配对规范中所定义的 16 字节快速配对账号密钥。
所有者账号密钥:在探索者首次访问信标操作特征时,提供方会选择一个现有账号密钥作为所有者账号密钥。在提供程序恢复出厂设置之前,所选所有者帐号密钥无法更改。当免费账号密钥槽用尽时,提供方不得移除所有者账号密钥。
如果提供程序在首次配对时就已支持 FMDN(或在恢复出厂设置后支持 FMDN),则会选择第一个账号密钥,因为当探索者在配对期间读取配置状态时,这是唯一的现有账号密钥。
在配对后(例如,通过固件更新)获得 FMDN 支持的提供商可以选择任何现有的账号密钥。合理的做法是,在固件更新后选择用于从信标操作特征中读取配置状态的第一个帐号密钥(假设执行更新的用户是提供方的当前所有者)。
临时身份密钥 (EIK):搜索者在执行 FMDN 配置过程时随机选择的 32 字节密钥。此密钥用于派生加密密钥,以便端到端加密位置信息报告。追逐者绝不会向后端透露这些信息。
恢复密钥:定义为
SHA256(ephemeral identity key || 0x01)
,会截断为前 8 个字节。密钥存储在后端,探索者可以使用它来 恢复 EIK,前提是用户通过按下设备上的按钮表示同意。环键:定义为
SHA256(ephemeral identity key || 0x02)
,截断为前 8 个字节。密钥存储在后端,探索者只能使用它来让设备响铃。不需要的跟踪保护密钥:定义为
SHA256(ephemeral identity key || 0x03)
,截断为前 8 个字节。密钥存储在后端,探索者只能将其用于启用多余的跟踪保护模式。
运维
表 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 | 字节数组 | 其他数据 |
|
表 2:信标配置请求。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
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 | uint8 | 数据 ID |
|
1 | uint8 | 数据长度 | 不固定 |
2 - 9 人 | 字节数组 | 身份验证 | 每项操作的详情 |
10 - var | 字节数组 | 其他数据 |
|
表 6:信标服务响应。
表 7 列出了操作可能会返回的 GATT 错误代码。
代码 | 说明 | 备注 |
---|---|---|
0x80 | 未通过身份验证 | 当身份验证失败(包括使用旧 Nonce 的情况)时,为了响应写入请求而返回。 |
0x81 | 值无效 | 如果提供了任何无效值或接收的数据包含的字节数不符合预期,则返回此值。 |
0x82 | 未征得用户同意 | 当设备未处于配对模式时,为了响应数据 ID 为 0x04:在征得用户同意的情况下读取临时身份密钥的写入请求,系统会返回此错误代码。 |
表 7:GATT 错误代码。
读取信标的参数
搜寻者可以通过对特征执行写入操作来向提供程序查询信标参数,该操作包含来自表 2 且数据 ID 为 0x00 的请求。提供程序会验证所提供的一次性身份验证密钥是否与设备上存储的任何帐号密钥匹配。
如果验证失败,Provider 会返回未经身份验证的错误。
成功后,提供程序使用表 6 的响应(数据 ID 为 0x00)发送通知。提供商按以下方式构建数据细分受众群:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 校准后的功率 | 在 0 米处接收的校准功率(一个 [-100, 20] 范围内的值)。以带符号整数表示,分辨率为 1 dBm。 |
1 - 4 | uint32 | 时钟值 | 当前时钟值,以秒为单位(大端字节)。 |
5 | uint8 | 曲线选择 | 用于加密的椭圆曲线:
|
6 | uint8 | 组件 | 能够响铃的组件数量:
|
7 | 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 个字节。
读取信标的配置状态
搜寻者可以通过对特征执行写入操作,向提供者查询信标的配置状态,特征包含来自表 2 且数据 ID 为 0x01 的请求。提供方会验证所提供的一次性身份验证密钥是否与设备上存储的任何账号密钥匹配。
如果验证失败,Provider 将返回未经身份验证的错误。
成功后,提供程序使用表 6 的响应(数据 ID 为 0x01)发送通知。提供商按以下方式构建数据细分受众群:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | 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 个字节。
设置临时身份密钥
为了将未预配的 provider 配置为 FMDN 信标,或更改已预配的 provider 的临时身份密钥,Seeker 会对该特征执行写入操作,该特征包含表 2 中数据 ID 为 0x02 的请求。提供商会验证:
- 提供的一次性身份验证密钥与所有者帐号密钥匹配。
- 如果提供了临时身份密钥的哈希值,则经过哈希处理的临时身份密钥与当前的临时身份密钥匹配。
- 如果未提供临时身份密钥的哈希值,请验证 Provider 尚未预配为 FMDN 信标。
如果验证失败,Provider 将返回未经身份验证的错误。
成功后,AES-ECB-128 会使用匹配的帐号密钥对临时身份密钥进行解密,从而恢复临时身份密钥。密钥应持久保留在设备上,并且从那时起,提供程序应开始通告 FMDN 帧。在 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 的请求。提供商会验证:
- 提供的一次性身份验证密钥与所有者帐号密钥匹配。
- 经过哈希处理的临时身份密钥与当前的临时身份密钥匹配。
如果提供程序未配置为 FMDN 信标或验证失败,则会返回未经身份验证的错误。
成功后,提供方会忘记密钥并停止通告 FMDN 帧。提供商使用表 6 的响应(数据 ID 为 0x03)发送通知。身份验证段定义为 HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || 0x01)
的前 8 个字节。
在征得用户同意的情况下读取临时身份密钥
此选项仅用于恢复丢失的密钥,因为密钥仅由探索者在本地存储。因此,只有当设备处于配对模式,或在按下设备上的实体按钮后的一段有限时间内(构成用户同意)时,此功能才可用。
搜寻者必须将恢复密钥存储在后端,才能恢复明文密钥,但不会存储 EIK 本身。
为了读取 EIK,寻道程序会对该特征执行写入操作,操作包括来自表 3 且数据 ID 为 0x04 的请求。提供商会验证:
- 经过哈希处理的恢复密钥与预期的恢复密钥匹配。
- 设备处于 EIK 恢复模式。
如果验证失败,Provider 将返回未经身份验证的错误。
如果设备未处于配对模式,提供程序会返回“未征得用户同意”错误。
成功后,提供程序使用表 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 | uint8 | 响铃操作 | 具有以下值的位掩码:
|
1 - 2 | uint16 | 超时 | 超时(以秒为单位)。不得为零,且不得大于 10 分钟。 提供程序使用此值来确定在将自己静音之前应响铃多久。如果设备的任何组件已在响铃,该超时将覆盖已经生效的超时时间。 如果响铃操作设置为 0x00,系统会忽略超时。 |
3 | uint8 | 音量 |
|
收到请求后,提供商会验证以下内容:
- 提供的一次性身份验证密钥与环密钥匹配。
- 请求的状态与可以响铃的组件匹配。
如果提供程序未配置为 FMDN 信标或验证失败,则会返回未经身份验证的错误。但是,如果 Provider 启用了不必要的跟踪保护,并且触发性不需要的跟踪保护请求启用了跳过响铃身份验证标志,则 Provider 应跳过该检查。身份验证数据仍应由探索器提供,但可以设置为任意值。
在响铃开始或终止时,系统会发送通知(如表 6 中所示),数据 ID 为 0x05。通知的内容定义如下:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | 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 的请求。提供商会验证所提供的一次性身份验证密钥是否与环密钥匹配。
如果提供程序未预配为 FMDN 信标,或者验证失败,则提供程序会返回未经身份验证的错误。
成功后,提供程序会使用表 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 轮替中的说明轮替所有标识符。“查找我的设备”服务可以通过“查找我的设备”网络中继恶意跟踪保护模式激活请求。这样一来,该服务会使 Provider 暂时使用固定的 MAC 地址,从而使客户端能够检测设备,并警告用户注意可能存在的恶意跟踪。
为了启用或停用信标的不需要的跟踪保护模式,搜索者会对该特征执行写入操作,其中包括来自表 5 的请求(数据 ID 分别为 0x07 或 0x08)。
启用恶意跟踪保护模式时
提供商按以下方式构建数据细分受众群:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 控制标记 |
只有在恶意的跟踪保护模式停用之前,这些标志才会生效。 |
提供商验证所提供的一次性身份验证密钥是否与不需要的跟踪保护密钥匹配。如果提供程序未配置为 FMDN 信标或验证失败,则会返回未经身份验证的错误。
当不必要的跟踪保护模式启用时,信标应将 MAC 私有地址轮替频率降低到每 24 小时一次。通告的临时标识符应照常轮替。帧类型应设置为 0x41。该状态也会反映在经过哈希处理的标志部分中。
停用多余的跟踪保护模式时
提供商会验证:
- 提供的一次性身份验证密钥与不需要的跟踪保护密钥匹配。
- 经过哈希处理的临时身份密钥与当前的临时身份密钥匹配。
如果提供程序未配置为 FMDN 信标或验证失败,则提供程序会返回未经身份验证的错误。
当不必要的跟踪保护模式停用时,信标应再次开始以正常速率旋转 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 秒至少通告 FMDN 帧一次。如果通告了快速配对帧,提供程序应在常规快速配对通告中交错 FMDN 帧。例如,提供程序应每两秒通告 7 个快速配对通告和 1 个 FMDN 通告。
FMDN 帧带有一个公钥,该公钥用于加密众包网络的任何支持客户端所生成的位置报告。可以使用两种类型的椭圆曲线密钥:适合旧版 BLE 4 帧的 160 位密钥,或需要具有扩展广播功能的 BLE 5 的 256 位密钥。提供程序的实现决定了使用哪种曲线。
FMDN 帧的结构如下所示。
八位字节 | 值 | 说明 |
---|---|---|
0 | 0x02 | 时长 |
1 | 0x01 | 标志数据类型值 |
2 | 0x06 | 标志数据 |
3 | 0x18 或 0x19 | 时长 |
4 | 0x16 | 服务数据类型值 |
5 | 0xAA | 16 位服务 UUID |
6 | 0xFE | ... |
7 | 0x40 或 0x41 | FMDN 帧类型,带有不必要的跟踪保护模式指示 |
8..27 | 20 字节的临时标识符 | |
28 | 经过哈希处理的标志 |
表 8:支持 160 位曲线的 FMDN 帧。
表 9 显示了 256 位曲线的字节偏移量和值。
八位字节 | 值 | 说明 |
---|---|---|
0 | 0x02 | 时长 |
1 | 0x01 | 标志数据类型值 |
2 | 0x06 | 标志数据 |
3 | 0x24 或 0x25 | 时长 |
4 | 0x16 | 服务数据类型值 |
5 | 0xAA | 16 位服务 UUID |
6 | 0xFE | ... |
7 | 0x40 或 0x41 | FMDN 帧类型,带有不必要的跟踪保护模式指示 |
8..39 | 32 字节的临时标识符 | |
40 | 经过哈希处理的标志 |
表 9:支持 256 位曲线的 FMDN 帧。
临时标识符 (EID) 计算
AES-ECB-256 会使用临时身份密钥加密以下数据结构,生成一个随机密钥:
八位字节 | Field | 说明 |
---|---|---|
0 - 10 人 | 内边距 | 值 = 0xFF |
11 | K | 轮替周期指数 |
12 - 15 岁 | TS[0]...TS[3] | 信标时间计数器,采用 32 位大端字节格式。最低位会被清除。 |
16 - 26 岁 | 内边距 | 值 = 0x00 |
27 | K | 轮替周期指数 |
28 - 31 岁 | TS[0]...TS[3] | 信标时间计数器,采用 32 位大端字节格式。最低位会被清除。 |
表 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
)将执行以下操作:
- 按照 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 位,采用大端格式。以类似的方式,为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 地址来通告 FMDN 帧。LEA 音频 (LEA) 设备需要使用 RPA,其他设备也建议使用 RPA,但不使用绑定的定位器标记除外。
快速配对通告、FMDN 通告和相应的 BLE 地址应同时轮替。平均应每 1024 秒轮替一次。信标开始通告新标识符的精确时间点必须在窗口中随机分配。
建议对旋转时间进行随机化处理,将其设为下一个预期旋转时间(如果未应用随机分配)加上 1 到 204 秒之间的正随机时间系数。
当设备处于恶意跟踪保护模式时,FMDN 通告的 BLE 地址应固定,但 FP 不可发现通告(如快速配对)的 RPA 必须保持旋转。可以针对不同的协议使用不同的地址。
断电恢复
解析临时标识符与其在通告时的时钟值密切相关,因此,必须确保提供程序能够在断电时恢复其时钟值。建议提供程序每天至少将其当前时钟值写入非易失性内存一次,并在启动时检查 NVM,查看是否存在可初始化的值。临时标识符的解析程序将在一段足够长的时间内实现解析,以便同时实现合理的时钟偏移和此类断电恢复。
由于解决时间窗口有限,提供程序应尽一切努力最大限度地减少时钟偏移。至少应实现一种额外的时钟同步方法(通告不可检测到的快速配对帧或实现消息流)。
快速配对实现指南
本部分介绍了在支持 FMDN 的提供程序上实现快速配对功能的特殊方面。
定位追踪器专属指南
- 如果提供方已配对,但未在 5 分钟内配置 FMDN(或者 OTA 更新已在设备配对时应用但未配置 FMDN),提供方应恢复为出厂配置并清除存储的帐号密钥。
- 配对 Provider 后,在配置 FMDN 或 5 分钟后不应更改其 MAC 地址。
- 如果从设备中清除了临时身份密钥,则设备应恢复出厂设置并清除存储的帐号密钥。
- 提供商应拒绝正常的蓝牙配对尝试,并仅接受快速配对配对。
- Provider 必须包含一种可让用户暂时停止广告而不将设备恢复出厂设置的机制(例如,按下按钮组合)。
- 断电后,设备应通告无法检测到的快速配对帧,直到下次调用读取信标参数。这样,即使发生明显的时钟偏移,寻路器也可以检测设备并同步时钟。
- 通告不可检测到的快速配对帧时,不应启用界面指示。
- 当提供程序为 FMDN 配置时,不应通告可检测到的快速配对帧。
- Provider 不应以未经身份验证的方式公开任何身份信息(例如名称或标识符)。
传统蓝牙设备特定准则
本部分介绍了支持 FMDN 的传统蓝牙设备的特殊之处。
已配对设备的 FMDN 配置
与探索器配对时,提供程序并非总是为 FMDN 预配,但经过一段时间后。在这种情况下,提供方可能没有建立 GATT 连接所需的最新 BLE MAC 地址。提供程序必须至少支持下列方法之一,才能让探索者在配对后获取其 BLE 地址:
- 提供程序可以定期通告快速配对帐号数据,以便探索者通过 BLE 扫描找到其 BLE 地址。
此方法适用于未实现消息流的 provider。 - Provider 可以通过经典蓝牙通过快速配对消息流提供这些数据。
此方法适用于在通过蓝牙连接到搜寻器时不通告快速配对帧的提供程序。
同时支持这两种方法可提高用户为 FMDN 配置设备的几率。
快速配对消息流
提供程序可以实现快速配对消息流,并用它来将设备信息通知给搜寻者。实现消息流会启用本部分中介绍的某些功能。
每当建立消息流 RFCOMM 通道时,提供程序都应发送一次设备信息消息。
固件版本(设备信息代码 0x09)和跟踪功能
当固件更新向提供程序添加 FMDN 支持时,已连接的查找器可以通知用户并提议对其进行配置。否则,用户必须手动导航到蓝牙设备列表才能启动 FMDN 配置。
为此,提供程序应使用固件版本属性(代码 0x09)报告表示固件版本的字符串值。此外,提供程序应支持可让探索者了解因固件更新而知晓的功能变更的协议。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 设备信息事件 | 0x03 |
1 | uint8 | 固件版本 | 0x09 |
2-3 个 | uint16 | 额外的数据长度 | 不固定 |
var | 字节数组 | 版本字符串 | 不固定 |
表 11:设备信息事件:已更新的固件版本。
收到功能更新请求 (0x0601) 后,如果提供方已启用对 FMDN 跟踪的支持,它应按表 12 所示进行响应。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 设备功能同步事件 | 0x06 |
1 | uint8 | FMDN 跟踪 | 0x03 |
2-3 个 | uint16 | 额外的数据长度 | 0x0007 |
4 | uint8 | FMDN 配置状态 | 如果未配置,则为 0x00;如果由任何账号配置,则为 0x01 |
5 - 10 | 字节数组 | 设备当前的 BLE MAC 地址 | 不固定 |
表 12:设备功能同步事件:添加了跟踪功能。
当前临时标识符(设备信息代码 0x0B)
在为 FMDN 配置提供程序时,提供程序可以使用当前的临时标识符(代码 0x0B)报告当前的 EID 和时钟值,以便在出现时钟偏移(例如,因电池电量耗尽)时同步查找器。否则,探索器会出于此目的发起费用更高且可靠性较低的连接。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 设备信息事件 | 0x03 |
1 | uint8 | 当前的临时标识符 | 0x0B |
2-3 个 | uint16 | 额外的数据长度 | 0x0018 或 0x0024 |
4-7 个 | 字节数组 | 时钟值 | 示例:0x13F9EA80 |
8 - 19 或 31 | 字节数组 | 当前 EID | 示例:0x1122334455667788990011223344556677889900 |
表 13:设备信息事件:时钟同步。
恢复出厂设置
对于支持恢复出厂设置的设备:如果执行恢复出厂设置,提供商必须停止信标,并擦除临时身份密钥和所有已存储的帐号密钥,包括所有者的帐号密钥。
恢复出厂设置(手动或程序化)后,提供程序不应立即开始通告快速配对,以防止配对流程在用户删除设备后立即启动。
防范恶意追踪
经过认证的 FMDN 设备还必须满足跨平台规范的 检测不必要的位置信息跟踪器 (DULT) 实现版本中的要求。
特定于 FMDN 的相关准则以符合 DULT 规范:
- 任何与 FMDN 兼容的设备都必须在“附近设备”控制台中注册,并启用“查找我的设备”功能。
- 设备必须实现 DULT 规范实现版本中定义的配件非所有者服务和特性,包括配件信息操作和非所有者控件。
- 在向后兼容期内(如 DULT 规范中所定义),在本文档中,通告的帧不会发生任何变化。
- 本文档中定义的“不必要的跟踪保护模式”映射到了 DULT 规范定义的“分隔状态”。
- 实现配件信息运算码的准则:
- Get_Product_Data 应返回控制台提供的模型 ID,填充零以符合 8 字节要求。例如,模型 ID 0xFFFFFF 会返回为 0x0000000000FFFFFF。
- Get_Manufacturer_Name 和 Get_Model_Name 应与控制台中提供的值一致。
- 如果没有其他类别更适合设备类型,那么 Get_Accessory_Category 可以返回通用的“Location Tracker”值。
- 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 个字节。
- 实现 Sound_Start 运算码的准则:
- 该命令应该会在所有可用组件中触发响铃。
- 应使用支持的最大音量。
- 建议的响铃时长为 12 秒。
- 定位工具标记必须包含一种机制,让用户能够暂时停止投放广告,而无需将设备恢复出厂设置(例如,按下组合按钮)。
- 停用说明必须记录在公开网址中,作为认证要求提供给 Google,并且在对说明进行任何更新或修改之前至少提前 10 天。
- 该网址应支持本地化。系统会以查询参数(“hl=en”)或使用“accept-language”HTTP 标头提供语言,具体视客户端而定。
可切换协议指南
- 一次只能使用一个协议。请确保设备上不能同时运行多个网络。此要求是为了确保不同协议之间不会混合敏感用户数据。
- 建议在设备中集成硬重置工作流,让用户能够使用另一个网络重新设置设备。
- 将设备更新为网络的过程应便于用户使用,并且网络之间的公平性。用户必须能够选择他们想要使用的网络,而无需优先选择其中任何网络。此流程需要获得 Google 团队的批准。
固件更新
OTA 更新的流程和分发应由合作伙伴使用自己的移动应用或 Web 应用工作流进行管理。
兼容性
“查找我的设备”网络需要开启位置信息服务和蓝牙。 需要移动网络服务或互联网连接。适用于 Android 9 及更高版本,仅面向部分国家/地区的适龄用户提供。
更新日志
FMDN 版本 | 日期 | 评论 |
---|---|---|
v1 | 发布了 FMDN 规范的初始版本,供抢先体验。 | |
v1.1 | 2023 年 2 月 |
|
v1.2 | 2023 年 4 月 |
|
v1.3 | 2023 年 12 月 |
|