【所有文章汇总】
文章目录
1、前言

上一节,我们了解了Link Layer层,我们接着往上看,链路层再往上就是传输层了。
传输层,正如其名,位于Host和Controller层之间,提供一种无需知道详细数据内容便可传输数据的能力。
其主要通过硬件传输介质(如:UART、USB、SDIO等),传输Bluetooth上层数据。
下面是UART传输层的框图:

看完上面的图,我们大概就对传输层有了大概的了解了,下面详细分析一下。
HCI详细介绍,可查
Core5.0 P670
2、HCI(Host Controller Interface)介绍

上图,展示了两个设备之间的数据传输路径。Host通过HCI Driver驱动程序与Controller硬件上的HCI Firmware交换数据和命令,传输层就是提供了这样的能力。
传输层主要的作用:
-
HCI提供了一种统一接口用来访问,控制Controller,传输层是透明的,独立于底层传输技术,并且无需关系Host传输给Controller的数据是什么内容. -
在
HOST与Controller之间,以Command与Event命令方式进行传输。Host发送Command信息到Controller,Controller将Command Status和Params以Event的形式返回给Host,最后返回Command Complete Event表示连接完成。
更加直观一点,如下:

3、HCI 数据包类型
HCI有四种类型的包格式,分别是:

- HCI Command Packet:由蓝牙协议栈发送给芯片的命令,即
Host->Controller - HCI Event Packet:由蓝牙芯片上报给蓝牙协议栈的事件,即
Controller->Host - HCI ACL Data Packet:蓝牙协议栈跟蓝牙芯片双向交互的普通数据。
- HCI Synchronous Data Packet:蓝牙协议栈跟蓝牙芯片双向交互的普通数据。
详细见
Core5.0.pdf P670
在Host和Controller之间,HCI的命令和事件类型如下:
详细见
Core5.0.pdf P647

4、HCI 数据包格式
上面我们已经了解了HCI通信包的类型有四种,下面我们来逐个分析:
4.1 HCI Command Packet
HCI Command Packet用于Host发送命令给Controller控制器。
包格式如下:

OpCode字段
OpCode:占里两个字节,用于命令标识,分为两个域:OCF:OpCode Group Field和OGF OpCode Command Field。
OGF:占据高6bit,对应不同类别的蓝牙命令OCF:占据低10bit,对应某一类别下的唯一的蓝牙命令,其中0X3F为制造商的调试命令.
形象一点理解:
OGF表示你在班级中是第几组的人,OCF表示你在组中是第几号,O(∩_∩)O

Paramter_Total_Length字段
Paramter_Total_Length:包中所有参数的长度。

Paramter字段

这个Paramter,每一组命令要求的参数都不一样,所以根据实际情况来选择。
4.2 HCI Event Packet
每个Command命令发出之后,对返回的参数要求不同,根据不同的返回参数要求,返回指定的数据。
包格式如下:

Event_Code字段
Event_Code:标识不同的事件类型。

Parameter_Total_Length字段
Parameter_Total_Length:参数总长度

Event_Parameter字段
Event_ParameteN:相关参数,与上文一样,每个命令有不同的参数返回。

4.3 HCI ACL Data Packets
HCI ACL Data Packets规定了数据包的格式,用于Host与Controller之间的数据交换。
数据包有两种类型:
- Automatically-Flushable:自动刷新
自动刷新包,其自动刷新的时间取决于设定的时间。
- Non-Automatically-Flushable:非自动刷新
非自动刷新,则不会自动刷新数据包。
包格式如下:

Handle字段
Handle:逻辑链路的通道的标识,这里分为三类:Connection_Handles, Logical Link Handles, 和Physical Link Handles
Connection_Handles:被Primary Controller Handles分配,标识主机和主控制器之间的逻辑通道,当一个新的逻辑链路被建立的时候,Connection_Handles会被分配。
该
Handle主要被用在:Connection Complete,Synchronous Connection Complete,LE Connection Complete, orLE Enhanced Connection Complete的Event事件中。
Host在第一次上电或者重启的时候,第一次发送HCI数据包,此时分配一个Connection_Handle。此后,使用该Handle去广播。
AMP Controllers包括两种:Logical Link Handles, 和Physical Link Handles。
对于Host与AMP Controller之间的 Data,Command和Event操作,如果Physical Link Handles被指定,则使用该Handle,如果未被指定,则在指定Connection_Handle的地方使用Logical Link Handles
在这里不对AMP作详细说明。
Flag 字段
Flag包括:PB Flag 和BC Flag,即Packet_Boundary_Flag与Broadcast_Flag,取值如下:


4.4 HCI Synchronous Data Packets
该数据包,被用于在Host和Controller之间交换同步数据。
包格式如下:

Packet_Status_Flag字段
该字段与Erroneous_Data_Reporting参数有关:
- 如果
Erroneous_Data_Reporting参数设置为disable,则Packet_Status_Flag字段设置为00 - 如果
Erroneous_Data_Reporting参数设置为enable,则Packet_Status_Flag字段依据下面表格设置

Data_Total_Length字段

这一部分,只需要知道
HCI包的四种类型即可,会对照抓出来的HCI包分析数据就OK啦!
5、HCI连接包示例
HCI连接命令流程:
1)蓝牙协议栈向芯片发送连接命令:HCI Connect command
2)蓝牙芯片上报命令状态到蓝牙协议栈:HCI Command Complete
3)连接成功后,蓝牙芯片上报蓝牙协议栈连接成功事件:HCI LE Connect complete
5.1 HCI Connect command
Core5.0 P774
该命令用于让Link Manager链路管理器去连接远程设备。
连接command封包格式如下:

-
OCF:这里可以看到OCF的值,那么OGF值为多少呢?
打开
Core5.0 P774,我们可以看到HCI_Create_Connection命令属于LINK CONTROL COMMANDS链路控制命令组,该组OGF为0x01。详见Core5.0 P766For the Link Control commands, the OGF is defined as 0x01.
-
BD_ADDR:要连接的remote设备的蓝牙地址,6个字节。
-
Packet_Type:支持的数据封包类型,2个字节。

- Page_Scan_Repetition_Mode:是否重复扫描

- Clock_Offset:主从设备之间的时钟偏移。

- Allow_Role_Switch:是否支持主从角色转换

5.2 Command Complete Event
当Controller接收到Create_Connection命令,会发送一个Command Complete 事件给Host。
事件格式如下:

该事件被用于大多数命令发送后的状态返回。
-
Event Code:事件代码
-
Num_HCI_Command_Packets:设置
Host可以发送给Controller的命令包的个数,如果不允许,则设置为0

- Command_Opcode:表示相应的命令代码

- Return_Parameters:返回命令指定的参数

5.3 Connection Complete Event
该事件表明了Host与Controller之间建立连接通道成功。

-
Event Code:事件代码
-
Status:连接状态

- Connection_Handle:连接成功后,生成的
Handle值

- BD_ADDR:连接成功后的MAC地址

- Link_Type:连接类型

- Encryption_Enabled:是否加密

这些参数也不是一定需要的,下面是抓到的HCI包,希望有所帮助。

最后,看一下HCI在协议栈中的位置:


好啦,上面就是蓝牙协议HCI接口的详细介绍,详细了解之后,我们就具备了分析HCI数据包的基础能力了!