BLE HCI解析

194 阅读27分钟

概念

HCI 层是在蓝牙协议栈中的主机 (Host) 和控制器 (Controller) 之间传输命令、事件和数据的标准接口。它定义了一套标准化的命令、事件与数据传输机制,使得上层应用可以通过统一接口控制蓝牙硬件,而无需关心芯片厂商的底层实现细节。

在 Linux 蓝牙协议栈中,HCI 层通过 AF_BLUETOOTH 类型的 raw socket 与内核蓝牙子系统交互。用户空间程序通过该 socket 发送 HCI 命令(如设置广播参数、发起连接),并接收来自内核的 HCI 事件(如连接完成、断开通知)。收到事件后,HCI 层会进行解包和解析,并将结果交给上层协议栈或应用程序处理。

架构层次

+------------------+     ← Application
| GATT / ATT       |
+------------------+     ← Host
| L2CAP            |
+------------------+
| HCI              |
+------------------+     ← Controller
| Link Layer (LL)  |
| Physical Layer   |
+------------------+

数据包格式

HCI包有三种类型

  • 命令包 (Command Packet)
  • 事件包 (Event Packet)
  • 异步数据包 (Asynchronous Data Packet)
+--------------------------+----------------------------------+
| Packet Type Indicator (1)|           Packet Data            |
|          (Byte)          |             (Variable)           |
+--------------------------+----------------------------------+

Packet Type Indicator (包类型指示符):

  • 0x01: HCI 命令包 (HCI Command Packet)
  • 0x02: HCI 异步数据包 (HCI ACL Data Packet)
  • 0x03: HCI 同步数据包 (HCI Synchronous Data Packet) - 在 BLE 中不使用
  • 0x04: HCI 事件包 (HCI Event Packet)

HCI 命令包 (HCI Command Packet)

由主机发送给控制器,用于请求执行特定操作

┌─────────────┬───────────────┬──────────────┬─────────────────────┐
│ Packet Type │ Opcode (2B)   │ Param Length │ Parameters (N Bytes)│
│   0x01      │               │   1 Byte     │                     │
└─────────────┴───────────────┴──────────────┴─────────────────────┘

Length表示后续 Parameters 区域的长度,不包括 Packet Type、Opcode、本身

