HCI 要求

主机控制器接口 (HCI) 用于与蓝牙控制器交互。

本文档提供了蓝牙 (BT) 和蓝牙低功耗 (BLE) HCI 要求列表。目的是让主机 BT 堆栈供应商和 BT 控制器供应商遵守这些平台要求,以便使用下述功能集。

本文档将蓝牙核心 5.2 规范称为“规范”。蓝牙核心 5.2 规范以及其他已采纳的文档可在 Bluetooth SIG 网站上找到。

常规设计概览

芯片功能和配置

作为一个开放平台,Android 拥有软件版本、OEM、供应商以及平台和芯片功能的矩阵。

为了管理不断变化的局面和迁移,本文档中描述了一种设计理念,即允许 BT 控制器公开其功能(超出标准的蓝牙核心 5.2 规范)。然后,主机 BT 堆栈可以使用这些功能来确定要启用哪些功能。

支持开放标准

Android 的目标之一是在蓝牙规范中批准后支持开放标准。如果下面描述的某项功能在未来的蓝牙规范中的标准 HCI 方法中可用,我们将倾向于使该方法成为默认方法。

供应商特定功能

供应商特定命令:LE_Get_Vendor_Capabilities_Command

操作码命令字段 (OCF):0x153

命令参数 大小 用途
NA 空命令参数列表

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
max_advt_instances
(已弃用)
1 个八位字节 支持的广播实例数。

v0.98 之后已弃用。
此参数在 Google 功能规范 v0.98 及更高版本中已弃用,取而代之的是 BT 规范版本 5.0 及更高版本中提供的LE 扩展广播
offloaded_resolution_of_private-address
(已弃用)
1 个八位字节 BT 芯片的 RPA 功能。
如果芯片支持,则需要主机启用。
0 = 不支持
1 = 支持

v0.98 之后已弃用。
此参数在 Google 功能规范 v0.98 及更高版本中已弃用,取而代之的是 BT 规范版本 4.2 及更高版本中提供的隐私功能
total_scan_results_storage 2 个八位字节 用于扫描结果的存储空间(以字节为单位)
max_irk_list_sz 1 个八位字节 固件中支持的 IRK 条目数
filtering_support 1 个八位字节 控制器中的过滤支持
0 = 不支持
1 = 支持
max_filter 1 个八位字节 支持的过滤器数
activity_energy_info_support 1 个八位字节 支持活动和能量信息报告
0 = 不支持
1 = 支持
version_supported 2 个八位字节 指定支持的 Google 功能规范版本
byte[0] = 主版本号
byte[1] = 次版本号

v1.04
byte[0] = 0x01
byte[1] = 0x04
total_num_of_advt_tracked 2 个八位字节 OnLost/OnFound 目的跟踪的广告客户总数
extended_scan_support 1 个八位字节 支持扩展扫描窗口和间隔
debug_logging_supported 1 个八位字节 支持记录来自控制器的二进制调试信息
LE_address_generation_offloading_support
(已弃用)
1 个八位字节 0 = 不支持
1 = 支持

