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进行如下操作:

  1. LE Set Advertising Parameters
  2. LE Read Advertising Physical Channel Tx Power
  3. LE Set Advertising Data
  4. LE Set Scan Response Data
  5. 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/

其他参考博客

https://www.cnblogs.com/yuqilihualuo/p/9790164.html

posted on 2024-05-07 10:43  不回本不改名  阅读(989)  评论(2编辑  收藏  举报

导航