HCI 功能规范【3. Overview of commands and events】

这部分是HCI 章节第 3 节:Overview of commands and events,它不是在讲某一个具体命令,而是在讲:

HCI Command 和 HCI Event 的总览表怎么看、Controller 对命令/事件的支持要求怎么看,以及一些特殊规则。

可以把这一节理解成 HCI 命令和事件的“目录说明 + 支持规则说明”。


1. 这部分整体想表达什么

HCI 的命令和事件是在Host 和 Controller 之间传递的

Host → Controller:HCI Command Controller → Host:HCI Event Host ↔ Controller:HCI Data Packet

第 3 节重点讲的是:

有哪些 HCI Command 有哪些 HCI Event 这些命令/事件从哪个蓝牙版本开始出现 这些命令/事件是 BR/EDR 用的,还是 LE 用的 Controller 是否必须支持 支持条件是什么 legacy advertising 和 extended advertising 命令如何对应 底层功能支持和命令支持之间是什么关系

所以这一节更像是一个HCI 命令/事件支持矩阵说明


2. Table 3.1 是什么

Table 3.1 的名字是:

Alphabetical list of commands and events

也就是:

按字母顺序排列的 HCI 命令和事件列表

它会列出每一个 HCI Command 和 HCI Event,并给出这些信息:

Name Vers. Summary Description BR/EDR LE

截图中的表头如下:

Name | Vers. | Summary Description | BR/EDR | LE

每一列的含义如下。


2.1 Name:命令或事件名称

这一列是 HCI Command 或 HCI Event 的名称。

例如:

Accept Connection Request command Authentication Complete event Authentication Requested command HCI_LE_Set_Advertising_Parameters command HCI_LE_Advertising_Report event

如果是蓝色链接,说明可以点击进去看这个命令或事件的详细定义。

一般详细内容会包括:

Opcode Command Parameters Return Parameters Generated Events Description Error Codes

所以 Table 3.1 本身只是总览表,不是完整说明。

真正要理解某个命令,还是要点进去看命令详情,或者去后面对应的详细章节看。


2.2 Vers.:第一次出现的规范版本

Vers.表示这个命令或事件是从哪个蓝牙规范版本开始被定义的。

例如截图中:

Accept Connection Request command 1.1 Authenticated Payload Timeout Expired event 4.1

意思是:

Accept Connection Request command 从 Bluetooth 1.1 开始就有 Authenticated Payload Timeout Expired event 从 Bluetooth 4.1 开始出现

如果一个命令或事件有多个版本,可能会写成:

[v1] [v2]

这表示同一个命令/事件在不同版本中有一些细节差异。

注意:
版本不同,不代表它们是完全不同的功能。规范里说得很清楚:

同一个命令或事件的不同版本,实现的是相同的基础功能,只是细节上可能有差异。

例如:

参数变多 返回参数变多 描述细节变化 支持条件变化

2.3 Summary Description:简要说明

这一列是命令或事件的简要用途。

例如截图中:

The HCI_Accept_Connection_Request command is used to accept a new incoming BR/EDR connection request.

意思是:

HCI_Accept_Connection_Request 命令用于接受一个新的 BR/EDR 连接请求。

这列适合用来快速判断:

这个命令是干什么的 这个事件表示什么事情发生了 它大概属于连接、认证、加密、广播、扫描还是数据传输

但是它只是摘要,不能只看这一列就认为自己掌握了命令。


2.4 BR/EDR:经典蓝牙支持要求

这一列表示该命令或事件对于BR/EDR Controller的支持要求。

BR/EDR 就是经典蓝牙,比如:

SPP A2DP HFP HID Classic 传统蓝牙音频

2.5 LE:低功耗蓝牙支持要求

这一列表示该命令或事件对于LE Controller的支持要求。

LE 就是 BLE,例如:

BLE 广播 BLE 扫描 BLE 连接 BLE GATT 通信 BLE PHY BLE Extended Advertising BLE Periodic Advertising

你现在主要学习 BLE,所以看 Table 3.1 时,重点应该看:

