BLE中的HCI指令结构和操作流程
HCI帧结构分析
分组
HCI支持四种类型的分组:
- 命令分组Command Packet
- 异步数据分组Asynchronous Data Packet
- 同步数据分组Synchronous Data Packet
- 事件分组Event Packe
分组类型是在HCI分组之前的一个字节值。 数据包类型具有以下值:
Packet | Packet Type |
---|---|
Command | 1 |
Asynchronous Data | 2 |
Synchronous Data | 3 |
Event | 4 |
分组固定位于HCI帧头,通过查看分组信息就能确认这一帧HCI是属于什么,比如命令帧固定01开头,事件帧04开头,数据帧以02/03开头。
Command包
根据蓝牙规范,指令包格式如上,其中主要分操作码OpCode,参数总长和参数实体。其中操作码分为OpCode组字段(OGF)和OpCode命令字段(OCF),组域(OGF)(最高有效位6比特) 命令域(OCF)(最低有效位10比特)。
OFG
-
Link Control Commands: 1
-
Link Policy Commands: 2
-
Controller and Baseband Commands: 3
-
Informational Parameters: 4
-
Status Parameters: 5
-
Testing Commands: 6
-
LE Only Commands: 8
OFG固定由上述内容组成,一般在BLE中,固定只使用8,由于OFG只有六位,所以和OCF组合后,高八位一般表现为0x20。
示例命令包
以常见且基本的开启adv指令为例:
该指令为命令包,所以分组头为1,而OCF为0A,而由于是LE指令,所以OFG为8,则操作码为0x200A。入参只有一个,并且入参长度为一。
分组头 | 操作码 | 参数长度(字节) | 参数1(一个字节长) |
---|---|---|---|
01 | 200A | 1 | 1(开启广播)/0(关闭广播) |
实际HCI帧即为(注意字节序):01 0A 20 01 01
其他指令
在蓝牙协议规范中定义了所有的HCI指令,但是要注意这些定义都位于第二卷BR/EDR控制器规范一章,而不是在第四章中,这点要注意。
对于所有BLE HCI指令,说明位置如下:
对于某些固定的LE指令,蓝牙规范中做了专门说明
event包
event包和command包类似,结构如下:
示例事件包
以常见且基本的状态返回事件为例:
事件包的分组头为4,该事件的Code为0x0F回参有三个,其中Status和Num均为一个字节,而Command_Opcode为两个字节,因此该事件包的结构如下
分组头 | 事件码 | 参数长度(字节) | 参数1(一个字节长) | 参数2(一个字节长) | 参数3(两个字节长) |
---|---|---|---|---|---|
04 | 0F | 4 | 0x01 | 0x02 | 0x3456 |
实际HCI帧即为(注意字节序):04 0F 01 02 56 34
其他事件
事件在蓝牙规范文档中的位置与指令一致,对于其他事件说明,可以参考如下目录:
需要注意的是,对于LE事件,其结构做了一定处理,在原来的HCI Event事件上增加了LE Meta event。该LE元事件的作用是在原有的0x3E事件基础上,添加了子事件,该操作目的是在原有的传统蓝牙HCI事件上对LE进行了兼容扩展。
数据包
数据包的结构比较简单和固定,这里不做详细说明,具体介绍参考协议规范文档如下位置:
操作流程
HCI的指令和事件不是独立存在的,他们遵循着蓝牙各种行为规范,为host和controller提供协调。对于要如何操作HCI的指令和事件,需要回头去参考相关控制器章节的说明,以LE 控制器为例,相关的HCI操作sequence说明如下位置:
操作流程示例
我们以基本的开广播为示例,讲述要如何调用HCI指令来完成蓝牙的开广播行为:
可以看到,开广播操作,需要Host B向controller进行如下操作:
- LE Set Advertising Parameters
- LE Read Advertising Physical Channel Tx Power
- LE Set Advertising Data
- LE Set Scan Response Data
- LE Set Advertising Enable
进行上述五步HCI指令,HOST就能让Controller开启广播,同时需要注意Controller返回的Command Complete事件,查看是否有指令执行失败。
主从连接过程交互
如下为实际的组从连接过程HCI交互抓包情况,其中从机开广播流程省略了发射功率读取指令,主机连接流程省略了扫描过程:
主机
从机
BQB测试
HCI也有专门的BQB测试规范,不过该规范过于繁琐,以前都是给做专门控制器的产品做的,现在都是SOC,已经做的不多了
https://www.bluetooth.com/specifications/specs/core-specification-5-2/