v0.98 之后已弃用。
此参数在 Google 功能规范 v0.98 及更高版本中已弃用,取而代之的是 BT 规范版本 4.2 及更高版本中提供的隐私功能
A2DP_source_offload_capability_mask 4 个八位字节 支持的编解码器类型的位掩码
位 0 - SBC
位 1 - AAC
位 2 - APTX
位 3 - APTX HD
位 4 - LDAC
位 5-31 保留
bluetooth_quality_report_support 1 个八位字节 支持蓝牙质量事件报告
0 = 不支持
1 = 支持
dynamic_audio_buffer_support 4 个八位字节 支持蓝牙控制器中的动态音频缓冲区
支持的编解码器类型的位掩码
位 0 - SBC
位 1 - AAC
位 2 - APTX
位 3 - APTX HD
位 4 - LDAC
位 5-31 保留
a2dp_offload_v2_support 1 个八位字节 支持蓝牙控制器中的 A2DP 卸载 v2 命令(请参阅启动 A2DP 卸载停止 A2DP 卸载
0 = 不支持
1 = 支持

批量扫描结果

一个设计目标是增强蓝牙 LE 扫描响应事件通知传递到主机的方式,以便节省主机的功耗。

通过减少控制器通知主机应用处理器扫描结果的频率,主机应用处理器可以保持空闲/休眠状态更长时间。这降低了主机的功耗。LE_Get_Vendor_Capabilities_Command 的返回参数 total_scan_results_storage 指示了芯片存储扫描结果的能力。

此功能侧重于蓝牙控制器中 LE 扫描结果存储设施的管理和配置。该存储空间用于临时批量处理控制器接收到的广播数据、扫描数据和元数据,以便稍后传递到主机。

固件应支持两种类型的批量处理,这两种类型可以同时启用

  • 截断。包含以下信息元素:{MAC, TX Power, RSSI, Timestamp}
  • 完整。包含以下信息元素:{MAC, TX Power, RSSI, Timestamp, Adv Data, Scan Response}

LE_Batch_Scan_Command

OCF:0x156

命令参数 大小 用途
Batch_Scan_opcode 1 个八位字节 0x1 - 启用客户特定功能
0x2 - 设置批量扫描存储参数
0x3 - 设置批量扫描参数
0x4 - 读取批量扫描结果参数

此命令将生成命令完成事件。启用客户特定功能不会启动扫描。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Batch_Scan_opcode 1 个八位字节 0x1 - 启用客户特定功能
0x2 - 设置批量扫描存储参数
0x3 - 设置批量扫描参数
0x4 - 读取批量扫描结果参数

LE_Batch_Scan_Command:启用客户特定功能

子 OCF:0x01

子命令参数 大小 用途
enable_customer_specific_feature_set 1 个八位字节 0x01 - 启用批量扫描功能
0x00 - 禁用批量扫描功能

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Batch_Scan_opcode 1 个八位字节 0x1 - 启用客户特定功能
0x2 - 设置批量扫描存储参数
0x3 - 设置批量扫描参数
0x4 - 读取批量扫描结果参数

LE_Batch_Scan_Command:设置批量扫描存储参数子命令

子 OCF:0x02

子命令参数 大小 用途
Batch_Scan_Full_Max 1 个八位字节 分配给完整样式最大存储空间(以 % 为单位)
[范围:0-100]
Batch_Scan_Truncated_Max 1 个八位字节 分配给截断样式最大存储空间(以 % 为单位)
[范围:0-100]
Batch_Scan_Notify_Threshold 1 个八位字节 设置单个存储池的通知级别(以 % 为单位)
[范围:0-100]
设置为 0 将禁用通知。将生成供应商特定的 HCI 事件(存储阈值违反子事件)

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Batch_scan_opcode 1 个八位字节 0x02 [设置批量扫描参数]

LE_Batch_Scan_Command:设置批量扫描参数子命令

子 OCF:0x03

子命令参数 大小 用途
Batch_Scan_Mode 1 个八位字节 0x00 – 批量扫描已禁用
0x01 – 截断模式已启用
0x02 – 完整模式已启用
0x03 – 截断和完整模式均已启用
Duty_cycle_scan_window 4 个八位字节 批量扫描扫描时间(# 插槽数)
Duty_cyle_scan_interval 4 个八位字节 批量扫描间隔周期(# 插槽数)
own_address_type 1 个八位字节 0x00 - 公共设备地址
0x01 - 随机设备地址
Batch_scan_Discard_Rule 1 个八位字节 0 - 丢弃最旧的广播
1 - 丢弃 RSSI 最弱的广播

如果启用,此子命令将启动批量扫描。在截断扫描中,结果以截断形式存储,其中截断样式的唯一键 = {BD_ADDR, scan_interval}。这意味着每个扫描间隔只记录一个 BD_ADDR。截断模式要保留的记录如下:{BD_ADDR、Tx 功率、RSSI、时间戳}

当启用完整模式时,将使用主动扫描,并且将记录扫描响应。完整样式的唯一键 = {MAC, 广告数据包},与扫描间隔无关。完整模式要保留的记录是 {BD_ADDR、Tx 功率、RSSI、时间戳、广告数据包、扫描响应}。在完整样式中,相同的 AD 数据包在不同扫描间隔中多次出现时,仅记录一次。但是,在截断模式下,感兴趣的是 BA_ADDR 在不同扫描间隔中的可见性(每个扫描间隔一次)。RSSI 是扫描间隔内唯一广告的所有重复项的平均值。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Batch_scan_opcode 1 个八位字节 0x03 [设置批量扫描参数]

LE_Batch_Scan_Command:读取批量扫描结果子命令

子 OCF:0x04

子命令参数 大小 用途
Batch_Scan_Data_read 1 个八位字节 0x01 - 截断模式数据
0x02 - 完整模式数据

此命令将生成命令完成事件。当主机发出此命令时,控制器中的所有结果可能无法在一个命令完成事件中容纳。主机将迭代发出此命令,直到命令完成事件中的相应结果指示记录数为 0,这表示控制器没有更多记录要传达给主机。每个命令完成事件可能包含仅一种数据类型(完整或截断)的多个记录。

控制器和主机时间参考未同步。时间戳的单位为 50 毫秒。时间戳的值基于主机给出 Read_Batch_Scan_Results_Sub_cmd 的时间。如果固件中的命令到达时间为 T_c,则固件中获取时间戳的实际时间为 T_fw。报告时间将为:(T_c - T_fw)。T_cT_fw 都在固件时间域中。这使主机可以计算出事件发生的时间。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Batch_scan_opcode 1 个八位字节 0x03 [设置批量扫描参数]
Batch_Scan_data_read 1 个八位字节 标识格式(截断或完整)
num_of_records 1 个八位字节 Batch_Scan_data_read 的记录数
format_of_data 可变 截断模式
Address[0]:6 个八位字节
Address_Type[0]:1 个八位字节
Tx_Pwr[0]:1 个八位字节
RSSI[0]:1 个八位字节
Timestamp[0]:2 个八位字节
[具有上述格式的多个记录(num_of_records)]

完整模式
Address[0]:6 个八位字节
Address_Type[0]:1 个八位字节
Tx_Pwr[0]:1 个八位字节
RSSI[0]:1 个八位字节
Timestamp[0]:2 个八位字节
Adv packet_len[0]:1 个八位字节
Adv_packet[0]:Adv_packet_len 个八位字节
Scan_data_resp_len[0]:1 个八位字节
Scan_data_resp[0]:Scan_data_resp 个八位字节
[具有上述格式的多个记录(num_of_records)]

广播数据包内容过滤器

使用此功能可在控制器中启用/禁用/设置广播数据包内容过滤器 (APCF)。APCF 在控制器中过滤广播报告,但不过滤周期性广播。

LE_APCF_Command

OCF:0x157

命令参数 大小 用途
APCF_opcode 1 个八位字节 0x00 - APCF 启用
0x01 - APCF 设置过滤参数
0x02 - APCF 广播器地址
0x03 - APCF 服务 UUID
0x04 - APCF 服务请求 UUID
0x05 - APCF 本地名称
0x06 - APCF 制造商数据
0x07 - APCF 服务数据
0x08 - APCF 传输发现服务
0x09 - APCF AD 类型过滤器
0x10 ~ 0xAF - 保留供将来使用
0xB0 ~ 0xDF - 保留给供应商
0xE0 ~ 0xFE - 保留供将来使用
0xFF - APCF 读取扩展功能

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 返回状态
APCF_opcode 1 个八位字节 0x00 - APCF 启用
0x01 - APCF 设置过滤参数
0x02 - APCF 广播器地址
0x03 - APCF 服务 UUID
0x04 - APCF 服务请求 UUID
0x05 - APCF 本地名称
0x06 - APCF 制造商数据
0x07 - APCF 服务数据
0x08 - APCF 传输发现服务
0x09 - APCF AD 类型过滤器
0x10 ~ 0xAF - 保留供将来使用
0xB0 ~ 0xDF - 保留给供应商
0xE0 ~ 0xFE - 保留供将来使用
0xFF - APCF 读取扩展功能

LE_APCF_Command:Enable_sub_cmd

子 OCF:0x00

子命令参数 大小 用途
APCF_enable 1 个八位字节 0x01 - 启用 APCF 功能
0x00 - 禁用 APCF 功能

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0x0 - APCF 启用
APCF_Enable 1 个八位字节 启用/禁用通过 APCF_enable 设置

LE_APCF_Command:set_filtering_parameters_sub_cmd

此子命令用于添加或删除过滤器规范或清除芯片上过滤器的过滤器列表。

子 OCF:0x01

子命令参数 大小 用途
APCF_Action 1 个八位字节 0x00 - 添加
0x01 - 删除
0x02 - 清除
删除将清除特定过滤器以及其他表中的关联功能条目。
清除将清除所有过滤器以及其他表中的关联条目。
APCF_Filter_Index 1 个八位字节 过滤器索引 (0, max_filter-1)
APCF_Feature_Selection 2 个八位字节 所选功能的位掩码
位 0:设置为启用广播地址过滤器
位 1:设置为启用服务数据更改过滤器
位 2:设置为启用服务 UUID 检查
位 3:设置为启用服务请求 UUID 检查
位 4:设置为启用本地名称检查
位 5:设置为启用制造商数据检查
位 6:设置为启用服务数据检查
位 7:设置为启用传输发现服务检查
位 8:设置为启用 AD 类型检查
APCF_List_Logic_Type 2 个八位字节 APCF_Feature_Selection 中指定的每个功能选择(按位位置)的逻辑运算。
仅当功能启用时有效。
位位置值
0:OR
1:AND
如果选择“AND”逻辑,则仅当 ADV 数据包包含列表中的所有条目时,该数据包才会通过过滤器。
如果选择“OR”逻辑,则如果 ADV 数据包包含列表中的任何条目,该数据包将通过过滤器。
APCF_Filter_Logic_Type 1 个八位字节 0x00:OR
0x01:AND
注意:逻辑类型不适用于 APCF_Feature_Selection 的前三个字段,它们始终是“AND”逻辑。它们仅适用于 APCF_Feature_Selection 的(位 3 - 位 6)四个字段。
rssi_high_thresh 1 个八位字节 [单位:dBm]
仅当信号高于 RSSI 高阈值时,才认为广告商可见。否则,固件必须表现得好像从未见过它。
delivery_mode 1 个八位字节 0x00 - immediate(立即)
0x01 - on_found(发现时)
0x02 - batched(批量)
onfound_timeout 2 个八位字节 仅当 delivery_modeon_found 时有效。
[单位:毫秒]
固件停留并收集其他广播的时间,然后再报告。
onfound_timeout_cnt 1 个八位字节 仅当 delivery_modeon_found 时有效。
[计数]
如果 onFound 中的广播在固件中停留 onfound_timeout 持续时间,它将收集一些广播并检查计数。如果计数超过 onfound_timeout_cnt,则会在之后立即报告 OnFound
rssi_low_thresh 1 个八位字节 仅当 delivery_modeon_found 时有效。
[单位:dBm]
如果接收到的数据包的 RSSI 不高于 RSSI 低阈值,则认为广告商数据包不可见。
onlost_timeout 2 个八位字节 仅当 delivery_modeon_found 时有效。
[单位:毫秒]
如果某个广播在被发现后,在 lost_timeout 期间未连续看到,则会立即报告丢失。
num_of_tracking_entries 2 个八位字节 仅当 delivery_modeon_found 时有效。
[计数]
每个过滤器要跟踪的广告商总数。

RSSI 值必须使用 2 的补码来表示负值。

主机应能够配置多个过滤器,并将 APCF_Application_Address_type 设置为 0x02(对于所有广播器地址),以管理各种过滤器组合。

过滤、批量处理和报告是相互关联的概念。每个广播和相关的扫描响应都必须依次通过所有过滤器。因此,结果操作(delivery_mode)与过滤紧密相关。交付模式如下:report_immediately(立即报告)、batch(批量)和 onFound(发现时)。OnLost 值与 OnFound 相关,因为它将在 OnFound 丢失后出现。

此处理流程描述了概念模型

当收到广播(或扫描响应)帧时,它将按顺序应用于所有过滤器。一个广播可能基于一个过滤器导致立即报告,并且由于不同的过滤器操作而导致相同的批量处理。

RSSI 电平阈值(高和低)即使在控制器收到有效数据包时,也能够控制帧何时对过滤器处理可见。如果交付模式设置为立即或批量,则帧的 RSSI 将被考虑用于进一步的控制器处理。不同的应用程序需要不同的报告和批量处理行为。这允许多个应用程序同时在固件中直接报告和/或批量处理结果。一个例子是当一个应用程序的批量扫描处于活动状态,稍后另一个应用程序发出常规 LE 扫描时的情况。在发出批量扫描之前,框架/应用程序会设置适当的过滤器。稍后,当第二个应用程序发出常规扫描时,之前的批量处理将继续。但是,由于常规扫描,它类似于在概念上添加一个空过滤器(以及所有现有过滤器)以及 LE 扫描命令。当激活时,LE 扫描命令参数优先。当禁用常规 LE 扫描时,控制器将恢复为之前的批量扫描(如果存在)。

OnFound 交付模式基于配置的过滤器。触发过滤器操作成功的组合被认为是跟踪 onLost 的实体。相应的事件是 LE Advt 跟踪子事件。

过滤器(如果启用)的 OnFound/OnLost 转换将如下所示

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0x01 - APCF 设置过滤参数
APCF_Action 1 个八位字节 回显命令的 APCF_Action
APCF_AvailableSpaces 1 个八位字节 过滤器表中可用条目的数量

LE_APCF_Command:broadcast_address_sub_cmd

此子命令用于添加或删除广播器地址或清除芯片上过滤器的广播器地址列表。

子 OCF:0x02

子命令参数 大小 用途
APCF_Action 1 个八位字节 0x00 - 添加
0x01 - 删除
0x02 - 清除
删除将删除指定过滤器中指定的广播器地址。
清除将清除指定过滤器中的所有广播器地址。
APCF_Filter_Index 1 个八位字节 过滤器索引 (0, max_filter-1)
APCF_Broadcaster_Address 6 个八位字节 要添加到或从广播器地址列表中删除的 6 字节设备地址
APCF_Application_Address_type 1 个八位字节 0x00:公共
0x01:随机
0x02:NA(忽略地址类型)
要过滤具有身份地址类型 (0x02, 0x03) 的广播报告。要获取地址类型为 0x02 和 0x03 的广播报告,请将此字段设置为 0x02:NA(忽略地址类型)。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0x02 - APCF 广播器地址
APCF_Action 1 个八位字节 回显命令的 APCF_Action
APCF_AvailableSpaces 1 个八位字节 广播地址表中仍然可用的空闲条目数

LE_APCF_Command:service_uuid_sub_cmd

此子命令用于添加或删除服务 UUID 或清除芯片上过滤器的服务 UUID 列表。

子 OCF:0x03

子命令参数 大小 用途
APCF_Action 1 个八位字节 0x00 - 添加
0x01 - 删除
0x02 - 清除
删除将删除指定过滤器中指定的服务 UUID 地址。
清除将清除指定过滤器中的所有服务 UUID。
APCF_Filter_Index 1 个八位字节 过滤器索引 (0, max_filter-1)
APCF_UUID 2、4、16 个八位字节 服务 UUID(16 位、32 位或 128 位),用于添加到列表或从列表中删除。
APCF_UUID_MASK 2、4、16 个八位字节 要添加到列表的服务 UUID 掩码(16 位、32 位或 128 位)。它应与 APCF_UUID 的长度相同。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0x03 - APCF 服务 UUID
APCF_Action 1 个八位字节 回显命令的 APCF_Action
APCF_AvailableSpaces 1 个八位字节 服务 UUID 表中仍然可用的空闲条目数

LE_APCF_Command:solicitation_uuid_sub_cmd

此子命令用于添加或删除请求 UUID 或清除芯片上过滤器的请求 UUID 列表。

子 OCF:0x04

子命令参数 大小 用途
APCF_Action 1 个八位字节 0x00 - 添加
0x01 - 删除
0x02 - 清除
删除将删除指定过滤器中的请求 UUID 地址。
清除将清除指定过滤器中的所有请求 UUID。
APCF_Filter_Index 1 个八位字节 过滤器索引 (0, max_filter-1)
APCF_UUID 2、4、16 个八位字节 请求 UUID(16 位、32 位或 128 位),用于添加到列表或从列表中删除。
APCF_UUID_MASK 2、4、16 个八位字节 要添加到列表的请求 UUID 掩码(16 位、32 位或 128 位)。它应与 APCF_UUID 的长度相同。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0x04 - APCF 请求 UUID
APCF_Action 1 个八位字节 回显命令的 APCF_Action
APCF_AvailableSpaces 1 个八位字节 请求 UUID 表中仍然可用的空闲条目数

LE_APCF_Command:local_name_sub_cmd

此子命令用于添加或删除本地名称字符串或清除芯片上过滤器的本地名称字符串列表。

子 OCF:0x05

子命令参数 大小 用途
APCF_Action 1 个八位字节 0x00 - 添加
0x01 - 删除
0x02 - 清除
删除将删除指定过滤器中指定的本地名称字符串。
清除将清除指定过滤器中的所有本地名称字符串。
APCF_Filter_Index 1 个八位字节 过滤器索引 (0, max_filter-1)
APCF_LocName_Mandata_or_SerData 可变大小 本地名称的字符串。

注释
  • 当前,本地名称字符串中的最大字符数为 29
  • 当操作为“清除” (0x2) 时不适用

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0x05 - APCF 本地名称
APCF_Action 1 个八位字节 回显命令的 APCF_Action
APCF_AvailableSpaces 1 个八位字节 本地名称表中仍然可用的空闲条目数

LE_APCF_Command:manf_data_sub_cmd

此子命令用于添加或删除制造商数据字符串或清除芯片上过滤器的制造商数据字符串列表。

子 OCF:0x06

子命令参数 大小 用途
APCF_Action 1 个八位字节 0x00 - 添加
0x01 - 删除
0x02 - 清除
删除将删除指定过滤器中指定的制造商数据字符串。
清除将清除指定过滤器中的所有制造商数据字符串。
APCF_Filter_Index 1 个八位字节 过滤器索引 (0, max_filter-1)
APCF_LocName_Mandata_or_SerData 可变大小 制造商数据的字符串。

注释
  • 当前,本地名称字符串中的最大字符数为 29
  • 当操作为“清除” (0x2) 时不适用
APCF_ManData_Mask 可变大小 要添加到列表的制造商数据掩码。它应与 APCF_LocName_or_ManData_or_SerData 的长度相同。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0x06 - APCF 制造商数据
APCF_Action 1 个八位字节 回显命令的 APCF_Action
APCF_AvailableSpaces 1 个八位字节 制造商数据表中仍然可用的空闲条目数

LE_APCF_Command:service_data_sub_cmd

此子命令用于添加或删除服务数据字符串或清除芯片上过滤器的服务数据字符串列表。

子 OCF:0x07

子命令参数 大小 用途
APCF_Action 1 个八位字节 0x00 - 添加
0x01 - 删除
0x02 - 清除
删除将删除指定过滤器中指定的服务数据字符串。
清除将清除指定过滤器中的所有服务数据字符串。
APCF_Filter_Index 1 个八位字节 过滤器索引 (0, max_filter-1)
APCF_LocName_Mandata_or_SerData 可变大小 服务数据的字符串。

注释
  • 当前,本地名称字符串中的最大字符数为 29
  • 当操作为“清除” (0x2) 时不适用
APCF_LocName_Mandata_or_SerData_Mask 可变大小 要添加到列表的服务数据掩码。它应与 APCF_LocName_or_ManData_or_SerData 的长度相同。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0x07 - APCF 服务数据
APCF_Action 1 个八位字节 回显命令的 APCF_Action
APCF_AvailableSpaces 1 个八位字节 服务数据表中仍然可用的空闲条目数

LE_APCF_Command:ad_type_sub_cmd

此子命令用于添加或删除 AD 类型或清除芯片上过滤器的 AD 类型列表。使用 read_extended_features_sub_cmd 检查是否支持此命令。
APCF_AD_DATA_Length 为 0 时,过滤 APCF_AD_TYPE,无需比较 AD 数据和 AD 数据掩码。如果接收到的 ADV 数据包的数据长度超过 AD_DATA_LENGTH,则仅比较 AD 数据的前 AD_DATA_LENGTH 个字节,并忽略其余数据。

子 OCF:0x09

子命令参数 大小 用途
APCF_Action 1 个八位字节 0x00 - 添加
0x01 - 删除
0x02 - 清除
删除将删除指定过滤器中指定的 AD 类型。
清除将清除指定过滤器中的所有 AD 类型。
APCF_Filter_Index 1 个八位字节 过滤器索引 (0, max_filter-1)
APCF_AD_TYPE 1 个八位字节 用于添加到列表或从列表中删除的 AD 类型。当 APCF_Action 为 0x02(清除)时忽略
APCF_AD_DATA_Length 1 个八位字节 0x00 - 表示不过滤数据内容
APCF_Action 为 0x02(清除)时忽略
APCF_AD_DATA 可变大小 可变大小,基于 APCF_AD_DATA_Length
APCF_Action 为 0x02(清除)时忽略
APCF_AD_DATA_MASK 可变大小 可变大小,基于 APCF_AD_DATA_Length
APCF_Action 为 0x02(清除)时忽略
它应与 APCF_AD_DATA 的长度相同。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0x09 - APCF AD 类型
APCF_Action 1 个八位字节 回显命令的 APCF_Action
APCF_AvailableSpaces 1 个八位字节 AD 类型表中仍然可用的空闲条目数

LE_APCF_Command:read_extended_features_sub_cmd

此子命令用于读取扩展 APCF 功能。

子 OCF:0xFF

子命令参数 大小 用途
不适用 空命令参数。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
APCF_opcode 1 个八位字节 0xFF - APCF_Read_Extended_Features
APCF_extended_features 2 个八位字节

支持的扩展功能的位掩码

  • 位 0:支持传输发现服务过滤器
  • 位 1:支持 AD 类型过滤器
  • 位 2 ~15:保留供将来使用

位值

  • 0 = 不支持
  • 1 = 支持

控制器活动和能量信息命令

此信息的目的是为了使更高层的主机系统功能能够分析所有组件(包括 BT 控制器及其宏状态)的总活动,并结合应用程序和框架中正在发生的事情。为此,需要从 BT 协议栈和控制器获取以下信息

  • BT 协议栈:报告控制器的当前宏操作状态
  • 固件:报告聚合活动和能量信息

BT 主机协议栈宏状态,由用户级别确定

  • 空闲:[页面扫描、LE 广播、查询扫描、LE 扫描]
  • 扫描:[寻呼/查询/尝试连接]
  • 活动:[ACL 链路已连接、SCO 链路正在进行、嗅探模式]

控制器在其生命周期内跟踪的活动是 Tx 时间、Rx 时间、空闲时间和总能耗。当从主机读取时,它们将被清除。

LE_Get_Controller_Activity_Energy_Info

这是一个供应商特定的命令。

OCF:0x159

子命令参数 大小 用途
NA 空命令参数

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
total_tx_time_ms 4 个八位字节 执行 Tx 的总时间
total_rx_time_ms 4 个八位字节 执行 Rx 的总时间
total_idle_time_ms 4 个八位字节 空闲状态的总时间(非睡眠低功耗状态)
total_energy_used 4 个八位字节 使用的总能量 [电流 (mA)、电压 (V) 和时间 (ms) 的乘积]

LE 扩展设置扫描参数命令

此命令可用于在控制器中启用更大的扫描窗口和间隔。根据 BT Core 5.2 规范,扫描窗口和间隔的上限为 10.24 秒,这会妨碍应用程序超过 10.24 秒的扫描间隔。

基本参考:BT Core 5.2 规范,第 2493 页(LE 设置扫描参数命令)

OCF:0x15A

命令参数 大小 用途
LE_Ex_Scan_Type 1 个八位字节 0x00 - 被动扫描。不应发送 SCAN_REQ 数据包(默认)。
0x01 - 主动扫描。可以发送 SCAN_REQ 数据包。
LE_Ex_Scan_Interval 4 个八位字节 定义为控制器启动上次 LE 扫描到开始后续 LE 扫描的时间间隔。
范围:0x0004 到 0x00FFFFFF
默认值:0x0010 (10 毫秒)
时间 = N * 0.625 毫秒
时间范围:2.5 毫秒到 10442.25 秒
LE_Ex_Scan_Window 4 个八位字节 LE 扫描的持续时间。LE_Scan_Window 应小于或等于 LE_Scan_Interval
范围:0x0004 到 0xFFFF
默认值:0x0010 (10 毫秒)
时间 = N * 0.625 毫秒
时间范围:2.5 毫秒到 40.95 秒
Own_Address_Type 1 个八位字节 0x00 - 公共设备地址(默认)
0x01 - 随机设备地址
LE_Ex_Scan_Filter_Policy 0x00 - 接受所有广播数据包(默认)。应忽略并非寻址到此设备的定向广播数据包。
0x01 - 忽略来自不在白名单列表中的设备的广播数据包。应忽略并非寻址到此设备的定向广播数据包。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态

获取控制器调试信息命令

此信息元素的目的是让主机以二进制形式获取控制器调试信息,用于后处理和分析。这有助于调试现场问题,并为工程师提供一个工具包来记录信息以进行分析。控制器可以在主机通过事件(控制器调试信息子事件)请求时提供信息,或者在控制器需要时自主提供信息。示例用途可以是报告固件状态信息、崩溃转储信息、日志信息等。

OCF:0x15B

命令参数 大小 用途
N/A 空命令参数列表

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态

A2DP 硬件卸载支持

A2DP 卸载功能支持将 A2DP 音频编码过程卸载到连接到 BT 控制器的音频处理器。编码后的音频数据流直接从音频处理器传递到 BT 控制器,而无需 BT 主机参与。BT 主机仍然负责 A2DP 会话的配置和控制。有两种版本的命令可用。子 OCF 0x01-0x02 的旧版命令仅支持开源编解码器。子 OCF 0x03-0x04 的版本与配置的编解码器无关。

OCF:0x15D

启动 A2DP 卸载(旧版)

子 OCF:0x01

使用此命令配置 A2DP 卸载过程并启动 A2DP 流。

命令参数 大小 用途
Codec 4 个八位字节 指定编解码器类型
0x01 - SBC
0x02 - AAC
0x04 - APTX
0x08 - APTX HD
0x10 - LDAC
Max_Latency 2 个八位字节 允许的最大延迟(以毫秒为单位)。值为零禁用刷新。
SCMS-T_Enable 2 个八位字节 八位字节 0:启用添加 SCMS-T 标头的标志。
  • 0x00 - 不包含 SCMS-T 标头。
  • 0x01 - 包含 SCMS-T 标头。

八位字节 1:启用时,SCMS-T 标头的值。

Sampling_Frequency 4 个八位字节 0x01 - 44100 Hz
0x02 - 48000 Hz
0x04 - 88200 Hz
0x08 - 96000 Hz
Bits_Per_Sample 1 个八位字节 0x01 - 每个样本 16 位
0x02 - 每个样本 24 位
0x04 - 每个样本 32 位
Channel_Mode 1 个八位字节 0x01 - 单声道
0x02 - 立体声
Encoded_Audio_Bitrate 4 个八位字节 编码音频比特率,单位为比特每秒。
0x00000000 - 未指定/未使用音频比特率。
0x00000001 - 0x00FFFFFF - 编码音频比特率,单位为比特每秒。
0x01000000 - 0xFFFFFFFF - 保留。
Connection_Handle 2 个八位字节 正在配置的 A2DP 连接的连接句柄
L2CAP_Channel_ID 2 个八位字节 用于此 A2DP 连接的 L2CAP 通道 ID
L2CAP_MTU_Size 2 个八位字节 包含编码音频数据包的 L2CAP MTU 的最大大小
Codec_Information 32 个八位字节 编解码器特定信息。

SBC 编解码器

请参阅 A2DP v1.3 中的 SBC 编解码器特定信息元素。
八位字节 0:块长度 | 子带 | 分配方法
八位字节 1:最小比特池值
八位字节 2:最大比特池值
八位字节 3:采样频率 | 声道模式
八位字节 4-31:保留

AAC 编解码器

请参阅 A2DP v1.3 中的 AAC 编解码器特定信息元素
八位字节 0:对象类型
八位字节 1;b7:VBR
八位字节 2-31:保留

LDAC 编解码器

八位字节 0-3:供应商 ID
0x0000012D

八位字节 4-5:编解码器 ID
0x00AA - LDAC
所有其他值均保留

八位字节 6:比特率索引
0x00 - 高
0x01 - 中
0x02 - 低
0x03 - 0x7E - 保留
0x7F - ABR(自适应比特率)
0x80 - 0xFF - 保留

八位字节 7:LDAC 声道模式
0x01 - 立体声
0x02 - 双声道
0x04 - 单声道
其他值保留

八位字节 8-31:保留

所有其他编解码器

八位字节 0-31:保留

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Sub_Opcode 1 个八位字节 0x01 - 启动 A2DP 卸载

启动 A2DP 卸载

子 OCF:0x03

使用此命令配置 A2DP 卸载过程并启动 A2DP 流。

命令参数 大小 用途
连接句柄 2 个八位字节 活动 HCI 连接的句柄
L2CAP_Channel_ID 2 个八位字节 L2CAP 通道的标识符,为 A2DP 流打开
Data_Path_Direction 1 个八位字节 0x00 - 输出(AVDTP 源/合并)
0x01 - 输入(AVDTP 接收器/拆分)
Peer_MTU 2 个八位字节 与对等方协商的最大 L2CAP 数据包大小。
CP_Enable_SCMS_T 1 个八位字节 0x00 - 禁用 SCMS-T 内容保护标头
0x01 - 启用 SCMS-T 内容保护标头
CP_Header_SCMS_T 1 个八位字节 当启用 SCMS-T 内容保护标头(CP_SCMS_T_Enable 设置为 0x01)时,定义在音频内容之前的标头值(请参阅 A2DP,第 3.2.1-2 节),如 Bluetooth Assigned Numbers,第 6.3.2 节中所定义。
当未启用 SCMS-T 内容保护时忽略。
Vendor_Specific_Parameters_Length 1 个八位字节 供应商特定参数的长度,范围为 0 到 128。
当没有提供其他参数时,使用值 0。
Vendor_Specific_Parameters 0-128 个八位字节 Bluetooth Audio HAL 提供的供应商特定参数,CodecParameters.vendorSpecificParameters[]

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Sub_Opcode 1 个八位字节 0x03 - 启动 A2DP 卸载

停止 A2DP 卸载(旧版)

子 OCF:0x02

此命令用于停止 A2DP 卸载流。

命令参数 大小 用途
N/A 空命令参数列表。

此命令未定义参数。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Sub_Opcode 1 个八位字节 0x02 - 停止 A2DP 卸载

停止 A2DP 卸载

子 OCF:0x04

此命令用于停止 A2DP 卸载流。

命令参数 大小 用途
连接句柄 2 个八位字节 活动 HCI 连接的句柄
L2CAP_Channel_ID 2 个八位字节 L2CAP 通道的标识符,为 A2DP 流打开
Data_Path_Direction 1 个八位字节 0x00 - 输出(AVDTP 源/合并)
0x01 - 输入(AVDTP 接收器/拆分)

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Sub_Opcode 1 个八位字节 0x04 - 停止 A2DP 卸载

蓝牙质量报告命令

BT 质量报告命令功能启动蓝牙控制器中的机制,以向主机报告蓝牙质量事件。您可以启用四个选项

  • 质量监控模式:控制器定期向主机发送与链路质量相关的 BQR 子事件。
  • 接近 LSTO:如果长时间(超过链路监控超时 (LSTO) 值的一半)未从连接的 BT 设备收到数据包,则控制器会向主机报告接近 LSTO 事件。
  • A2DP 音频卡顿:当控制器检测到导致音频卡顿的因素时,控制器会向主机报告 A2DP 音频卡顿事件。
  • (e)SCO 语音卡顿:当控制器检测到导致语音卡顿的因素时,控制器会向主机报告 (e)SCO 语音卡顿事件。
  • 根炎症:当 HAL 或控制器遇到致命错误并且需要重启蓝牙时,控制器会将此事件发送到协议栈。
  • LMP/LL 消息跟踪:控制器将与远程设备握手的 LMP/LL 消息发送到主机。
  • 蓝牙多配置文件/共存调度跟踪:控制器将其在 2.4 Ghz 频段中处理多个蓝牙配置文件和无线共存的调度信息发送到主机。
  • 控制器调试信息机制:启用后,控制器可以通过控制器调试信息子事件自主向主机报告调试日志信息。
  • LE 音频卡顿:当控制器检测到导致音频卡顿的因素时,控制器会向主机报告 LE 音频卡顿事件。
  • 高级 RF 统计模式:控制器向主机报告其 RF 统计相关信息,支持两种报告用例
    • 定期报告
    • 事件触发器(流启动/停止和链路质量事件触发器)。
  • 蓝牙质量报告命令的 BQR_Report_Action:主机可以使用此 HCI 命令来获取质量监控模式、能量监控模式或高级 RF 统计模式的一次性查询。

OCF:0x15E

命令参数 大小 用途
BQR_Report_Action 1 个八位字节 添加/删除在 BQR_Quality_Event_Mask 参数中设置的质量事件报告的操作,或清除所有报告。

0x00 - 添加
0x01 - 删除
0x02 - 清除
0x03 - 一次性查询

删除将清除特定的质量事件报告。
清除将清除所有质量事件报告(可以忽略 BQR_Quality_Event_Mask 参数)。

BQR_Quality_Event_Mask 4 个八位字节 所选质量事件报告的位掩码。

位 0:设置为启用质量监控模式。
位 1:设置为启用接近 LSTO 事件(用于 ACL/(e)SCO/ISO)。
位 2:设置为启用 A2DP 音频卡顿事件。
位 3:设置为启用 (e)SCO 语音卡顿事件。
位 4:设置为启用根炎症事件。
位 5:设置为启用能量监控模式。
位 6:设置为启用 LE 音频卡顿事件。
位 7:设置为启用连接失败事件。
位 8:设置为启用高级 RF 统计模式事件触发器。
位 9:设置为启用高级 RF 统计定期报告。
位 10 ~ 14:保留。
位 15:设置为启用供应商特定的质量事件。
位 16:设置为启用 LMP/LL 消息跟踪。
位 17:设置为启用蓝牙多链路/共存调度跟踪。
位 18:设置为启用控制器调试信息机制。
位 19 ~ 30:保留。
位 31:设置为启用供应商特定的跟踪。

BQR_Minimum_Report_Interval 2 个八位字节 定义所选质量事件的质量事件报告的最小时间间隔。控制器固件不应在定义的timeInterval 内报告下一个事件。间隔设置应分别专用于正在添加的质量事件。

单位:毫秒
默认值:0(对间隔没有限制。)
范围:0 ~ 65535 毫秒

BQR_Vendor_Specific_Quality_Event_Mask 4 个八位字节 所选供应商特定质量事件报告的位掩码。
仅当设置了 BQR_Quality_Event_Mask 的位 15 时,此参数才有效。

位 0 ~ 31:保留。

BQR_Vendor_Specific_Trace_Mask 4 个八位字节 所选供应商特定跟踪报告的位掩码。
仅当设置了 BQR_Quality_Event_Mask 的位 31 时,此参数才有效。

位 0 ~ 31:保留。

Report_interval_multiple 4 个八位字节 BQR_Minimum_Report_Interval 的乘数。当此值 >= 1 时,BQR 报告间隔遵循以下格式
BQR 报告间隔 = BQR_Minimum_Report_Interval x Report_interval_multiple。
控制器固件不得在定义的timeInterval 内报告下一个事件。间隔设置专门用于添加的质量事件。

单位:毫秒
默认值:1
范围:0 ~ 4294967295 (0: 等于设置为 1)

注意:如果 BQR_Report_Interval 的设置大于控制器的能力,则控制器必须在命令完成时返回最大 BQR_Report_Interval 时间。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Current_Quality_Event_Mask 4 个八位字节 指示当前位掩码设置。
位 0:质量监控模式已启用。
位 1:接近 LSTO 事件报告已启用。
位 2:A2DP 音频卡顿事件报告已启用。
位 3:(e)SCO 语音卡顿事件报告已启用。
位 4:根炎症事件报告已启用。
位 5:能量监控模式已启用。
位 6:LE 音频卡顿事件报告已启用。
位 7:连接失败事件。
位 8:设置为启用高级 RF 统计模式事件触发器。
位 9:设置为启用高级 RF 统计定期报告。
位 10 ~ 14:保留。
位 15:供应商特定的质量事件报告已启用。
位 16:LMP/LL 消息跟踪已启用。
位 17:蓝牙多链路/共存调度跟踪已启用。
位 18:控制器调试信息机制已启用。
位 19 ~ 30:保留。
位 31:供应商特定的跟踪已启用。
Current_Vendor_Specific_Quality_Event_Mask 4 个八位字节 指示当前位掩码设置。
Current_Vendor_Specific_Trace_Mask 4 个八位字节 指示当前位掩码设置。
BQR_Report_interval 4 个八位字节 指示当前位掩码设置。
Current_Vendor_Specific_Trace_Mask 4 个八位字节 BQR_Report_interval 的设置。它必须是 BQR_Minimum_Report_Interval * Report_interval_multiple 或控制器最大支持间隔之间的最小值。

动态音频缓冲区命令

动态音频缓冲区通过根据各种场景更改蓝牙控制器中的音频缓冲区大小来减少音频故障。

OCF:0x15F

获取音频缓冲区时间能力

子 OCF:0x01

使用此命令从蓝牙控制器获取音频缓冲区时间能力。

命令参数 大小 用途
N/A 空命令参数列表

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Dynamic_Audio_Buffer_opcode 1 个八位字节 0x01 - 获取音频缓冲区时间
Audio_Codec_Type_Supported 4 个八位字节 支持的编解码器类型的位掩码
位 0 - SBC
位 1 - AAC
位 2 - APTX
位 3 - APTX HD
位 4 - LDAC
位 5-31 保留
Audio_Codec_Buffer_Default_Time_For_Bit_0 2 个八位字节 Audio_Codec_Type_Supported 中指定的 Bit 0 编解码器类型的默认缓冲区时间。
如果不支持 Bit 0 编解码器类型,则此值应为 0。
单位:毫秒
Audio_Codec_Buffer_Maximum_Time_For_Bit_0 2 个八位字节 Audio_Codec_Type_Supported 中指定的 Bit 0 编解码器类型的最大缓冲区时间。
如果不支持 Bit 0 编解码器类型,则此值应为 0。
单位:毫秒
Audio_Codec_Buffer_Minimum_Time_For_Bit_0 2 个八位字节 Audio_Codec_Type_Supported 中指定的 Bit 0 编解码器类型的最小缓冲区时间。
如果不支持 Bit 0 编解码器类型,则此值应为 0。
单位:毫秒
Audio_Codec_Buffer_Default_Time_For_Bit_1 2 个八位字节 Audio_Codec_Type_Supported 中指定的 Bit 1 编解码器类型的默认缓冲区时间。
如果不支持 Bit 1 编解码器类型,则此值应为 0。
单位:毫秒
Audio_Codec_Buffer_Maximum_Time_For_Bit_1 2 个八位字节 Audio_Codec_Type_Supported 中指定的 Bit 1 编解码器类型的最大缓冲区时间。
如果不支持 Bit 1 编解码器类型,则此值应为 0。
单位:毫秒
Audio_Codec_Buffer_Minimum_Time_For_Bit_1 2 个八位字节 Audio_Codec_Type_Supported 中指定的 Bit 1 编解码器类型的最小缓冲区时间。
如果不支持 Bit 1 编解码器类型,则此值应为 0。
单位:毫秒
...... ...... ......
Audio_Codec_Buffer_Default_Time_For_Bit_31 2 个八位字节 Audio_Codec_Type_Supported 中指定的 Bit 31 编解码器类型的默认缓冲区时间。
如果不支持 Bit 31 编解码器类型,则此值应为 0。
单位:毫秒
Audio_Codec_Buffer_Maximum_Time_For_Bit_31 2 个八位字节 Audio_Codec_Type_Supported 中指定的 Bit 31 编解码器类型的最大缓冲区时间。
如果不支持 Bit 31 编解码器类型,则此值应为 0。
单位:毫秒
Audio_Codec_Buffer_Minimum_Time_For_Bit_31 2 个八位字节 Audio_Codec_Type_Supported 中指定的 Bit 31 编解码器类型的最小缓冲区时间。
如果不支持 Bit 31 编解码器类型,则此值应为 0。
单位:毫秒

设置音频缓冲区时间

子 OCF:0x02

使用此命令将音频缓冲区时间设置为蓝牙控制器。

命令参数 大小 用途
Audio_Codec_Buffer_Time 2 个八位字节 当前使用的编解码器的请求音频缓冲区时间。
单位:毫秒

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Dynamic_Audio_Buffer_opcode 1 个八位字节 0x02 - 设置音频缓冲区时间
Audio_Codec_Buffer_Time 2 个八位字节 蓝牙控制器中的当前音频缓冲区时间。
单位:毫秒

HCI 事件(供应商特定)

在某些情况下需要供应商特定的 HCI 事件。请参阅 BT Core 5.2 规范第 1897 页上的图 5.4。事件参数 0 将始终包含第一个子事件代码,HCI 事件的其余部分将基于该代码进行解码。

事件参数 大小 用途
HCI_vendor_specific_event_code 1 个八位字节 0xFF
sub_event_code 1 个八位字节 子事件代码的大小为 1 个八位字节,即 HCI 事件数据包中参数长度之后的字节。

存储阈值突破子事件

此事件指示已突破存储阈值。

子事件代码 = 0x54

子事件参数 大小 用途

LE 多重播发状态更改子事件

此事件指示播发实例已更改其状态。目前,此事件仅用于指示哪个播发实例因连接而停止。

子事件代码 = 0x55

子事件参数 大小 用途
Advertising_instance 1 个八位字节 标识特定的播发实例
有效值是 0 到 max_advt_instances-1
State_Change_Reason 1 个八位字节 0x00:接收到连接
Connection_handle 2 个八位字节 标识导致 advt 实例被禁用的连接(如果无效,则为 0xFFFF)

LE 播发跟踪子事件

此事件指示何时找到或丢失播发器。

子事件代码 = 0x56

子事件参数 大小 用途
APCF_Filter_Index 1 个八位字节 过滤器索引 (0, max_filter-1)
Advertiser_State 1 个八位字节 0x00:找到播发器
0x01:丢失播发器
Advt_Info_Present 1 个八位字节 0x00:播发器信息 (Advt_Info) 存在
0x01:播发器信息 (Advt_Info) 不存在
Advertiser_Address 6 个八位字节 公共地址或随机地址
Advertiser_Address_Type 1 个八位字节 0x00:公共地址
0x01:随机地址
Advt_Info Tx_Pwr[0]:1 个八位字节
RSSI[0]:1 个八位字节
Timestamp[0]:2 个八位字节
Adv packet_len[0]:1 个八位字节
Adv_packet[0]Adv_packet_len 个八位字节
Scan_data_resp_len[0]:1 个八位字节
Scan_data_resp[0]Scan_data_resp 个八位字节

控制器调试信息子事件

控制器使用此事件向主机提供二进制调试信息。

子事件代码 = 0x57

子事件参数 大小 用途
debug_block_byte_offset_start 2 个八位字节 从起始位置的调试块字节偏移量
last_block 1 个八位字节 0x00:存在更多调试数据
0x01:最后一个二进制块;没有更多调试数据
cur_pay_load_sz 2 个八位字节 当前事件中的二进制块大小
Debug_Data 可变 cur_payload_sz 的调试数据

蓝牙质量报告子事件

此事件指示以下情况之一:发生了蓝牙质量事件,控制器上传了 LMP/LL 消息跟踪和蓝牙多链路/共存调度跟踪,或者控制器转储了调试信息数据。

子事件参数 大小 用途
Quality_Report_Id 1 个八位字节 0x01:监控模式下的质量报告。
0x02:接近 LSTO。
0x03:A2DP 音频断断续续。
0x04:(e)SCO 语音断断续续。
0x05 ~ 0x06:保留。
0x07:LE 音频断断续续。
0x08:连接失败。
0x09 ~ 0xFF:保留。
Packet_Types 1 个八位字节 0x01:ID
0x02:NULL
0x03:POLL
0x04:FHS
0x05:HV1
0x06:HV2
0x07:HV3
0x08:DV
0x09:EV3
0x0A:EV4
0x0B:EV5
0x0C:2-EV3
0x0D:2-EV5
0x0E:3-EV3
0x0F:3-EV5
0x11:DH1
0x12:DM3
0x13:DH3
0x14:DM5
0x15:DH5
0x16:AUX1
0x17:2-DH1
0x18:2-DH3
0x19:2-DH5
0x1A:3-DH1
0x1B:3-DH3
0x1C:3-DH5
0x1D ~ 0x50:保留
0x51:ISO 数据包
0x52 ~ 0xFF:保留
Connection_Handle 2 个八位字节 ACL/(e)SCO/ISO 连接句柄。
Connection_Role 1 个八位字节 连接的执行角色。
0x00:中心设备
0x01:外围设备
0x02 ~ 0xFF:保留。
TX_Power_Level 1 个八位字节 指定 Connection_Handle 的当前发射功率级别。

此值应与控制器对 HCI_Read_Transmit_Power_Level HCI 命令的响应相同。

RSSI 1 个八位字节 [单位:dBm]

指定 Connection_Handle 的接收信号强度指示 (RSSI) 值。
此值应为绝对接收器信号强度值。
范围:-127 至 +20

SNR 1 个八位字节 [单位:dB]

指定 Connection_Handle 的信噪比 (SNR) 值。
控制器应提供链路使用的所有信道的平均 SNR。

Unused_AFH_Channel_Count 1 个八位字节 指示 AFH_channel_map 中未使用的信道数量。
0x4F ~ 0xFF:保留。
AFH_Select_Unideal_Channel_Count 1 个八位字节 指示受到干扰且质量较差,但仍被选中用于 AFH 的信道数量。
蓝牙规范允许的最小信道数为 20,因此即使所有 79 个信道都受到干扰且质量较差,控制器仍需要选择至少 20 个信道用于 AFH。
LSTO 2 个八位字节 当前链路监管超时设置。
时间 = N * 0.625 毫秒
时间范围:0.625 毫秒至 40.9 秒
Connection_Piconet_Clock 4 个八位字节 指定 Connection_Handle 的微微网时钟。
此值应与控制器对参数 "Which_Clock" 为 0x01(微微网时钟)的 HCI_Read_Clock HCI 命令的响应相同。
单位:N * 0.3125 毫秒(1 个蓝牙时钟)
Retransmission_Count 4 个八位字节 自上次事件以来的重传次数。
此计数在报告给主机后应重置。
No_RX_Count 4 个八位字节 自上次事件以来的无 RX 计数。
当在计划的时隙未收到数据包或收到的数据包已损坏时,计数会增加。
此计数在报告给主机后应重置。
NAK_Count 4 个八位字节 自上次事件以来的 NAK(否定确认)计数。
此计数在报告给主机后应重置。
Last_TX_ACK_Timestamp 4 个八位字节 上次 TX ACK 的时间戳。它基于微微网中心设备的蓝牙时钟 (CLK)。
单位:N * 0.3125 毫秒(1 个蓝牙时钟)
Flow_Off_Count 4 个八位字节 自上次事件以来控制器接收到 Flow-off (STOP) 的次数。
此计数在报告给主机后应重置。
Last_Flow_On_Timestamp 4 个八位字节 上次 Flow-on (GO) 的时间戳。它基于微微网中心设备的蓝牙时钟 (CLK)。
单位:N * 0.3125 毫秒(1 个蓝牙时钟)
Buffer_Overflow_Bytes 4 个八位字节 [单位:字节]

自上次事件以来的缓冲区溢出计数。
控制器计算丢弃了多少字节的数据。
此计数在报告给主机后应重置。

Buffer_Underflow_Bytes 4 个八位字节 [单位:字节]

自上次事件以来的缓冲区下溢计数。
此计数在报告给主机后应重置。

bdaddr 6 个八位字节 远程设备地址
cal_failed_item_count 1 个八位字节 校准失败项的计数
TX_Total_Packets 4 个八位字节 已发送的数据包数量。
TX_UnAcked_Packets 4 个八位字节 未收到确认的数据包数量。
此计数在报告给主机后重置。
TX_Flushed_Packets 4 个八位字节 未在其刷新点发送出的数据包数量。
此计数在报告给主机后重置。
TX_Last_Subevent_Packets 4 个八位字节 链路层在 CIS 事件的最后一个子事件中传输 CIS 数据 PDU 的数据包数量。
此计数在报告给主机后重置。
如果链路没有有效值,则该值为零。
CRC_Error_Packets 4 个八位字节 自上次事件以来接收到 CRC 错误的数据包数量。
此计数在报告给主机后重置。
RX_Duplicate_Packets 4 个八位字节 自上次事件以来接收到的重复(重传)数据包数量。
此计数在报告给主机后重置。
RX_Unreceived_Packets 4 个八位字节 未接收的数据包数量与 LE READ ISO Link Quality 命令的参数相同(请参阅蓝牙核心规范版本 5.4)。关联的流是 CIS 和 BIS。
当此值递增时,链路层未在其刷新点(在 CIS 上)或与其关联的事件结束时(在 BIS 上;请参阅蓝牙核心规范版本 5.4 卷 6 B 部分,第 4.4.6.6 节)接收到特定有效负载。
Coex_Info_Mask 2 个八位字节 位 0 - CoexInvolvement:设置为指示生成此报告时怀疑存在共存活动(例如,A2DP 断续和接近 LSTO)。
位 1 - WL 2G Radio Active:设置为指示 WLAN 2G 无线电处于活动状态。
位 2 - WL 2G Connected:设置为指示 WLAN 2G 无线电处于活动状态并已连接。
位 3 - WL 5G/6G Radio Active:设置为指示 WLAN 5G/6G 无线电处于活动状态。
位 4-15 - 保留
供应商特定参数 (参数总长度 - 待定)* 八位字节 供控制器供应商获取更多供应商特定参数。

子事件代码 = 0x58 [Quality_Report_Id = 0x05,根炎症事件]

此事件指示蓝牙 HAL 或控制器遇到致命错误,需要蓝牙堆栈记录这种情况并重新启动。在任何情况下,控制器都必须在发送调试信息事件的第一个片段之前向蓝牙堆栈发送 Root_Inflammation_Event。

Error_Code 参数包含从 HAL/控制器报告的错误代码,如果它是芯片组供应商特定的错误,则为 0。Vendor_Specific_Error_Code 包含来自 HAL/控制器的芯片组供应商特定错误代码。如果参数 Error_Code 不为 0,则应将其设置为 0。参数 Error_Code 和 Vendor_Specific_Error_Code 不应都为 0。

子事件参数 大小 用途
Quality_Report_Id 1 个八位字节 0x00 ~ 0x04:保留。
0x05:根炎症。
0x06 ~ 0xFF:保留。
Error_Code 1 个八位字节 0x00:包含芯片组供应商特定的错误代码。
0x01 ~ 0xFF:发生控制器故障。有关错误代码和描述的列表,请参阅蓝牙规范 [卷 2] D 部分,错误代码。
Vendor_Specific_Error_Code 1 个八位字节 0x00:未包含芯片组供应商特定的错误代码。
0x01 ~ 0xFF:芯片组供应商特定的错误代码。
供应商特定参数 (参数总长度 - 4)* 八位字节 供控制器供应商获取更多供应商特定参数。
子事件参数 大小 用途
Quality_Report_Id 1 个八位字节 0x00 ~ 0x10:保留。
0x11:LMP/LL 消息跟踪。
0x12:蓝牙多链路/共存调度跟踪。
0x13:控制器调试信息数据转储。
0x14 ~ 0xFF:保留。
Connection_Handle 2 个八位字节 连接句柄。
供应商特定参数 (参数总长度 - 4)* 八位字节 LMP 消息跟踪、蓝牙多链路/共存调度跟踪和控制器调试信息数据转储的供应商特定格式。

多播发器支持

多播发器支持的目标如下

  • 支持多个播发 (max_advt_instances) 的能力
  • 不同的发射功率以允许不同的范围
  • 不同的播发内容
  • 每个播发器的个性化响应
  • 每个播发器的隐私(不可追踪)
  • 可连接

为了使本规范与现有标准保持一致,提供了以下供应商特定命令。它们源自蓝牙核心 4.1 规范。

LE_Multi_Advt_Command

OCF:0x154

命令参数 大小 用途
Multi_advt_opcode 1 个八位字节 0x01 - Set_Advt_Param_Multi_Sub_Cmd
0x02 - Set_Advt_Data_Multi_Sub_Cmd
0x03 - Set_Scan_Resp_Data_Multi_Sub_Cmd
0x04 - Set_Random_Addr_Multi_Sub_Cmd
0x05 - Set_Advt_Enable_Multi_Sub_Cmd

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Multi_advt_opcode 1 个八位字节 0x01 - Set_Advt_Param_Multi_Command
0x02 - Set_Advt_Data_Multi_Command
0x03 - Set_Scan_Resp_Data_Multi_Command
0x04 - Set_Random_Addr_Multi_Command
0x05 - Set_Advt_Enable_Multi_Command

LE_Multi_Advt_Command:Set_Advt_Param_Multi_Sub_Cmd

基本参考:蓝牙核心 4.1 规范,第 964 页(LE 设置播发参数命令)

子 OCF:0x01

子命令参数 大小 用途
Advertising_Interval_Min 按规范 按规范
Advertising_Interval_Max 按规范 按规范
Advertising_Type 按规范 按规范
Own_Address_Type 按规范 按规范
Own_Address 按规范 按规范
Direct_Address_Type 按规范 按规范
Direct_Address 按规范 按规范
Advertising_Channel_Map 按规范 按规范
Adverstising_Filter_Policy 按规范 按规范
Advertising_Instance 1 个八位字节 指定上述参数对实例的适用性
Tx_power 1 个八位字节 Transmit_Power
单位 - 以 dBm 为单位(有符号整数)
范围 (-70 至 +20)

Own_Address 参数可能是设置此多重播发实例时主机配置的地址。这提供了在首次信标传输时具有可解析的私有地址的能力。实例上的播发将继续进行,而与连接无关。主机蓝牙堆栈可以在连接后发出命令以启动实例上的播发。

将为此命令生成命令完成事件,如蓝牙核心 4.1 规范中所述,根据上述命令。如果播发实例或 Tx_Power 参数无效,控制器将以非成功(无效参数)代码响应。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Multi_advt_opcode 1 个八位字节 0x01 [Set_Advt_Param_Multi_Sub_Cmd]

LE_Multi_Advt_Command:Set_Advt_Data_Multi_Sub_Cmd

基本参考:蓝牙核心 4.1 规范,第 969 页(LE 设置播发数据命令)

子 OCF:0x02

子命令参数 大小 用途
Advertising_Data_Length 按规范 按规范
Advertising_Data 按规范 按规范
Advertising_Instance 1 个八位字节 指定上述参数对实例的适用性

将为此命令生成命令完成事件,如蓝牙核心 4.1 规范中所述,根据上述命令。如果播发实例或 Tx_Power 参数无效,控制器将以非成功代码响应。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Multi_advt_opcode 1 个八位字节 0x02 [Set_Advt_Data_Multi_Sub_Cmd]

LE_Multi_Advt_Command:Set_Scan_Resp_Data_Multi_Sub_Cmd

基本参考:蓝牙核心 4.1 规范,第 970 页(LE 设置扫描响应数据命令)

子 OCF:0x03

子命令参数 大小 用途
Scan_Response_Data_Length 按规范 按规范
Scan_Response_Data 按规范 按规范
Advertising_Instance 1 个八位字节 指定上述参数对实例的适用性

将为此命令生成命令完成事件,如蓝牙核心 4.1 规范中所述,根据上述命令。如果播发实例或 Tx_Power 参数无效,控制器将以非成功代码(无效参数)响应。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Multi_advt_opcode 1 个八位字节 0x03 [Set_Scan_Resp_Data_Multi_Sub_Cmd]

LE_Multi_Advt_Command:Set_Random_Addr_Multi_Sub_Cmd

基本参考:蓝牙核心 4.1 规范,第 963 页(LE 设置随机地址命令)

子 OCF:0x04

子命令参数 大小 用途
Random Address 按规范 按规范
Advertising_Instance 1 个八位字节 指定上述参数对实例的适用性

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Multi_advt_opcode 1 个八位字节 0x04 [Set_Random_Addr_Multi_Sub_Cmd]

LE_Multi_Advt_Command:Set_Advt_Enable_Multi_Sub_Cmd

基本参考:蓝牙核心 4.1 规范,第 971 页(该核心规范中的 LE 设置播发使能命令)

OCF:0x05

子命令参数 大小 用途
Advertising_Enable 1 个八位字节 值为 1 表示启用。任何其他值表示禁用。
Advertising_Instance 1 个八位字节 指定上述参数对实例的适用性。实例 0 表示标准 HCI 实例。

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Multi_advt_opcode 1 个八位字节 0x05 [Set_Advt_Enable_Multi_Sub_Cmd]

卸载的私有地址解析

此功能在控制器固件或硬件中解析私有地址,这提供了以下好处

  • 主机解析私有地址的延迟
  • 通过避免唤醒主机来节省功耗

LE_Set_RPA_Timeout

OCF:0x15C

命令参数 大小 用途
LE_local_IRK 16 个八位字节 用于生成随机可解析地址的本地设备 IRK。
tRPA_min 2 个八位字节 最小 RPA 生成超时时间(秒)。控制器必须在此超时时间或之后为任何播发/扫描/连接事件生成新的可解析地址。
有效范围:300-1800
tRPA_max 2 个八位字节 最大 RPA 生成超时时间(秒)。控制器必须在此超时时间或之前为任何播发/扫描/连接事件生成新的可解析地址。
有效范围:tRPA_min-1800
返回参数 大小 用途
状态 1 个八位字节 命令的状态。

建议的 HCI 状态值
0x00 成功
0x01 未知命令(如果不支持)
0x12 无效命令参数(如果任何参数超出给定范围)

LE_RPA_offload_Command

OCF:0x155

命令参数 大小 用途
RPA_offload_opcode 1 个八位字节 0x1 - 启用客户特定功能
0x2 - 将 IRK 添加到列表
0x3 - 从列表中删除 IRK
0x4 - 清除 IRK 列表
0x5 - 读取 IRK 列表条目

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Event_RPA_offload_opcode 1 个八位字节 0x1 - 启用客户特定功能
0x2 - 将 IRK 添加到列表
0x3 - 从列表中删除 IRK
0x4 - 清除 IRK 列表
0x5 - 读取 IRK 列表条目

LE_RPA_offload:Enable_cust_specific_sub_Command

子 OCF:0x01

子命令参数 大小 用途
enable_customer_specific_feature_set 1 个八位字节 0x01 - 启用卸载的 RPA 功能
0x00 - 禁用卸载的 RPA 功能

基于芯片能力,主机需要启用 RPA 卸载。请参阅 LE_Get_Vendor_Capabilities_Command。每个芯片在固件中可以具有不同的 max_irk_list_sz

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Event_cust_specific_feature_opcode 1 个八位字节 0x01 [启用客户特定功能]

LE_RPA_offload:Add_IRK_to_list_sub_Command

子 OCF:0x02

子命令参数 大小 用途
LE_IRK 16 个八位字节 LE IRK(第 1 个字节 LSB)
Address_Type 1 个八位字节 0:公共地址
1:随机地址
LE_Device_Address 6 个八位字节 与 IRK 关联的公共地址或随机地址(第 1 个字节 LSB)

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Event_cust_specific_feature_opcode 1 个八位字节 0x02 [将 IRK 添加到列表]
LE_IrkList_AvailableSpaces 1 个八位字节 当前操作后可用的 IRL 列表条目

LE_RPA_offload:Remove_IRK_to_list_sub_Command

子 OCF:0x03

子命令参数 大小 用途
Address_Type 1 个八位字节 0:公共地址
1:随机地址
LE_Device_Address 6 个八位字节 与 IRK 关联的公共地址或随机地址

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Event_cust_specific_feature_opcode 1 个八位字节 0x03 [从列表中删除 IRK]
LE_IrkList_AvailableSpaces 1 个八位字节 当前操作后可用的 IRL 列表条目

LE_RPA_offload:Clear_IRK_list_sub_Command

子 OCF:0x04

子命令参数 大小 用途

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Event_cust_specific_feature_opcode 1 个八位字节 0x04 [清除 IRK 列表]
LE_IrkList_AvailableSpaces 1 个八位字节 当前操作后可用的 IRL 列表条目 [max_irk_list_sz]

LE_RPA_offload:Read_IRK_list_sub_Command

子 OCF:0x05

子命令参数 大小 用途
LE_read_IRK_list_entry-index 1 个八位字节 IRK 列表的索引 [0, max_irk_list_sz-1]

将为此命令生成 Command Complete 事件。

返回参数 大小 用途
状态 1 个八位字节 命令完成状态
Event_cust_specific_feature_opcode 1 个八位字节 0x05 [读取 IRK 列表条目]
LE_Read_IRK_List_entry 1 个八位字节 主机想要读回的 IRK 的索引(最大 IRK 列表大小为 32)
LE_IRK 16 个八位字节 IRK 值
Address_Type 1 个八位字节 0:公共地址
1:随机地址
LE_Device_Address 6 个八位字节 与 IRK 关联的公共地址或随机地址
LE_Resolved_Private_Address 6 个八位字节 此 IRK 的当前已解析的可解析私有地址