Name Vers. Summary Description LE

BR/EDR 那一列可以先弱化,除非你要研究经典蓝牙。


3. Table 3.1 里面 M、O、E、C.xxx 怎么理解

表格中的 BR/EDR 和 LE 两列不是随便写的,它们表示 Controller 对这个命令或事件的支持要求。

常见标记大致可以这样理解:

M:Mandatory,强制支持 O:Optional,可选支持 E:Excluded,不适用 / 不要求支持 C.xxx:Conditional,条件支持

3.1 M:Mandatory,强制支持

如果某个命令在 LE 列是:

M

表示:

LE Controller 必须支持这个命令或事件。

也就是说,只要它是符合要求的 LE Controller,就应该支持。


3.2 O:Optional,可选支持

如果某个命令在 LE 列是:

O

表示:

这个命令或事件是可选支持的。

Controller 可以支持,也可以不支持。

所以 Host 在使用这类命令前,通常要先查询 Controller 能力。

常见查询命令包括:

HCI_Read_Local_Supported_Commands HCI_Read_Local_Supported_Features HCI_LE_Read_Local_Supported_Features

3.3 E:Excluded,不适用

如果某个命令在 LE 列是:

E

一般表示这个命令或事件不适用于 LE Controller。

例如截图中:

Accept Connection Request command

这个命令是经典蓝牙 BR/EDR 的连接接受命令,所以它在 BR/EDR 列可能是M,但在 LE 列是E

意思是:

这是 BR/EDR 体系的命令,不是 BLE 连接使用的命令。

BLE 建立连接不是用这个命令,而是看 LE 相关命令,例如:

HCI_LE_Create_Connection HCI_LE_Extended_Create_Connection

3.4 C.xxx:Conditional,条件支持

如果某个命令或事件写的是:

C.134 C.155 C.101

这种表示:

条件支持

也就是说,这个命令或事件是否需要支持,要看某个条件是否成立。

例如:

如果 Controller 支持某个 Feature 如果 Controller 支持某种传输类型 如果 Controller 支持某种链路状态 如果 Controller 支持某个相关命令

具体C.134C.155C.101分别对应什么条件,需要去看规范里专门的条件说明表。

不要把C.xxx当成版本号,它不是版本号,而是条件编号。


4. Table 3.1 应该怎么查看

你不需要从头到尾把 Table 3.1 全部截图下来,也不建议逐行硬读。

这张表非常长,按字母顺序列出所有 HCI Command 和 Event,里面同时包含 BR/EDR 和 LE 内容。

正确的看法是:


4.1 先用浏览器搜索关键字

因为你现在主要学习 BLE,所以可以在网页中直接搜索:

HCI_LE_

或者搜索具体关键字:

Advertising Scanning Connection PHY Data Length Periodic Extended

例如你想看广播相关命令,就搜索:

Advertising

想看扫描相关命令,就搜索:

Scan

想看连接相关命令,就搜索:

Create Connection Connection Update Terminate

4.2 优先看 HCI_LE_ 开头的命令和事件

BLE 相关命令和事件大多以:

HCI_LE_

开头。

例如:

HCI_LE_Set_Advertising_Parameters command HCI_LE_Set_Advertising_Data command HCI_LE_Set_Scan_Response_Data command HCI_LE_Set_Advertising_Enable command HCI_LE_Set_Scan_Parameters command HCI_LE_Set_Scan_Enable command HCI_LE_Create_Connection command HCI_LE_Advertising_Report event HCI_LE_Connection_Complete event

对于 BLE 学习来说,这些才是重点。


4.3 不要只看 Table 3.1,要点击命令详情

Table 3.1 只是目录。

真正重要的是每个命令的详细说明。

例如你看到:

HCI_LE_Set_Advertising_Parameters command

应该点进去看:

Command Parameters Return Parameters Generated Events Description Error Codes

也就是重点看:

这个命令有哪些参数 每个参数是什么意思 参数之间有什么限制 命令成功后返回什么事件 失败时可能返回什么错误码 这个命令会影响 Controller 的什么行为