Opcode分为两部分


                         +-----------------+-----------------+
                         |      OGF (6)    |      OCF (10)   |
                         |      (Bits)     |      (Bits)     |
                         +-----------------+-----------------+`
  • OGF:6位,定义命令的组
  • OCF:10位,定义组内的具体命令

HCI 命令组 (OGF - Opcode Group Field)

OGF (十六进制)OGF (二进制)命令组名称 (Group Name)描述
0x01000001Link Control Commands链路控制命令:管理设备间的连接、认证和加密。
0x02000010Link Policy Commands链路策略命令:管理电源模式和角色切换。
0x03000011Controller & Baseband Commands控制器与基带命令:控制蓝牙控制器、读取状态和版本信息。
0x04000100Informational Parameters信息参数命令:读取控制器的静态信息,如蓝牙地址。
0x05000101Status Parameters状态参数命令:读取动态变化的状态信息,如RSSI。
0x06000110Testing Commands测试命令:用于设备在生产和认证期间的测试。
0x08001000LE Controller Commands低功耗 (LE) 控制器命令:所有BLE专用功能的核心命令。
0x3F111111Vendor Specific Commands厂商自定义命令:供芯片制造商实现其私有功能。

HCI 具体命令 (OCF - Opcode Command Field)

OGF = 0x01: Link Control Commands (链路控制命令)
OCF (十六进制)命令名称功能描述
0x0001HCI_Inquiry搜索周边的BR/EDR设备。
0x0002HCI_Inquiry_Cancel取消当前的Inquiry过程。
0x0005HCI_Create_Connection创建一个到BR/EDR设备的ACL连接。
0x0006HCI_Disconnect断开一个已存在的连接。
0x0009HCI_Accept_Connection_Request接受一个传入的连接请求。
0x000AHCI_Reject_Connection_Request拒绝一个传入的连接请求。
0x0011HCI_Authentication_Requested启动对指定连接的认证(配对)过程。
0x0019HCI_Set_Connection_Encryption对指定的连接启用或禁用链路层加密。
0x001DHCI_Remote_Name_Request请求获取远端设备的名称。
OGF = 0x03: Controller & Baseband Commands (控制器与基带命令)
OCF (十六进制)命令名称功能描述
0x0001HCI_Set_Event_Mask设置控制器应向主机上报哪些事件(不含LE事件)。
0x0003HCI_Reset(常用) 复位控制器和HCI层,所有状态恢复到默认值。
0x001AHCI_Read_Local_Name读取本地设备的名称。
0x001CHCI_Write_Local_Name设置本地设备的名称。
0x0033HCI_Write_Class_of_Device设置本设备的设备类型(Class of Device, CoD)。
0x003AHCI_Host_Buffer_Size(主机->控制器)通知控制器主机的缓冲区大小。
0x003BHCI_Host_Number_Of_Completed_Packets(主机->控制器)通知控制器主机已处理完多少个数据包。
0x0063HCI_Set_Event_Mask_Page_2设置事件掩码的第二页。
0x006DHCI_Write_LE_Host_Support开启/关闭 LE 支持标志

HCI_Set_Event_Mask

与LE_Set_Event_Mask一样,它的参数也是一个64位的位掩码。每一位对应一个或多个经典蓝牙的HCI事件

些最基础的HCI事件是永远不能被这个掩码屏蔽掉的

  • Command Complete Event (0x0E)
  • Command Status Event (0x0F)
  • Hardware Error Event (0x10)
  • Number Of Completed Packets Event (0x13) (为了保证流控正常工作)
OGF = 0x04: Informational Parameters (信息参数命令)
OCF (十六进制)命令名称功能描述返回
0x0001HCI_Read_Local_Version_Information(常用) 读取本地控制器的版本信息,如HCI版本、LMP版本。****
0x0002HCI_Read_Local_Supported_Commands读取控制器支持的所有HCI命令。
0x0003HCI_Read_Local_Supported_Features读取控制器支持的本地特性(如加密、跳频等)。
0x0005HCI_Read_Buffer_Size读取控制器的ACL和SCO数据包缓冲区大小。+ ACL_Data_Packet_Length ACL 数据包最大长度(单位:字节)
+ SCO_Data_Packet_Length:SCO 数据包最大长度
+ Total_Num_ACL_Data_Packets:ACL 数据包缓冲区数量
+ Total_Num_SCO_Data_Packets:SCO 数据包缓冲区数量
0x0009HCI_Read_BD_ADDR(常用) 读取本设备的蓝牙地址(BD_ADDR)。****
OGF = 0x05: Status Parameters (状态参数命令)
OCF (十六进制)命令名称功能描述
0x0003HCI_Read_Link_Quality读取指定连接的链路质量。
0x0005HCI_Read_RSSI读取指定连接句柄的RSSI(接收信号强度指示)。
OGF = 0x08: LE Controller Commands (低功耗控制器命令)
1. 通用与设置 (General & Setup)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)返回
0x0001LE_Set_Event_Mask(核心) 设置控制器需要上报的LE相关事件。****
0x0002LE_Read_Buffer_Size读取LE数据包的缓冲区大小和总数。+ Status 1B
+ LE_ACL_Data_Packet_Length 2B 描述单个 LE ACL 包(不含 HCI 4B ACL 头)的最大数据负载长度
+ Total_Num_LE_ACL_Data_Packets 表示 Controller 内部 LE 接收队列容量(以包为单位)
0x0003LE_Read_Local_Supported_Features读取控制器支持的LE特性。
0x0005LE_Set_Random_Address设置控制器要使用的静态随机地址或非可解析私有地址。

LE_Set_Event_Mask 事件掩码位

这个命令只有一个参数:一个64位的位掩码(bitmask)。这个掩码的每一位都对应着一个特定的 LE Meta Event 的子事件

要让 LE 事件真正上报,还需要在 主事件掩码(Set_Event_Mask) 中打开 LE Meta Event 位,否则即使 LE_Event_Mask 配好了,也不会有任何 LE 事件上来

  • 如果某一位被设置为 1,表示主机希望接收对应的事件。
  • 如果某一位被设置为 0,表示主机不关心对应的事件,控制器将不会上报它。
位 (Bit)掩码值 (Hex)控制的 LE Meta Subevent (事件码 0x3E 的子事件)功能描述
00x0000000000000001LE Connection Complete (Subevent 0x01)连接建立成功或失败。
10x0000000000000002LE Advertising Report (Subevent 0x02)扫描时发现了广播设备。
20x0000000000000004LE Connection Update Complete (Subevent 0x03)连接参数更新完成。
30x0000000000000008LE Read Remote Features Complete (Subevent 0x04)读取远端设备支持的特性完成。
40x0000000000000010LE Long Term Key Request (Subevent 0x05)控制器请求主机提供长期密钥(LTK)。
50x0000000000000020LE Remote Connection Parameter Request (Subevent 0x06)远端设备请求更新连接参数。
60x0000000000000040LE Data Length Change (Subevent 0x07)连接的数据长度(DLE)发生改变。
70x0000000000000080LE Read Local P-256 Public Key Complete (Subevent 0x08)读取本地P-256公钥完成。
80x0000000000000100LE Generate DHKey Complete (Subevent 0x09)生成DHKey完成。
90x0000000000000200LE Enhanced Connection Complete (Subevent 0x0A)增强型连接建立完成。
100x0000000000000400LE Directed Advertising Report (Subevent 0x0B)发现了定向广播设备。
110x0000000000000800LE PHY Update Complete (Subevent 0x0C)连接的物理层(PHY)更新完成。
120x0000000000001000LE Extended Advertising Report (Subevent 0x0D)发现了扩展广播设备。
130x0000000000002000LE Periodic Advertising Sync Established (Subevent 0x0E)与周期性广播建立同步。
140x0000000000004000LE Periodic Advertising Report (Subevent 0x0F)收到了周期性广播的数据。
150x0000000000008000LE Periodic Advertising Sync Lost (Subevent 0x10)与周期性广播的同步丢失。
160x0000000000010000LE Scan Timeout (Subevent 0x11)扫描超时。
170x0000000000020000LE Advertising Set Terminated (Subevent 0x12)广播集终止。
180x0000000000040000LE Scan Request Received (Subevent 0x13)本地广播收到了扫描请求。
190x0000000000080000LE Channel Selection Algorithm (Subevent 0x14)通知主机连接使用了何种信道选择算法。
200x0000000000100000LE Connectionless IQ Report (Subevent 0x15)(AoA/AoD)上报无连接IQ采样报告。
210x0000000000200000LE Connection IQ Report (Subevent 0x16)(AoA/AoD)上报面向连接IQ采样报告。
220x0000000000400000LE CTE Request Failed (Subevent 0x17)(AoA/AoD)CTE请求失败。
230x0000000000800000LE Periodic Advertising Sync Transfer Received (Subevent 0x18)收到周期性广播同步转移信息。
240x0000000001000000LE CIS Established (Subevent 0x19)(LE Audio)已建立一个CIS(连接同步流)。
250x0000000002000000LE CIS Request (Subevent 0x1A)(LE Audio)收到一个CIS请求。
260x0000000004000000LE Create BIG Complete (Subevent 0x1B)(LE Audio)创建一个BIG(广播同步组)完成。
270x0000000008000000LE Terminate BIG Complete (Subevent 0x1C)(LE Audio)终止一个BIG完成。
280x0000000010000000LE BIG Sync Established (Subevent 0x1D)(LE Audio)与一个BIG建立同步。
290x0000000020000000LE BIG Sync Lost (Subevent 0x1E)(LE Audio)与一个BIG的同步丢失。
300x0000000040000000LE Request Peer SCA Complete (Subevent 0x1F)(LE Audio)请求对端SCA(睡眠时钟精度)完成。
310x0000000080000000LE Path Loss Threshold (Subevent 0x20)路径损耗超过阈值。
320x0000000100000000LE Transmit Power Reporting (Subevent 0x21)发射功率报告。
330x0000000200000000LE BIGInfo Advertising Report (Subevent 0x22)(LE Audio)收到了一个包含BIGInfo的广播报告。
34-63-Reserved for Future Use保留以备将来使用。
2. 传统广播与扫描 (Legacy Advertising & Scanning - BLE 4.x)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x0006LE_Set_Advertising_Parameters(核心) 设置传统广播的参数(广播间隔、类型、信道等)。
0x0007LE_Read_Advertising_Channel_Tx_Power读取广播信道的发射功率。
0x0008LE_Set_Advertising_Data(核心) 设置传统广播的广播负载数据(最多31字节)。
0x0009LE_Set_Scan_Response_Data(核心) 设置传统广播的扫描响应数据(最多31字节)。
0x000ALE_Set_Advertise_Enable(核心) 启用或禁用传统广播。
0x000BLE_Set_Scan_Parameters(核心) 设置传统扫描的参数(主动/被动、扫描窗口/间隔)。
0x000CLE_Set_Scan_Enable(核心) 启用或禁用传统扫描。
3. 连接与白名单 (Connection & White List)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x000DLE_Create_Connection(核心) 使用传统广播参数创建一个LE连接。
0x000ELE_Create_Connection_Cancel取消正在进行的 LE_Create_Connection 操作。
0x000FLE_Read_White_List_Size读取白名单中可以存储的条目总数。
0x0010LE_Clear_White_List清空白名单中的所有设备。
0x0011LE_Add_Device_To_White_List向白名单中添加一个设备。
0x0012LE_Remove_Device_From_White_List从白名单中移除一个设备。
4. 连接后管理与安全 (Post-Connection Management & Security)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x0013LE_Connection_Update(主设备)发起一个连接参数更新请求。
0x0014LE_Set_Host_Channel_Classification(主设备)设置要使用的信道图(用于跳频)。
0x0015LE_Read_Channel_Map(主从均可)读取指定连接正在使用的信道图。
0x0016LE_Read_Remote_Features读取远端设备支持的LE特性。
0x0017LE_Encrypt使用给定的密钥和明文数据,请求控制器进行AES-128加密。
0x0018LE_Rand请求控制器生成一个128位的随机数。
0x0019LE_Start_Encryption(主设备)在一个已建立的LE连接上启动加密。
0x001ALE_Long_Term_Key_Request_Reply(安全核心) 对控制器请求LTK的事件进行肯定回复(提供LTK)。
0x001BLE_Long_Term_Key_Request_Negative_Reply(安全核心) 对控制器请求LTK的事件进行否定回复。
0x0020LE_Remote_Connection_Parameter_Request_Reply同意由远端设备发起的连接参数更新请求。
0x0021LE_Remote_Connection_Parameter_Request_Negative_Reply拒绝由远端设备发起的连接参数更新请求。
5. 数据长度扩展 (Data Length Extension - DLE - BLE 4.2)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x0022LE_Set_Data_Length设置连接的数据包有效负载长度和时间。
0x0023LE_Read_Suggested_Default_Data_Length读取控制器建议的默认数据长度值。
0x0024LE_Write_Suggested_Default_Data_Length向控制器写入建议的默认数据长度值。
6. 安全连接与隐私 (Secure Connections & Privacy - BLE 4.2 / 5.0)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x0025LE_Read_Local_P-256_Public_Key读取本地设备生成的用于安全连接的P-256公钥。
0x0026LE_Generate_DHKey[V1] 基于本地私钥和远端公钥生成Diffie-Hellman密钥。
0x0027LE_Add_Device_To_Resolving_List向可解析列表中添加一个设备(用于解析RPA)。
0x0028LE_Remove_Device_From_Resolving_List从可解析列表中移除一个设备。
0x0029LE_Clear_Resolving_List清空可解析列表。
0x002ALE_Read_Resolving_List_Size读取可解析列表的大小。
0x002BLE_Read_Peer_Resolvable_Address读取对端设备在可解析列表中的可解析私有地址(RPA)。
0x002CLE_Read_Local_Resolvable_Address读取本地设备在可解析列表中的可解析私有地址(RPA)。
0x002DLE_Set_Address_Resolution_Enable启用或禁用地址解析功能。
0x002ELE_Set_Resolvable_Private_Address_Timeout设置可解析私有地址(RPA)的更新超时时间。
7. 物理层管理 (PHY Management - BLE 5.0)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x002FLE_Read_Maximum_Data_Length读取控制器支持的最大数据包负载长度和时间。
0x0030LE_Read_PHY读取当前连接使用的发射(TX)和接收(RX)物理层(1M, 2M, Coded)。
0x0031LE_Set_Default_PHY设置默认的物理层偏好。
0x0032LE_Set_PHY在一个已存在的连接上协商更改物理层。
8. 扩展广播 (Extended Advertising - BLE 5.0)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x0035LE_Set_Advertising_Set_Random_Address为指定的广播集设置随机地址。
0x0036LE_Set_Extended_Advertising_Parameters(核心) 设置扩展广播的参数(比传统广播更丰富)。
0x0037LE_Set_Extended_Advertising_Data(核心) 设置扩展广播的数据(可分片,最多1650字节)。
0x0038LE_Set_Extended_Scan_Response_Data(核心) 设置扩展广播的扫描响应数据。
0x0039LE_Set_Extended_Advertise_Enable(核心) 启用或禁用一个或多个扩展广播集。
0x003ALE_Read_Maximum_Advertising_Data_Length读取控制器支持的最大广播数据长度。
0x003BLE_Read_Number_of_Supported_Advertising_Sets读取控制器支持的广播集总数。
0x003CLE_Remove_Advertising_Set移除一个广播集。
0x003DLE_Clear_Advertising_Sets移除所有广播集。
9. 周期性广播 (Periodic Advertising - BLE 5.0)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x003ELE_Set_Periodic_Advertising_Parameters设置周期性广播的参数。
0x003FLE_Set_Periodic_Advertising_Data设置周期性广播的数据。
0x0040LE_Set_Periodic_Advertising_Enable启用或禁用周期性广播。
10. 扩展与周期性扫描和连接 (Extended & Periodic Scanning & Connection - BLE 5.0)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x0041LE_Set_Extended_Scan_Parameters设置扩展扫描的参数。
0x0042LE_Set_Extended_Scan_Enable启用或禁用扩展扫描。
0x0043LE_Extended_Create_Connection使用扩展扫描参数来创建连接。
0x0044LE_Periodic_Advertising_Create_Sync尝试与一个正在进行周期性广播的设备同步。
0x0045LE_Periodic_Advertising_Create_Sync_Cancel取消正在进行的同步过程。
0x0046LE_Periodic_Advertising_Terminate_Sync终止一个已建立的周期性广播同步。
0x0047LE_Add_Device_To_Periodic_Advertiser_List向周期性广播列表中添加一个设备。
0x0048LE_Remove_Device_From_Periodic_Advertiser_List从周期性广播列表中移除一个设备。
0x0049LE_Clear_Periodic_Advertiser_List清空周期性广播列表。
0x004ALE_Read_Periodic_Advertiser_List_Size读取周期性广播列表的大小。
11. 发射功率与路径损耗 (Transmit Power & Path Loss - BLE 5.1/5.2)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x004BLE_Read_Transmit_Power读取当前的最小/最大发射功率。
0x004CLE_Read_RF_Path_Compensation读取用于计算路径损耗的RF路径补偿值。
0x004DLE_Write_RF_Path_Compensation写入RF路径补偿值。
0x004ELE_Set_Privacy_Mode为列表中的特定设备设置隐私模式(网络隐私或设备隐私)。
0x004FLE_Read_Remote_Transmit_Power_Level读取远端设备在指定PHY上的发射功率。
0x0077LE_Set_Path_Loss_Reporting_Parameters设置路径损耗报告的参数。
0x0078LE_Set_Path_Loss_Reporting_Enable启用或禁用路径损耗报告。
0x0079LE_Set_Transmit_Power_Reporting_Enable启用或禁用远端和本地发射功率报告。
12. 连接定向通道 (Connection-Oriented Channels - L2CAP CoC - BLE 5.2)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x006ALE_Set_Host_Feature主机用来设置或清除控制器中某个支持的特性位。
13. 测试命令 (Testing Commands)
OCF (Hex)命令名称 (Command Name)功能描述 (Description)
0x001DLE_Receiver_Test进入LE接收机测试模式。
0x001ELE_Transmitter_Test进入LE发射机测试模式。
0x001FLE_Test_End结束当前的LE测试。
0x0033LE_Receiver_Test功能增强的接收机测试模式。
0x0034LE_Transmitter_Test功能增强的发射机测试模式。
0x0050LE_Generate_DHKey功能增强的DHKey生成命令。

HCI 事件包(HCI Event Packet)

由控制器发送给主机,用于通知已发生的事件或对某个命令的响应。

┌─────────────┬──────────────┬──────────────┬─────────────────────┐
│ Packet Type │ Event Code   │ Param Length │ Parameters (N Bytes)│
│   0x041 Byte     │   1 Byte     │                     │
└─────────────┴──────────────┴──────────────┴─────────────────────┘

EventCode 标准事件

Event Code (Hex)事件名称 (Event Name)功能描述 (Description)
0x01Inquiry CompleteBR/EDR的Inquiry过程完成。
0x02Inquiry ResultBR/EDR的Inquiry过程发现了一个设备。
0x03Connection Complete一个BR/EDR的ACL连接已建立。
0x04Connection Request收到一个远程设备发来的BR/EDR连接请求。
0x05Disconnection Complete(核心) 一个连接(BR/EDR或LE)已断开。
0x06Authentication CompleteBR/EDR的认证过程完成。
0x07Remote Name Request Complete获取远端设备名称的请求已完成。
0x08Encryption Change(核心) 连接的加密状态发生了变化(如加密启动或暂停)
0x09Change Connection Link Key Complete更改连接链路密钥的操作已完成。
0x0AMaster Link Key Complete主链路密钥交换过程完成。
0x0BRead Remote Supported Features Complete读取远端设备支持的特性列表已完成。
0x0CRead Remote Version Information Complete读取远端设备的版本信息已完成。
0x0DQoS Setup Complete服务质量(QoS)设置完成。
0x0ECommand Complete(****核心) 一个HCI命令已快速执行并完成,包含返回值。
0x0FCommand Status(核心) 一个耗时的HCI命令已被控制器接受,作为临时回执。
0x10Hardware Error控制器检测到硬件故障。
0x11Flush Occurred数据包因超时被控制器丢弃。
0x12Role Change设备在连接中的角色(主/从)发生了改变。
0x13Number Of Completed Packets(核心) (控制器→主机)用于流量控制,通知主机控制器已处理完多少数据包。
0x14Mode Change连接进入了不同的电源模式(如Sniff, Park)。
0x15Return Link Keys控制器返回存储的链路密钥。
0x16PIN Code Request(安全)控制器请求主机提供PIN码。
0x17Link Key Request(安全)控制器请求主机提供链路密钥。
0x18Link Key Notification控制器通知主机一个新的链路密钥。
0x19Loopback Command环回命令的返回数据。
0x1AData Buffer Overflow主机或控制器的数据缓冲区溢出。
0x1BMax Slots Change连接中可用的最大时隙数发生变化。
0x1CRead Clock Offset Complete读取时钟偏移量完成。
0x1DConnection Packet Type Changed连接的数据包类型已更改。
0x22Page Scan Repetition Mode Change页面扫描重复模式发生改变。
0x23Flow Specification Complete流量规范设置完成。
0x2CRead Remote Extended Features Complete读取远端设备支持的扩展特性完成。
0x3ELE Meta Event(BLE核心) 这是一个“容器”事件,所有LE相关的特定事件都封装在其中。
0xFFVendor Specific Event(厂商定制) 这是一个厂商自定义事件,其内容由芯片制造商定义。
Complete Event

Event Code: 0x0E

方向: Controller → Host

字段 (Field)长度 (Length)描述 (Description)
Event Code1 字节 (octet)事件类型码。对于“命令完成事件”,此值固定为 0x0E
Parameter Total Length1 字节 (octet)剩余所有字段的总字节数。其值为 1 + 2 + N
Num_HCI_Command_Packets1 字节 (octet)用于流量控制。告知主机(Host)控制器现在可以接收多少个新的HCI命令。
Command_OpCode2 字节 (octets)触发此事件的原始HCI命令的操作码(OpCode)。用于将事件与命令关联。采用小端字节序(Little-Endian)。
Return_ParametersN 字节 (octets)命令的返回值。其结构和长度(N)完全由 Command_OpCode 字段所对应的命令定义。第一个字节通常是状态码 (Status)

示例:

Host发
HCI Command:
  OpCode: 0x2002 (LE Read Buffer Size)
  Length: 0



Controller回

Event Code: 0x0E
Param Length: 7
Num_HCI_Command_Packets: 1
Command_OpCode: 0x2002
Return Parameters:
  Status: 0x00
  LE_ACL_Data_Packet_Length: 0x001B
  Total_Num_LE_ACL_Data_Packets: 0x0A

Status Event

Event Code: 0x0F

方向: Controller → Host

字段 (Field)长度 (Length)描述 (Description)
Event Code1 字节 (octet)事件类型码。对于“命令状态事件”,此值固定为 0x0F
Parameter Total Length1 字节 (octet)剩余字段的总长度。对于此事件,该值固定为 4 字节。
Status1 字节 (octet)命令接收状态。0x00 表示命令已被成功接受并正在处理 (Pending);非零值表示命令因格式或状态错误而被立即拒绝。
Num_HCI_Command_Packets1 字节 (octet)用于流量控制。告知主机(Host)控制器现在可以接收多少个新的HCI命令。
Command_OpCode2 字节 (octets)触发此事件的原始HCI命令的操作码(OpCode)。用于将事件与命令关联。采用小端字节序(Little-Endian)。

示例:

host发
HCI Command:
  OpCode: 0x200D (LE Create Connection)
  Length: 0x19
  Parameters: ...


Controller回
Event Code: 0x0F
Param Length: 4
Status: 0x00
Num_HCI_Command_Packets: 1
Command_OpCode: 0x200D

等建立连接成功后

Event Code: 0x3E (LE Meta Event)
Subevent: 0x01 (LE Connection Complete)
...

Subevent Code 子事件

当主机收到一个事件码为0x3E的包时,它必须检查其参数的第一个字节,即子事件码 (Subevent Code),来确定具体是哪一个LE事件。

子事件码 (Subevent Code)事件名称 (Event Name)功能描述 (Description)
0x01LE Connection Complete(核心) 一个LE连接已成功建立或失败。
0x02LE Advertising Report(核心) 上报一个或多个通过传统扫描发现的广播设备信息。
0x03LE Connection Update Complete一个LE连接的参数更新过程已完成。
0x04LE Read Remote Features Complete读取远端LE设备支持的特性列表已完成。
0x05LE Long Term Key Request(安全核心) 控制器请求主机提供长期密钥(LTK)来加密连接。
0x06LE Remote Connection Parameter Request(协商核心) 通知主机,远端设备请求更改连接参数。
0x07LE Data Length Change连接的数据包有效负载长度(DLE)已发生改变。
0x08LE Read Local P-256 Public Key Complete读取本地P-256公钥的操作完成。
0x09LE Generate DHKey Complete生成Diffie-Hellman密钥的操作完成。
0x0ALE Enhanced Connection Complete功能增强的连接完成事件,提供更多角色信息。
0x0BLE Directed Advertising Report上报一个通过定向广播发现的设备信息。
0x0CLE PHY Update Complete连接的物理层(PHY)更新协商已完成。
0x0DLE Extended Advertising Report(核心) 上报一个或多个通过扩展扫描发现的广播设备信息。
0x0ELE Periodic Advertising Sync Established与周期性广播成功建立同步。
0x0FLE Periodic Advertising Report上报一个通过同步接收到的周期性广播数据。
0x10LE Periodic Advertising Sync Lost与周期性广播的同步已丢失。
0x11LE Scan Timeout扫描在指定时间内未能发现任何设备而超时。
0x12LE Advertising Set Terminated一个广播集因为超时或连接建立而终止。
0x13LE Scan Request Received控制器收到了一个针对本地广播的扫描请求。
0x14LE Channel Selection Algorithm通知主机连接使用了哪种信道选择算法(#1或#2)。
0x15LE Connectionless IQ Report(AoA/AoD)上报一个无连接的IQ采样报告。
0x16LE Connection IQ Report(AoA/AoD)上报一个面向连接的IQ采样报告。
0x17LE CTE Request Failed(AoA/AoD)CTE(Constant Tone Extension)请求失败。
0x18LE Periodic Advertising Sync Transfer Received通过一个已建立的连接,收到了一个周期性广播的同步信息。
0x1BLE Path Loss Threshold路径损耗超过了设定的阈值。
0x1CLE Transmit Power Reporting上报本地或远端的发射功率等级。

HCI 异步数据包 (HCI ACL Data Packet)

用于在主机和控制器之间传输面向连接的异步 (Asynchronous Connection-Less, ACL) 数据。

ACL包负责传输业务数据,所有GATT的通知、读写等操作,最终都是封装在ACL包中的

包结构

┌─────────────┬──────────────┬──────────────┬─────────────────────┐
│ Packet Type │ Handle+Flags │ Data Length  │ Payload (N Bytes)   │
│   0x022 Bytes    │   2 Bytes    │                     │
└─────────────┴──────────────┴──────────────┴─────────────────────┘

[H4 Transport Layer - UART framing]
+--------------+-------------------------------------------------------+
| Packet Type  |                      HCI ACL Data Packet              |
|   (1 byte)   |                                                       |
+--------------+-------------------------------------------------------+

[HCI Layer - ACL Data Packet Header]
               +----------------+----------------+
               | Handle & Flags | Data Length(2) |
               |     (2 B)      |     (2 B)      |
               +----------------+----------------+

[L2CAP Layer - Signaling/Data Header]
               +----------------+----------------+
               | L2CAP Length   | Channel ID     |
               |   (2 B)        |    (2 B)       |
               +----------------+----------------+

[L2CAP Payload / Higher Layer]
               +---------------------------------+
               |   Protocol-specific Payload ... |
               |   (ATT, SDP, RFCOMM, etc.)      |
               +---------------------------------+


Header
  • Handle & Flags(2B)
    • Handle: bits 0–11,连接句柄,标识数据包所属的逻辑连接
    • PB Flag: bits 12–13(Packet Boundary)标志用于指示数据包是分片数据的开始还是延续
      • 00:后续分片
      • 01:起始分片
      • 10:完整、未分片
    • BC Flag: bits 14–15(Broadcast Flag,通常 00)
  • DataLength (2B)
    • HCI 层数据段长度(不含本字段与 Handle 字段)
    • 最大值由 ACL_Data_Packet_Length 决定
Payload

这部分就是真正要传输的数据。它通常是一个完整的 L2CAP 包,而L2CAP包内部又可能封装了 ATT、SMP或其他协议的数据。

如,一个L2CAP Packet

L2CAP Length2BL2CAP Payload 总长度(不含 L2CAP Header 自己的 4B)
L2CAP Channel ID2B指示该 PDU 属于哪个 L2CAP 信道
如 0x0004: ATT (GATT 协议)
L2CAP PayloadNB上层协议数据,如 ATT Request/Response等