“查找我的设备”网络配件规范

v1.3

“查找我的设备网络”(FMDN) 配件规范定义了一种端到端加密方法,用于跟踪发送信标的蓝牙低功耗 (BLE) 设备。本页介绍了 FMDN 作为快速配对规范的扩展。 如果提供商拥有与 FMDN 兼容的设备,并且愿意为这些设备启用位置信息跟踪,则应启用此扩展程序。

GATT 规范

应向快速配对服务添加一个额外的通用属性 (GATT) 特征,其语义如下:

快速配对服务特性 已加密 权限 UUID
信标操作 读取、写入和通知 FE2C1238-8366-4814-8EB0-01DE32100BEA

表 1:适用于 FMDN 的快速配对服务特性。

身份验证

此扩展程序所需的操作以写入操作的形式执行,并通过质询-响应机制进行保护。在执行任何操作之前,Seeker 应从表 1 中的特征执行读取操作,这会产生以下格式的缓冲区:

八位字节 数据类型 说明
0 uint8 协议主要版本号 0x01
1 - 8 字节数组 一次性随机 Nonce 不定

每项读取操作都应生成不同的 Nonce,并且单个 Nonce 仅应对单个操作有效。即使操作失败,也必须使 Nonce 失效。

然后,Seeker 会计算一个一次性身份验证密钥,以便在后续写入请求中使用。身份验证密钥的计算方式如表 2 至表 5 所述。根据请求的操作,查询者证明自己了解以下一个或多个密钥:

运维

表 2 至表 5 中列出了写入到特征的数据的格式。本部分后面将详细介绍每项操作。

八位字节 数据类型 说明
0 uint8 数据 ID
  • 0x00:读取信标参数
  • 0x01:读取预配状态
  • 0x02:设置暂时身份密钥
  • 0x03:清除临时身份密钥
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 字节数组 其他数据
  • 0x00:不适用
  • 0x01:不适用
  • 0x02:32 字节,即临时身份密钥,使用账号密钥加密为 AES-ECB-128。如果提供程序已设置了临时身份密钥,请同时发送 SHA256(current ephemeral identity key || the last nonce read from the characteristic) 的前 8 个字节
  • 0x03:SHA256(ephemeral identity key || the last nonce read from the characteristic) 的前 8 个字节

表 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
  • 0x05:铃声
  • 0x06:读取响铃状态
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 字节数组 其他数据
  • 0x05:4 个字节,表示铃声状态、铃声时长和铃声音量。
  • 0x06:不适用

表 4:响铃请求。

八位字节 数据类型 说明
0 uint8 数据 ID
  • 0x07:启用“防范不必要的跟踪”模式
  • 0x08:停用防范恶意追踪功能模式
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 字节数组 其他数据
  • 0x07:1 个字节的控制标志(可选)
  • 0x08:SHA256(ephemeral identity key || the last nonce read from the characteristic) 的前 8 个字节

表 5:不必要的跟踪保护请求。

成功写入会触发通知,如表 6 所示。

在触发通知的写入事务完成(即在发送写入请求的响应 PDU 之前)之前,应发送数据 ID 为 0x05:铃声状态变化 以外的通知。

八位字节 数据类型 说明
0 uint8 数据 ID
  • 0x00:读取信标参数
  • 0x01:读取预配状态
  • 0x02:设置暂时身份密钥
  • 0x03:清除临时身份密钥
  • 0x04:在征得用户同意的情况下读取临时身份密钥
  • 0x05:铃声状态更改
  • 0x06:读取响铃状态
  • 0x07:启用“防范不必要的跟踪”模式
  • 0x08:停用防范恶意追踪功能模式
1 uint8 数据长度 不定
2 - 9 字节数组 身份验证 按操作详细
10 - var 字节数组 其他数据
  • 0x00:8 个字节,表示传输功率、时钟值、加密方法和铃声功能,使用账号密钥加密(填充零)的 AES-ECB-128
  • 0x01:1 个字节,表示配置状态,后跟当前的暂时 ID(20 或 32 字节,如果适用)
  • 0x04:32 字节,即临时身份密钥,使用账号密钥加密的 AES-ECB-128
  • 0x05:4 字节,表示更改的新状态和触发器
  • 0x06:3 个字节,用于指示正在响铃的组件以及剩余的响铃毫秒数
  • 其他数据 ID 使用空的附加数据

表 6:信标服务响应。

表 7 列出了这些操作可能返回的 GATT 错误代码。