4.4 看 Table 3.1 时重点看 LE 列

你现在的目标是掌握 BLE,所以看表时可以这样处理:

BR/EDR 列:先忽略 LE 列:重点看

如果 LE 列是:

E

表示它基本不是 BLE 重点。

如果 LE 列是:

M O C.xxx

才值得进一步判断它和 BLE 的关系。


4.5 可以按 BLE 场景分组查看

不要按 Table 3.1 的字母顺序学习,而应该按 BLE 场景学习。

推荐顺序:

广播 Advertising 扫描 Scanning 连接 Connection 断开 Disconnection 连接参数 Connection Parameters 数据收发 ACL Data PHY Data Length Filter Accept List Resolving List Extended Advertising Periodic Advertising

这样比从 A 到 Z 看 Table 3.1 更容易建立知识体系。


5. 3.1 LE Controller requirements 想表达什么

这一节开始讲:

LE Controller 对某些命令和事件的支持要求

其中截图中重点是:

3.1.1 Legacy and extended advertising

也就是:

Legacy Advertising 和 Extended Advertising 的命令/事件对应关系

6. Legacy Advertising 和 Extended Advertising 的关系

BLE 广播大致可以分成两套:

Legacy Advertising Extended Advertising

6.1 Legacy Advertising

Legacy Advertising 是早期 BLE 广播方式。

常见 HCI 命令包括:

HCI_LE_Set_Advertising_Parameters HCI_LE_Set_Advertising_Data HCI_LE_Set_Scan_Response_Data HCI_LE_Set_Advertising_Enable

它的典型特点是:

广播数据较短 传统广播包最多 31 字节 Advertising Data 扫描响应数据最多 31 字节 使用 legacy advertising PDU

你之前学习的 BLE Legacy 广播基本就是这一套命令。


6.2 Extended Advertising

Extended Advertising 是 Bluetooth 5.0 引入的扩展广播机制。

常见 HCI 命令包括:

HCI_LE_Set_Extended_Advertising_Parameters HCI_LE_Set_Extended_Advertising_Data HCI_LE_Set_Extended_Scan_Response_Data HCI_LE_Set_Extended_Advertising_Enable

它的特点是:

支持更大的广播数据 支持多个 Advertising Set 支持主广播信道和辅助广播信道 支持更多 PHY 选择 可以配合 Periodic Advertising 使用

7. Table 3.2 是什么

Table 3.2 是:

Legacy and extended advertising commands and events

也就是:

Legacy Advertising 命令/事件 和 Extended Advertising 命令/事件 的对应表

它告诉你:

旧广播命令 对应 哪个扩展广播命令 旧广播事件 对应 哪个扩展广播事件

例如:

HCI_LE_Advertising_Report event 对应 HCI_LE_Extended_Advertising_Report event
HCI_LE_Set_Advertising_Parameters command 对应 HCI_LE_Set_Extended_Advertising_Parameters command
HCI_LE_Set_Advertising_Data command 对应 HCI_LE_Set_Extended_Advertising_Data command
HCI_LE_Set_Scan_Response_Data command 对应 HCI_LE_Set_Extended_Scan_Response_Data command
HCI_LE_Set_Advertising_Enable command 对应 HCI_LE_Set_Extended_Advertising_Enable command
HCI_LE_Set_Scan_Parameters command 对应 HCI_LE_Set_Extended_Scan_Parameters command
HCI_LE_Set_Scan_Enable command 对应 HCI_LE_Set_Extended_Scan_Enable command
HCI_LE_Create_Connection command 对应 HCI_LE_Extended_Create_Connection command

这张表很有用,因为它帮你把 Legacy BLE 和 Extended BLE 的 HCI 命令对应起来了。


8. 表中 none 是什么意思

Table 3.2 中有很多地方写:

none

意思是:

没有对应的 legacy 命令

或者:

没有对应的 extended 命令

