Android 16 引入了测距模块。此协议和载荷规范定义了带外 (OOB) 通信的消息序列和载荷,用于在发起方设备和响应方设备之间交换测距配置,以及启动和停止测距。Android 17 引入了此规范的第 3 版。
非 Android 设备提供商可以通过本页实现此规范,以便其设备与 Android 设备兼容。
Google 的数据包描述语言 (PDL) 中此规范的实现可在 GitHub 上获取。通过此实现,PDL 编译器可以为该规范中定义的消息生成序列化和反序列化代码。此规范支持多种目标语言,包括 C++、Rust 和 Java。
第 3 版有哪些新变化
OOB 规范的第 3 版引入了以下更改:
- 运动通知:广告设备用于将运动变化通知给发起设备的讯息。
- 测距配置:包含新的
Motion support字段,用于告知发起方将外围设备移动的任何变化通知给响应方。 - 在测距功能和测距配置中添加了新的 Wi-Fi PD 技术支持。
- 弃用了
Wi-Fi NAN RTT Ranging Capability中的Supported Bandwidth和Supported number of Receive chains字段。
Endianness
除非另有说明,否则消息中的所有多字节数字字段均采用小端序。
消息和消息序列
本部分介绍了消息和消息交换序列。
下表显示了 OOB 交换中存在的所有消息:
| 消息 | 消息 ID |
|---|---|
Ranging Capability Request |
0x0 |
Ranging Capability Response |
0x1 |
Ranging Configuration |
0x2 |
Ranging Configuration Response(可选) |
0x3 |
Stop Ranging |
0x6 |
Stop Ranging Response(可选) |
0x7 |
Motion Notification |
0x8 |
图 1 和图 2 说明了如何针对不同的通信渠道触发消息交换。
对于基于连接的通信渠道(例如 BLE GATT),消息交换从发起方设备向响应方设备发送 Ranging Capability Request 开始。响应方设备通过发送 Ranging
Capability Response 进行回复,如图 1 所示:
图 1. 使用基于连接的通信渠道进行 OOB 消息交换。
对于基于广告的通信渠道,响应方设备首先会广播 Ranging Capability Response。在这种情况下,发起设备不会发送 Ranging Capability Request。相反,在检测到通告后,当发起方(初始扫描器)设备准备就绪时,它会通过广播 Ranging Configuration 作为其第一条消息来做出响应,如图 2 所示:
图 2. 使用基于广告的通信进行 OOB 消息交换。
在两种情况下,其余的消息交换过程都是相同的。响应方设备在收到 Ranging Configuration 消息后立即开始测距。响应方设备在收到或检测到 Stop
Ranging 消息后停止测距。
在基于连接的流程中,响应方设备仅填充 Ranging Capability Request 消息中请求的测距技术的功能,而在广播流程中,响应方设备必须列出其所有功能,因为没有先前的功能请求消息。
发起方设备假定它发送的任何请求消息只会收到一个响应。响应设备不得做出任何此类假设,以便能够以任意顺序响应任何请求。这会验证响应方设备是否可以响应来自发起方设备的多个连续 Ranging Capability Request 消息或任何其他无序消息。
技术过渡
OOB 版本允许设备在会话期间在不同的测距技术之间动态转换。为实现此目的,发起者可以:
- 发送多条
Ranging Configuration消息,以开始使用新技术。 - 发送多条
Stop Ranging消息以停止有效技术。
这些消息的顺序因回答者支持的过渡方案而异:
- Break-before-make:发起者只能通过以下方式过渡到新技术:先通过
Stop Ranging消息停止第一项技术,然后再通过Ranging Configuration消息启动第二项技术。 - Make-before-break:发起方可以使用
Ranging Configuration消息启动新技术,然后再使用Stop Ranging消息停止现有技术。
响应者必须根据其 Ranging Capability Response 中 supported technology transitioning 字段的值,实现对其中一种过渡方案的支持。
测距技术 ID
下表列出了测距技术的 ID:
| 测距技术 | ID |
|---|---|
| UWB | 0x0 |
| CS | 0x1 |
| Wi-Fi NAN RTT | 0x2 |
| RSSI | 0x3 |
| Wi-Fi PD | 0x4 |
| RFU | 0x5 - 0xFF |
在需要测距技术 ID 的下表中,会使用这些 ID。对于包含测距技术 bitfield 的字段,当相应技术包含在 bitfield 中时,会设置与该技术 ID 的索引对应的位。
例如,RSSI 的 ID 值为 3,但如果 RSSI 包含在测距技术位字段中,则必须开启 ID(3)位置的位(第一个位位于位置 0),这会使位字段的最终值为 0x8。如果同时包含 UWB 和 RSSI,则位字段的值为 0x0A(位 0 和位 3 都处于开启状态)。
消息格式
每条消息都包含标头和载荷。
图 3. 消息格式。
标题
大小:2 字节
说明:标头是所有消息共有的部分,也是消息中包含的第一部分。标头包含版本和消息类型 ID。版本字段用于指定消息内容所遵循的本规范的版本。如需详细了解不同版本设备之间的版本控制使用方式,请参阅版本控制。标头在不同版本之间保持向后兼容,这意味着用例始终可以解析该标头,以确定消息的版本和 ID。
下表总结了标头:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 版本 |
|
| 1 | uint8 | 消息 ID |
|
载荷
大小:各不相同(取决于消息类型)
说明:载荷是消息的最后一部分,位于标头之后。载荷取决于消息类型。以下各部分定义了每种消息类型的载荷格式。
测距功能请求消息载荷
大小(不包括标头大小):2 字节
说明:由发起方设备发送,用于发起消息交换。
如果通信渠道基于广告,则此消息为可选消息,在这种情况下,响应方设备需要先广播 Ranging
Capability Response 消息。发起方设备(初始扫描器)读取广播并直接使用 Ranging Capability Request 消息进行响应,从而避免了发送此消息。
下表总结了 Ranging Capability Request 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8*2 | 请求的测距技术位字段 |
|
测距功能响应消息载荷
大小(不包括标头大小):可变(公共部分为 2 字节,加上每种包含的测距技术字节的大小)
说明:由回答者发送,作为对 Ranging Capability
Request 消息的回答。此消息载荷由通用部分和测距技术专用部分(BLE CS、Wi-Fi NAN RTT、BLE RSSI)组成,如下表所示。只有在响应方设备支持相应测距技术且 Ranging Capability Request 消息中请求了该测距技术时,才必须添加每个测距技术特定的部分。如果是广告通信渠道,则必须包含所有受支持的测距技术。
下表总结了常见的 Ranging Capability Response 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8*2 | 支持的测距技术位字段。指示有效载荷其余部分中测距技术的功能集。 |
|
| 2 | 字节数组 | 测距技术功能字节。 | 按技术定义的结构重复块。 |
| 不定 | uint8 | 表示支持技术过渡。 |
|
| 不定 | uint16 | 表示响应器设备的类型。 |
|
下表总结了 UWB Ranging Capability Response 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x0 - UWB |
| 1 | uint8 | 大小 | UWB 功能字节的大小(包括技术 ID 和大小字段),以字节为单位。 |
| 2 | uint8*2 | UWB 地址 | 2 字节设备 UWB 地址。 |
| 4 | uint8*4 | 支持的渠道位字段 | 支持的渠道的位字段。位设置为 0 表示不支持,设置为 1 表示支持。位 0 对应于通道 0。LSB == channel 0MSB == channel 31 |
| 8 | uint8*4 | 支持的前导序列索引位字段 | 支持的前导序列索引的位字段。位设置为 0 表示不支持,设置为 1 表示支持。位 0 对应于前导序列索引 1。LSB == preamble index 1MSB == preamble index 32 |
| 12 | uint8*4 | 支持的配置 ID 位字段 | 支持的 UWB 配置 ID 的位字段。如果位设置为 0,表示不支持;如果设置为 1,表示支持。LSB == config Id 0MSB == config Id 31 |
| 16 | uint8*2 | 支持的最小测距间隔 | 表示支持的最快测距间隔(以毫秒为单位)。允许的值(以毫秒为单位):
|
| 18 | uint8 | 支持的最短广告时段时长 | 表示支持的最小时隙时长(以毫秒为单位)。例如,如果设备返回 1 毫秒,则假定它也支持 2 毫秒或更长的时隙时长。允许的值(以毫秒为单位):
|
| 19 | 支持的 UWB 设备角色位字段 | 支持的 UWB 角色的位字段。例如,如果两者都支持,则最终字段值为 0x3。
|
下表总结了 BLE CS Ranging Capability Response 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x1 - BLE CS |
| 1 | uint8 | 大小 | BLE CS 功能字节的大小(包括技术 ID 和大小 字段),以字节为单位。 |
| 2 | uint8 | 支持的安全类型位字段 | BLE CS 支持的安全类型的位字段。
|
| 3 | uint8*6 | 设备地址 | 用于 BLE CS 的设备的地址;采用大端序。 |
下表总结了 Wi-Fi NAN RTT Ranging Capability Response 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x2 - Wi-Fi NAN RTT |
| 1 | uint8 | 大小 | BLE RSSI 功能字节的大小(包括技术 ID 和大小 字段),以字节为单位。 |
| 2 | uint8 | 支持的功能位字段 | 支持的功能的位字段。
|
| 3 | uint8 | 支持周期性测距 |
|
| 4 | uint8 | 支持的带宽 | 已弃用此信息有助于使用 Wi-Fi NAN 推导可实现的测距精度,并可帮助应用确定是使用 UWB、BLE CS、BLE RSSI 还是 Wi-Fi NAN 进行测距。
|
| 5 | uint8 | 支持的接收链数量 | 已弃用此信息有助于使用 Wi-Fi NAN 推导可实现的测距精度,并可帮助应用确定是使用 UWB、BLE CS、BLE RSSI 还是 Wi-Fi NAN 进行测距。
|
下表总结了 BLE RSSI Ranging Capability Response 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x3 - BLE RSSI |
| 1 | uint8 | 大小 | BLE RSSI 功能字节的大小(包括技术 ID 和大小字段),以字节为单位 |
| 2 | uint8*6 | 设备地址 | 用于 BLE RSSI 的设备的地址;采用大端序 |
下表总结了 Wi-Fi PD Ranging Capability Response 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x4 - Wi-Fi PD |
| 1 | uint8 | 大小 | Wi-Fi PD 功能字节的大小(包括技术 ID 和大小 字段),以字节为单位 |
| 2 | uint8 | 支持的功能 | Bitmap
|
| 3 | uint8 | PansMode | Bitmap
|
| 4 | uint8*6 | 设备地址 | 用于 Wi-Fi PD 的设备的地址;采用大端序。 |
| 10 | uint8*2 | 最小测距间隔 802.11mc | 以大端序格式表示的 11mc 支持的最小测距间隔 |
| 12 | uint8*2 | 最小测距间隔 - 802.11az | 以大端序格式表示的 11az 支持的最小测距间隔 |
| 14 | uint8 | 前导最大类型 |
|
| 15 | uint8 | 最大信道宽度 |
|
| 16 | uint8*2 | 支持的频道频率 |
|
测距配置消息载荷
大小(不包括标头大小):可变(公共部分为 4 字节,加上每个包含的测距技术字节的大小)。
说明:此消息由发起方发送,其中包含每种测距技术可用于开始测距的配置。响应方设备必须在收到此消息后,尝试使用每种指示的测距技术开始测距。此消息载荷由通用部分和测距技术专用部分(UWB、BLE CS、Wi-Fi NAN RTT、BLE RSSI)组成,如下表所示。
下表总结了常见的 Ranging Configuration 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8*2 | 测距技术配置集位字段 | 此消息包含配置数据的测距技术的位字段,必须为这些技术设置配置参数。
|
| 2 | uint8*2 | 位字段 | RFU。必须设置为与测距技术配置集位字段相同的值。 |
| 4 | 字节数组 | 测距技术配置字节 | 按技术定义的重复结构块 |
| 不定 | uint8 | 运动模式支持 | Motion Notification已请求
|
下表汇总了 UWB Ranging Configuration 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x0 - UWB |
| 1 | uint8 | 大小 | UWB 配置的大小(以字节为单位),包括技术 ID 和大小 字段 |
| 2 | uint8*2 | UWB 地址 | 2 字节设备 UWB 地址 |
| 4 | uint8*4 | 会话 ID | 生成的会话 ID。会话 ID 是手机与外围设备之间测距会话的唯一标识符。 |
| 8 | uint8 | 所选配置 ID | 所选配置 ID 编号(整数)。配置 ID 用于指定 UWB 测距会话必须使用的时序参数和安全类型。 |
| 9 | uint8 | 所选频道 | UWB 测距会话的所选渠道 |
| 10 | uint8 | 所选序言索引 | UWB 测距会话的所选前导序列索引 |
| 11 | uint8*2 | 所选测距间隔 | 所选的测距时间间隔速率(以毫秒为单位)。允许的值(以毫秒为单位):
|
| 13 | uint8 | 所选空档时长 | 所选时段的持续时间(以毫秒为单位)。允许的值(以毫秒为单位):
|
| 14 | uint8 | 会话密钥长度 | 会话密钥的长度(以字节为单位) |
| 15 | 字节数组 | 会话密钥 | 会话密钥。如果使用 S-STS,则前两个字节是供应商 ID,接下来的六个字节是静态 STS IV。如果使用 P-STS,则为 16 字节或 32 字节的会话密钥。所用安全类型的确定依据是配置 ID。 |
| 不定 | uint8*2 | 国家/地区代码 | ISO 3166-1 alpha-2 国家/地区代码,以两个 ASCII 字符表示 |
| 不定 | uint8 | 所选设备角色 |
|
| 不定 | uint8 | 所选设备模式 |
|
下表总结了 BLE CS Ranging Configuration 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x1 - BLE CS |
| 1 | uint8 | 大小 | BLE CS 配置的大小(包括技术 ID 和大小 字段),以字节为单位 |
| 2 | uint8 | 所选安全类型 | 所选安全类型。允许的值:
|
| 3 | uint8*6 | 设备地址 | 用于 BLE CS 的设备的地址;采用大端序 |
下表总结了 Wi-Fi NAN RTT Ranging Configuration 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x2 - Wi-Fi NAN RTT |
| 1 | uint8 | 大小 | Wi-Fi NAN RTT 配置(包括技术 ID 和大小 字段)的大小(以字节为单位) |
| 2 | uint8 | 服务名称长度 | “服务名称”字段的长度(以字节为单位)。请参阅 Wi-Fi 感知规范 v4.0 第 1.3.3 节表 1。定义。 |
| 3 | 字节数组 | 服务名称 | 服务名称。请参阅 Wi-Fi 感知规范 v4.0 第 1.3.3 节表 1。定义。 |
| 不定 | uint8 | 设备角色 |
|
| 不定 | uint8 | 使用周期性测距 |
|
下表总结了 BLE RSSI Ranging Configuration 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x3 - BLE RSSI |
| 1 | uint8 | 大小 | BLE RSSI 配置的大小(包括技术 ID 和大小 字段),以字节为单位 |
| 2 | uint8*6 | 设备地址 | 用于 BLE RSSI 的设备的地址;采用大端序 |
下表总结了 Wi-Fi PD Ranging Configuration 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 测距技术 ID | 0x4 - Wi-FI PD |
| 1 | uint8 | 大小 | Wi-Fi NAN PD 配置(包括技术 ID 和大小 字段)的大小(以字节为单位) |
| 2 | uint8 | 功能 |
|
| 3 | uint8*6 | MAC 地址 | 启动器 MAC 地址 |
| 9 | uint8*2 | 测距间隔 | 测距间隔(以毫秒为单位) |
| 11 | uint8 | 选定的序言 |
|
| 12 | uint8 | 所选渠道宽度 |
|
| 13 | uint8 | 所选频道 |
|
| 14 | uint8 | 已选择 PASN 模式 |
|
| 15 | 字节数组 | 设备标识密钥 | 16 字节固定数组 注意:此字段仅在经过身份验证的 PASN 模式下有效,在未经身份验证的 PASN 模式下不得设置 |
| 31 | uint8 | 密码长度 | 密码长度。 注意:此字段仅在经过身份验证的 PASN 模式下有效,不得在未经身份验证的 PASN 模式下设置。 |
| 不定 | 字节数组 | 密码 | 以字节数组形式表示的密码。
注意:此字段仅在经过身份验证的 PASN 模式下有效,不得在未经身份验证的 PASN 模式下设置。 |
测距配置响应消息载荷
大小(不包括标头大小):2 字节
说明:此消息由应答者发送,作为对 Ranging Configuration 消息的响应。此消息为可选消息;仅当所用通信渠道要求对每个请求进行明确响应时,才需要提供此消息。
下表总结了 Ranging Configuration Response 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8*2 | 已成功设置测距技术配置位字段 | 已成功设置的测距技术的位字段。如果技术已请求并成功设置,则该位域会将测距技术位设置为 1,否则设置为 0。
|
停止测距消息载荷
大小(不包括标头大小):2 字节
说明:当发起方设备需要停止使用指定的测距技术进行测距时,会发送此消息。
下表总结了 Stop Ranging 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8*2 | 测距技术停止位字段 | 必须停止测距的测距技术的位字段。如果位设置为 1,则表示测距技术必须停止测距;如果设置为 0,则表示测距技术要么一开始就未进行测距,要么必须继续测距(如果已在测距)。对于某些测距技术(例如 CS),这是一种空操作,因为测距仅在发起方一侧启动和停止。
|
停止测距响应消息载荷
大小(不包括标头大小):2 字节
说明:此消息由应答者发送,作为对 Stop Ranging 消息的响应。此消息是可选的,仅当所用通信渠道要求针对每个请求提供明确的响应时才需要。
下表总结了 Stop Ranging Response 消息载荷:
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8*2 | 测距技术已成功停止位字段 | 成功停止测距的测距技术位字段。如果请求停止相应技术,并且该技术已成功停止,则该位域会将相应测距技术位设置为 1;否则,设置为 0。
|
运动通知消息载荷
大小(不包括标头大小):1 字节
说明:响应方设备发送此消息,以告知发起方设备其运动状态的任何变化。
| Octet | 数据类型 | 说明 | 值 |
|---|---|---|---|
| 0 | uint8 | 动画 |
|
版本控制
规范的版本包含在每条消息的标头中。本部分定义了当其中一个设备(发起方或响应方)的版本比另一个设备旧时,如何进行通信。
情形 1:基于连接的通信渠道
本部分介绍使用基于连接的通信渠道的情况,其中 Ranging Capability Request 是发起方设备发送的第一条消息。
情形 1.a:发起方支持较新版本的规范,响应方支持较旧版本的规范。
发起方设备会发送具有较新版本的 Ranging Capability Request 消息。响应方设备仅支持旧版本,因此会使用该版本进行响应,然后响应方的旧版本会用于其余的消息交换。这意味着 Ranging Capability Request 消息必须向后兼容。
情形 1.b:发起方支持旧版规范,响应方支持新版规范。
响应方设备发现发起方设备无法使用较新版本,因此仅使用发起方设备最初请求的旧版本发送消息。
情形 2:基于广告的通信渠道
本部分介绍了使用基于广播的通信渠道的场景,其中响应方设备直接广播 Ranging Capability Request,而无需初始请求。
情形 2.a:发起方支持较新版本的规范,响应方支持较旧版本的规范。
在 Ranging Capability Response 广告中设置的旧版本将用于其余的通信。
情形 2.b:发起方支持旧版规范,响应方支持新版规范。
新版 Ranging Capability Response 广告必须向后兼容,以便发起方设备即使使用新版本也能读取消息。然后,发起方设备会使用其支持的旧版本发送 Ranging
Configuration 消息。这是用于其余通信的版本。
为确保 Ranging Capability Response 向后兼容,添加到此规范的下一个版本(在 Ranging
Capability Response 消息载荷中)的所有新字段都必须附加到载荷末尾,并且不得修改任何现有字段。解析配置时,如果指示的大小大于预期,则只能理解旧版规范的任何设备都必须忽略额外的字段。
碎片化
此规范与通信渠道无关,因此未定义在单个消息过大而无法放入所用通信渠道的传输数据包中的情况下,如何对消息载荷进行分段。测距模块希望接收完整形式的每条消息。分段的责任在于 OOB 通信渠道的实现者。
测距技术详情
本部分包含特定于测距技术的详细信息。
超宽带 (UWB) 规格
本部分介绍了超宽带的具体细节。
配置 ID
为 UWB 交换的 OOB 配置数据不包含 UWB 启动 UWB 测距会话所需的全套可用可配置参数。这是因为所选配置 ID 会隐式选择某些形参。
每个配置 ID 都是一组预定义的 UWB 配置参数,记录在 UwbRangingParams 中。响应方设备会发送其支持的所有配置 ID 的列表,作为所使用的 supports_technology_transitioning 支持的配置 ID 的一部分。这样一来,在 OOB 期间交换的配置参数集就会更小。它还限制了可用于 UWB 测距的参数组合数量,从而可以仅测试允许的参数组合。
在每次 UWB 会话后请求功能
在停止现有 UWB 会话后和开始新的 UWB 会话之前,发起方设备必须请求响应方设备的功能并再次设置配置参数,因为 UWB 地址可能会在当前测距会话结束后立即轮换。
BLE 信道探测 (CS) 详细信息
本部分介绍了信道探测的具体细节。
设备之间所需的绑定
使用信道探测进行测距需要发起方设备和响应方设备之间存在已建立的绑定。此规范未提供在设备之间创建绑定的方法。Ranging API 的用户必须在设备之间建立此绑定关系。
CS 响应方需要采取的行动
在 UWB 中,两个设备都需要显式调用 UWB 测距启动和停止 API。相比之下,对于 CS,只需要发起方设备通过调用蓝牙 (BT) 堆栈来启动 CS 测距。响应方上的其余初始化通过 BT 带内进行。这意味着,如果 BT 已启用,响应方在收到 Ranging Configuration 消息或 Stop Ranging 消息(针对 CS)后无需执行任何操作。响应方设备可以使用这些消息作为触发器来更新界面,或者例如闪烁设备 LED。