代码 说明 备注
0x80 未通过身份验证 在身份验证失败(包括使用旧 Nonce 的情况)时,在响应写入请求时返回。
0x81 值无效 如果提供任何无效值或收到的数据字节数意外,则返回此错误。
0x82 未征得用户同意 当设备未处于配对模式时,在响应数据 ID 为 0x04:在征得用户同意的情况下读取临时身份密钥的写入请求时返回。

表 7:GATT 错误代码。

读取信标的参数

查询器可以通过对包含表 2 中数据 ID 为 0x00 的请求的特征执行写入操作,向提供程序查询信标的参数。提供程序会验证所提供的一次性身份验证密钥是否与设备上存储的任何账号密钥匹配。

如果验证失败,提供程序会返回未经身份验证的错误。

成功后,提供程序会使用表 6 中的响应进行通知,数据 ID 为 0x00。提供程序会按如下方式构建数据段:

八位字节 数据类型 说明
0 uint8 校准功率 在 0 米处接收到的经过校准的功率(值在 [-100, 20] 范围内)。表示为有符号整数,分辨率为 1 dBm。
1 - 4 uint32 时钟值 当前时钟值(以秒为单位,大端序)。
5 uint8 曲线选择 用于加密的椭圆曲线:
  • 0x00(默认):SECP160R1
  • 0x01:SECP256R1(需要扩展广播)
6 uint8 组件 能够响铃的组件数量:
  • 0x00:表示设备无法响铃。
  • 0x01:表示只有一个组件能够响铃。
  • 0x02:表示两个组件(左侧和右侧耳机)能够独立响铃。
  • 0x03:表示三个组件(左侧和右侧耳机以及耳机充电盒)能够独立响铃。
7 uint8 响铃功能 支持的选项包括:
  • 0x00:无法选择响铃音量。
  • 0x01:可选择来电铃声音量。如果已设置,提供程序必须接受并处理 3 个音量级别,如铃声操作中所述。
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 的请求的特征执行写入操作,向提供方查询信标的配置状态。提供程序会验证所提供的一次性身份验证密钥是否与设备上存储的任何账号密钥匹配。

如果验证失败,提供程序会返回未经身份验证的错误。

成功后,提供程序会使用表 6 中的响应进行通知,数据 ID 为 0x01。提供程序会按如下方式构建数据段:

八位字节 数据类型 说明
0 uint8 配置状态 位掩码,具体值如下:
  • 位 1 (0x01):如果为设备设置了临时身份密钥,则设置为 1。
  • 位 2 (0x02):设置是否提供的一次性身份验证密钥与所有者账号密钥匹配。
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 个字节。

设置临时身份密钥

如需将未配置的提供程序配置为 FMDN 信标,或更改已配置提供程序的临时身份密钥,查询方会对包含表 2 中数据 ID 为 0x02 的请求的特征执行写入操作。提供商会验证:

  • 提供的一次性身份验证密钥与所有者账号密钥匹配。
  • 如果您提供了临时身份密钥的哈希值,则经过哈希处理的临时身份密钥与当前临时身份密钥相匹配。
  • 如果未提供临时身份密钥的哈希值,请验证提供程序是否已预配为 FMDN 信标。

如果验证失败,提供程序会返回未经身份验证的错误。

成功后,系统会使用匹配的账号密钥通过 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 个字节。

在征得用户同意后读取暂时身份密钥

此选项仅适用于找回丢失的密钥,因为密钥仅由 Seeker 在本地存储。因此,此功能仅在设备处于配对模式时或在用户按下设备上的实体按钮(即表示用户同意)后的一段时间内可用。

查询方必须在后端存储恢复密钥,才能恢复明文密钥,但不会存储 EIK 本身。

如需读取 EIK,查询器会对该特征执行写入操作,该操作由表 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 uint8 响铃操作 位掩码,具体值如下:
  • 位 1 (0x01):右侧铃声
  • 第 2 位 (0x02):让左耳机响铃
  • 第 3 位 (0x04):戒指外壳
  • 0xFF:让所有组件响铃
  • 0x00:停止响铃
1 - 2 uint16 超时 超时时长(以十进制秒为单位)。不得为零,也不得超过 10 分钟。
提供程序使用此值来确定铃声响铃时长。如果设备的任何组件已在响铃,则超时设置会替换现有超时设置。

如果环操作设置为 0x00,系统会忽略超时。
3 uint8
  • 0x00:默认
  • 0x01:低
  • 0x02:中等
  • 0x03:高
这些值的确切含义取决于实现。