例如扩展广播中有一些新能力,Legacy Advertising 本身没有,所以左边就是none

例如:

HCI_LE_Read_Maximum_Advertising_Data_Length HCI_LE_Read_Number_of_Supported_Advertising_Sets HCI_LE_Remove_Advertising_Set HCI_LE_Clear_Advertising_Sets HCI_LE_Set_Periodic_Advertising_Parameters HCI_LE_Set_Periodic_Advertising_Data HCI_LE_Set_Periodic_Advertising_Enable

这些是扩展广播或周期广播相关能力,Legacy Advertising 中没有对应命令。

所以表中左边是:

none

9. Legacy 和 Extended Advertising 不能随便混用

截图中这段非常关键:

If, since the last power-on or reset, the Host has ever issued a legacy advertising command and then issues an extended advertising command, or has ever issued an extended advertising command and then issues a legacy advertising command, the Controller shall return the error code Command Disallowed (0x0C).

意思是:

从上次上电或 Reset 之后,如果 Host 已经使用过 Legacy Advertising 命令,然后又使用 Extended Advertising 命令,或者反过来先用了 Extended Advertising 命令又使用 Legacy Advertising 命令,Controller 应该返回 Command Disallowed,错误码是 0x0C。

也就是:

同一个 Controller 在一次上电/Reset 周期内,不应该混用 legacy advertising 命令集和 extended advertising 命令集。

可以理解为:

要么使用 Legacy Advertising 命令体系 要么使用 Extended Advertising 命令体系 不要混着用

例如下面这种流程有问题:

HCI_LE_Set_Advertising_Parameters HCI_LE_Set_Advertising_Data HCI_LE_Set_Advertising_Enable HCI_LE_Set_Extended_Advertising_Parameters

因为前面已经用了 legacy advertising 命令,后面又用了 extended advertising 命令。

反过来也一样有问题:

HCI_LE_Set_Extended_Advertising_Parameters HCI_LE_Set_Extended_Advertising_Data HCI_LE_Set_Extended_Advertising_Enable HCI_LE_Set_Advertising_Parameters

10. Host 不应该向支持 Extended Advertising 的 Controller 发送 legacy advertising 命令

截图中还有一句:

A Host should not issue legacy commands to a Controller that supports the LE Feature (Extended Advertising).

意思是:

如果 Controller 支持 Extended Advertising 特性,Host 不应该再向它发送 legacy advertising 命令。

这个规则体现的是规范倾向:

新 Controller 支持扩展广播时,Host 应该优先使用扩展广播命令体系。

因为 Extended Advertising 命令体系覆盖能力更强,也能表达更多广播配置。

不过在实际系统里,手机系统或蓝牙协议栈可能会根据兼容性策略选择使用 legacy 或 extended 命令。作为阅读规范时的理解,应以规范规则为主:

不要在同一个上电/Reset 周期内混用 legacy advertising 和 extended advertising 命令体系。

11. 3.2 Underlying Support 想表达什么

Underlying Support可以理解为:

底层能力支持

这一节想表达的是:

如果 Controller 声称支持某个 HCI 命令或事件,那么这个命令/事件背后依赖的底层功能也必须真正被支持。

不能出现这种情况:

表面上说支持某个 HCI Command 但实际底层功能不完整

例如:

Controller 声称支持 Read RSSI command 但底层根本不能获取这个连接的 RSSI

这种就不符合要求。


12. 命令支持不只是“命令能返回”,还要底层功能真的可用

规范强调:

if a command or event is supported by a Controller then the feature underlying the command or event shall also be fully supported.

意思是:

如果 Controller 支持某个命令或事件,那么该命令或事件背后的功能也必须完整支持。

这句话很重要。

因为有些厂商实现可能会出现:

命令表里显示支持 但实际用起来返回错误 或者返回无效数据 或者功能不完整

规范的要求是:

只要你声明支持,就要真的支持它背后的功能。

13. Table 3.3 是什么

Table 3.3 是:

Commands and events that have separate requirements for each transport

也就是:

对不同 transport 有单独支持要求的命令和事件

这里的 transport 不是 UART/USB/SDIO,而是指 Controller 支持的蓝牙传输类型,例如:

BR/EDR LE

有些命令或事件同时可能用于 BR/EDR 和 LE 连接,但在不同 transport 上支持要求可能不同。

例如截图中 Table 3.3 有:

HCI_Read_Remote_Version_Information command HCI_Read_RSSI command HCI_Read_Transmit_Power_Level command HCI_Encryption_Change event

这些命令或事件可能跟某个连接句柄Connection_Handle有关。

那么问题来了:

这个 Connection_Handle 是 BR/EDR 连接的? 还是 LE 连接的?

不同连接类型下,支持要求可能要分别判断。


14. Connection_Handle 参数为什么重要

规范中特别提到:

Connection_Handle Handle

因为很多 HCI 命令不是针对整个 Controller,而是针对某一条连接。

例如:

HCI_Read_RSSI HCI_Read_Remote_Version_Information HCI_Read_Transmit_Power_Level

这些命令通常需要传入:

Connection_Handle

也就是告诉 Controller:

我要读取哪一条连接的信息

如果这个连接是 BR/EDR 连接,就要看 Controller 对 BR/EDR transport 的支持要求。

如果这个连接是 LE 连接,就要看 Controller 对 LE transport 的支持要求。


15. 如果不支持某个 transport 上的底层功能,会怎样

截图中说:

如果某个命令带有 Handle 或 Connection_Handle 参数,而 Host 传入的是某个 transport 上的连接,但是 Controller 不支持这个 transport 上的底层功能,那么 Controller 应该返回:

Unsupported Feature or Parameter Value

错误码是:

0x11

例如:

Host 对一个 LE Connection_Handle 发送某个命令 但是 Controller 只支持该命令在 BR/EDR 连接上使用 不支持在 LE 连接上使用

那么 Controller 应该返回:

Unsupported Feature or Parameter Value (0x11)

对于事件也是类似:

如果 Controller 不支持某个 transport 上的对应功能 就不应该生成这个 transport 上对应的事件

16. 3.3 Feature Exchange 想表达什么

Feature Exchange是:

特性交换

这一节讲的是:

某些带有 Connection_Handle 参数的命令,在执行真正操作前,Controller 可能需要先和对端设备进行 feature exchange,用来确认对端是否支持某个必要功能。


17. 为什么需要 Feature Exchange

蓝牙通信不是只看本机支持什么,还要看对端设备支持什么。

一个功能能不能用,通常取决于:

本机 Host 是否支持 本机 Controller 是否支持 对端 Controller 是否支持 当前连接状态是否允许

例如本机想执行某个连接上的操作,但这个操作需要对端也支持某个特性。

这时 Controller 可能要先和对端设备交换特性信息。


18. Feature Exchange 和 HCI Command Status 的关系

截图中说:

如果某个命令:

有 Connection_Handle 参数 返回 HCI_Command_Status event 后面还有 completion event 命令本身的规范没有提到 feature exchange

那么这个命令在执行其他流程之前,可能会先进行 feature exchange。

意思是:

Host 发出命令后,Controller 先通过 HCI_Command_Status 告诉 Host:命令已接收,开始处理。 然后 Controller 可能先和对端做 feature exchange。 确认对端支持必要功能后,再继续执行真正操作。 最后通过完成事件告诉 Host 结果。

流程可以理解为:

Host ↓ 发送某个带 Connection_Handle 的 HCI Command ↓ Controller ↓ 返回 HCI_Command_Status ↓ Controller 与对端设备进行 Feature Exchange ↓ 确认对端是否支持必要特性 ↓ 执行后续过程 ↓ 通过 completion event 上报最终结果

19. 这部分的关键信息总结

19.1 HCI Command 和 Event 是 Host 与 Controller 之间的交互

Command:Host 控制 Controller Event:Controller 通知 Host

这一节就是在说明这些命令和事件的总览表以及支持规则。