收到请求后,提供商会验证:

  • 提供的一次性身份验证密钥与环形密钥匹配。
  • 请求的状态与可以响铃的组件匹配。

如果提供程序未预配为 FMDN 信标或验证失败,则会返回未经身份验证的错误。不过,如果提供程序启用了不必要的跟踪保护功能,并且触发不必要的跟踪保护请求时已开启“跳过响铃身份验证”标志,则提供程序应跳过该检查。身份验证数据仍应由 Seeker 提供,但可以设置为任意值。

当铃声开始或结束时,系统会发送通知(如表 6 所示),数据 ID 为 0x05。通知的内容定义如下:

八位字节 数据类型 说明
0 uint8 响铃状态
  • 0x00:已启动
  • 0x01:启动或停止失败(所有请求的组件均超出范围)
  • 0x02:已停止(超时)
  • 0x03:已停止(按下按钮)
  • 0x04:已停止(GATT 请求)
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 个字节。

恶意追踪防范模式

“不必要的跟踪保护”模式旨在让任何客户端都能在不与服务器通信的情况下识别滥用行为的设备。默认情况下,提供程序应按 标识符轮替中所述轮替所有标识符。“查找我的设备”服务可以通过“查找我的设备”网络转发不必要的跟踪防护模式激活请求。这样一来,该服务会导致提供程序暂时使用固定的 MAC 地址,以便客户端检测设备并向用户发出可能存在的不需要的跟踪行为的警告。

如需启用或停用信标的不需要的跟踪保护模式,查找器会对该特性执行写入操作,该操作由表 5 中的数据 ID 分别为 0x07 或 0x08 的请求组成。

何时启用“防范不必要的跟踪”模式

提供程序会按如下方式构建数据段:

八位字节 数据类型 说明
0 uint8 控制标志
  • 0x01:跳过响铃身份验证。设置后,在骚扰性跟踪防范模式下,系统不会对响铃请求进行身份验证。
如果未设置任何标志(字节全为零),则可以完全省略数据部分并发送空数据部分。
这些标志仅在停用不必要的跟踪保护模式后才会失效。

提供方会验证所提供的一次性身份验证密钥是否与不必要的跟踪保护密钥匹配。如果提供程序未预配为 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 帧。例如,提供程序应每 2 秒通告 7 个快速配对广告和 1 个 FMDN 广告。

FMDN 广告的蓝牙传输功率应设置为至少 0 dBm。

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 加密以下数据结构来生成随机值:

八位字节 字段 说明
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'

对于计算的其余部分,SECP160R1SECP256R1 用于椭圆曲线加密操作。请参阅 SEC 2:推荐的椭圆曲线域参数中的曲线定义,其中定义了接下来引用的 FpnG

现在,r' 会通过计算 r = r' mod n 投影到有限域 Fp。最后,计算 R = r * G,它是曲线上的一个点,表示所使用的公钥。信标将 Rx(即 Rx 坐标)作为其暂时标识符进行广播。

经过哈希处理的标志

经过哈希处理的标志字段的计算方式如下(位从最有意义的位到最没有意义的位进行引用):

  • 位 0-4:预留(设为零)。
  • 5-6 位表示设备的电池电量,如下所示:
    • 00:不支持电池电量指示
    • 01:电池电量正常
    • 10:电池电量低
    • 11:电池电量严重不足(需要尽快更换电池)
  • 如果信标处于不必要的跟踪保护模式,则将位 7 设置为 1,否则将其设置为 0。

为了生成此字节的最终值,系统会将其与 SHA256(r) 的最低有效字节进行异或运算。

请注意,r 应与曲线的大小保持一致。如果其表示形式短于 160 或 256 位,则添加零作为最有意义的位;如果其表示形式大于 160 或 256 位,则应截断最有意义的位。

如果信标不支持电池电量指示,并且未处于不必要的跟踪保护模式,则可以从广告中完全省略此字节。

使用 EID 进行加密

如需对消息 m 进行加密,观测器(已从信标读取 Rx)应执行以下操作:

  1. Fp 中选择一个随机数 s,如EID 计算部分中所定义。
  2. 计算 S = s * G
  3. 通过在曲线方程中进行替换并从可能的结果中选择任意 Ry 值来计算 R = (Rx, Ry)
  4. 计算 256 位 AES 密钥 k = HKDF-SHA256((s * R)x),其中 (s * R)x 是曲线乘法结果的 x 坐标。未指定盐。
  5. URxLRx 分别为 Rx 的 80 位高位和低位,采用大端格式。以类似的方式,为 S 定义 USxLSx
  6. 计算 nonce = LRx || LSx
  7. 计算 (m’, tag) = AES-EAX-256-ENC(k, nonce, m)
  8. 向所有者发送 (URx, Sx, m’, tag),可能通过不可信的远程服务。

解密使用 EID 加密的值

拥有 EIK 和旋转周期指数的所有者的客户端会按如下方式解密消息:

  1. 给定 URx,获取 URx 所依据的信标时间计数器值。 为此,所有者的客户端可以计算最近过去和近期未来的 beacon 时间计数器值的 Rx 值。
  2. 给定 URx 基于的灯塔时间计数器值,计算 r 的预期值,如EID 计算部分所定义。
  3. 计算 R = r * G,并验证其是否与观测器提供的 URx 值相匹配。
  4. 通过在曲线方程中进行替换并从可能的结果中选择任意 Sy 值来计算 S = (Sx, Sy)
  5. 计算 k = HKDF-SHA256((r * S)x),其中 (r * S)x 是曲线乘法结果的 x 坐标。
  6. 计算 nonce = LRx || LSx
  7. 计算 m = AES-EAX-256-DEC(k, nonce, m’, tag)

ID 轮替

必须使用可解析 (RPA) 或不可解析 (NRPA) BLE 地址来通告 FMDN 帧。RPA 是 LE Audio (LEA) 设备的必需功能,对于不使用配对的定位器标签除外,建议其他设备也采用 RPA。

快速配对广告、FMDN 广告和相应的 BLE 地址应同时轮替。旋转应该平均每 1024 秒发生一次。信标开始广播新标识符的确切时间点必须在该时间范围内随机确定。

建议的轮替时间随机化方法是将其设置为下一个预期轮替时间(如果未应用随机化)加上一个介于 1 到 204 秒之间的正随机时间因子。

当设备处于不必要的跟踪保护模式时,FMDN 广告的 BLE 地址应固定,但 FP 不可检测广告(例如快速配对)的 RPA 必须保持轮替。可以为不同的协议使用不同的地址。

从断电中恢复

解析暂时性标识符与其在通告时刻的时钟值密切相关,因此,在发生断电时,提供程序能够恢复其时钟值非常重要。建议提供程序每天至少将其当前时钟值写入到非易失性存储器一次,并在启动时检查 NVM,以确定是否存在可用于初始化的值。暂时性标识符的解析器会在足够的时间窗口内实现解析,以允许合理的时钟漂移和此类断电恢复。

由于解决问题的时间窗口有限,提供商仍应尽最大努力尽量减少时钟漂移。应实现至少一种额外的时钟同步方法(广告 不可检测的快速配对帧或实现消息流)。

快速配对实现指南

本部分介绍了支持 FMDN 的提供程序中快速配对实现的特殊方面。

定位追踪器专用指南

  • 如果提供程序已配对,但未在 5 分钟内预配 FMDN(或者在设备配对但未预配 FMDN 时应用了 OTA 更新),则提供程序应恢复其出厂配置并清除存储的账号密钥。
  • 提供程序配对后,在预配 FMDN 或 5 分钟后,其 MAC 地址不应发生更改。
  • 如果从设备中清除暂时身份密钥,设备应执行恢复出厂设置,并清除存储的账号密钥。
  • 提供程序应拒绝正常的蓝牙配对尝试,并且仅接受快速配对。
  • 提供程序必须包含一种机制,让用户无需将设备恢复出厂设置即可暂时停止投放广告(例如,按下组合按钮)。
  • 在断电后,设备应通告不可检测到的快速配对帧,直到下次调用读取信标参数为止。这样一来,即使发生了严重的时钟漂移,Seeker 也能检测到设备并同步时钟。
  • 在宣传不可检测到的快速配对帧时,不应启用界面指示。
  • 在为提供程序预配 FMDN 时,不应通告可检测到的快速配对帧。
  • 提供方不应以未经身份验证的方式(例如姓名或标识符)公开任何身份信息。

针对经典蓝牙设备的准则

本部分介绍了支持 FMDN 的传统蓝牙设备的特殊方面。

已配对设备的 FMDN 配置

提供程序在与查询器配对时并不总是预配 FMDN,而是在配对之后一段时间才会预配。在这种情况下,提供程序可能没有建立 GATT 连接所需的最新 BLE MAC 地址。提供程序必须支持以下至少一种方式,以便在已配对的情况下,查找器获取其 BLE 地址:

  • 提供方可以定期通告 Fast Pair 账号数据,以便查找器通过 BLE 扫描找到其 BLE 地址。
    此方法适用于未实现消息流的提供程序。
  • 提供商可以通过传统蓝牙的快速配对消息流提供此类数据。
    这种方法适用于在通过蓝牙连接到 Seeker 时不通告快速配对帧的提供程序。