19.2 Table 3.1 是 HCI 命令和事件的总目录

Table 3.1 按字母顺序列出所有 HCI Command 和 Event。

它不是学习顺序表,而是查阅表。

学习 BLE 时,不建议从 A 到 Z 逐个看,而应该按 BLE 场景查。


19.3 Vers. 表示命令/事件首次出现的规范版本

例如:

4.0 4.1 5.0 5.1

表示这个命令或事件从哪个 Bluetooth Core Specification 版本开始定义。


19.4 BR/EDR 和 LE 列表示支持要求

常见标记含义:

M:强制支持 O:可选支持 E:不适用 / 排除 C.xxx:条件支持

对于 BLE 学习,重点看 LE 列。


19.5 Table 3.2 说明 Legacy Advertising 和 Extended Advertising 的对应关系

这张表很适合用来建立广播命令体系:

Legacy Advertising command/event ↓ Extended Advertising command/event

尤其是这些对应关系:

Set Advertising Parameters ↓ Set Extended Advertising Parameters Set Advertising Data ↓ Set Extended Advertising Data Set Scan Response Data ↓ Set Extended Scan Response Data Set Advertising Enable ↓ Set Extended Advertising Enable Set Scan Parameters ↓ Set Extended Scan Parameters Set Scan Enable ↓ Set Extended Scan Enable Create Connection ↓ Extended Create Connection

19.6 Legacy 和 Extended Advertising 命令不应该混用

从上次上电或 Reset 之后:

用了 legacy advertising 命令,就不要再用 extended advertising 命令 用了 extended advertising 命令,就不要再用 legacy advertising 命令

否则 Controller 应该返回:

Command Disallowed 0x0C

19.7 Underlying Support 强调“声明支持就要真的支持”

Controller 不能只是表面支持某个命令。

如果支持命令,就要支持它背后的底层能力。


19.8 带 Connection_Handle 的命令要注意连接类型

同一个命令可能对 BR/EDR 连接支持,对 LE 连接不支持。

因此要看:

这个 Connection_Handle 属于 BR/EDR 连接 还是 LE 连接

如果 Host 对不支持的连接类型使用命令,Controller 应返回:

Unsupported Feature or Parameter Value 0x11

19.9 Feature Exchange 是确认对端是否支持某功能

有些连接相关命令在真正执行前,Controller 可能先和对端设备做 feature exchange。

目的就是确认:

对端设备是否支持这个命令背后需要的功能

20. 对 BLE 学习的实际指导

这一节不用完整背下来,但要知道它的用途。

它的价值主要有三个:

查命令 看支持要求 理解 legacy / extended 命令体系关系

学习 BLE 时,可以这样使用:

1. 先确定自己要研究的 BLE 场景 2. 在 Table 3.1 中搜索相关命令或事件 3. 看 LE 列的支持要求 4. 点击命令名称进入详细定义 5. 再结合 Section 7 的命令详情看参数、返回值和事件

例如研究 BLE Legacy 广播:

HCI_LE_Set_Advertising_Parameters HCI_LE_Set_Advertising_Data HCI_LE_Set_Scan_Response_Data HCI_LE_Set_Advertising_Enable HCI_LE_Advertising_Report

研究 BLE 扫描:

HCI_LE_Set_Scan_Parameters HCI_LE_Set_Scan_Enable HCI_LE_Advertising_Report

研究 BLE 连接:

HCI_LE_Create_Connection HCI_LE_Connection_Complete HCI_Disconnection_Complete HCI_LE_Connection_Update

研究扩展广播:

HCI_LE_Set_Extended_Advertising_Parameters HCI_LE_Set_Extended_Advertising_Data HCI_LE_Set_Extended_Scan_Response_Data HCI_LE_Set_Extended_Advertising_Enable HCI_LE_Extended_Advertising_Report

所以这一节不是让你把所有命令都读完,而是告诉你:

HCI 命令和事件在哪里查 表格里的支持要求怎么看 Legacy 和 Extended 命令如何对应 Controller 支持能力要如何判断