支持这两种方法可提高用户为 FMDN 预配设备的几率。

快速配对消息流

提供方可以实现快速配对消息流,并使用它向查找器通知设备信息。实现消息流可启用本部分所述的某些功能。

每当建立消息流 RFCOMM 通道时,提供方都应发送一次设备信息消息。

固件版本(设备信息代码 0x09)和跟踪功能

当固件更新向提供程序添加 FMDN 支持时,已连接的 Seeker 可以通知用户这一点,并提供预配服务。否则,用户必须手动前往蓝牙设备列表以启动 FMDN 配置。

为此,提供程序应使用固件版本属性 (code 0x09) 报告表示固件版本的字符串值。此外,提供程序应支持协议,以便 Seeker 了解因固件更新而发生的capability 更改

八位字节 数据类型 说明
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 时,提供程序可以使用当前的暂时标识符 (code 0x0B) 报告当前的 EID 和时钟值,以便在时钟漂移(例如,由于电池电量耗尽)时同步 Seeker。否则,Seeker 会为此目的发起费用更高且不太可靠的连接。

八位字节 数据类型 说明
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 可以返回通用的“位置追踪器”值。
    • 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 构建的相同响应,并进行十六进制编码。
  • 实现 Sound_Start 操作码的指南:
    • 该命令应在所有可用组件中触发铃声。
    • 应使用支持的最大音量。
    • 建议的响铃时长为 12 秒。
  • 定位器代码必须包含一种机制,让用户无需将设备恢复出厂设置即可暂时停止投放广告(例如,按下组合按钮)。
    • 停用说明必须记录在公开可用的网址中,并作为认证要求提供给 Google,且在对说明进行任何更新或修改之前至少提前 10 天提供。
    • 网址应支持本地化。语言将作为查询参数(“hl=en”)或使用“accept-language”HTTP 标头提供,具体取决于客户端。

可切换协议指南

  • 一次只能使用一个协议。确保设备上同时只能运行一个网络。此要求旨在确保敏感用户数据不会在不同协议之间混用。
  • 建议在设备中集成硬重置工作流,以允许用户使用其他网络重新设置设备。
  • 将设备更新到网络的过程应简单易用,并且在各个网络之间公平。用户必须能够选择要使用的网络,而不偏向于某个网络。此流程需要获得 Google 团队的批准。

固件更新

OTA 更新的流程和分发应由合作伙伴使用自己的移动应用或 Web 应用工作流来管理。

快速配对支持向用户发送通知,告知有可用的 OTA 更新。如需使用此机制,请执行以下操作:

  • 您应在附近设备控制台中更新最新的固件版本。
  • 应在附近分享设备控制台中设置配套应用。它应支持固件更新 intent
  • 提供程序应实现 Firmware revision GATT 特性。

为防止跟踪,应限制对固件修订版本特性的访问。Seeker 会先读取配置状态并提供身份验证密钥(如本规范中所定义),然后再读取固件修订版。这将通过同一连接完成。如果尝试读取固件修订版,但提供程序未绑定,或者未通过同一连接成功完成身份验证操作,则提供程序应返回未经身份验证的错误。

兼容性

如要使用“查找我的设备”网络,必须开启位置信息服务和蓝牙。 需要移动网络服务或互联网连接。适用于 Android 9 及更高版本,并且仅面向部分国家/地区的适龄用户提供。

更新日志

FMDN 版本 日期 评论
v1 FMDN 规范的初始版本,供抢先体验。
v1.1 2023 年 2 月
  • 添加了关于不必要的跟踪保护模式的明文指示。
  • 添加了一个选项,用于在骚扰性跟踪防范模式下跳过来电请求的身份验证。
v1.2 2023 年 4 月
  • 更新了所有者的 AK 定义。
  • 添加了有关如何从定位器代码中的断电问题恢复的建议。
  • 添加了有关 MAC 地址随机分配的说明。
  • 添加了关于在骚扰性跟踪防范模式下轮替 MAC 地址的说明。
  • 添加了有关提供停用定位器代码的方法的指南。
v1.3 2023 年 12 月
  • 添加了有关定位器代码公开的身份信息的说明。
  • 添加了实现不必要跟踪防范规范的要求。
  • 添加了针对可切换协议设备的准则。