

8.1 前言
Link Layer
传输层再往上,就是传输层了。传输层,位于Host
和Controller
层之间,提供一种无需知道详细数据内容便可传输数据的能力。其主要通过硬件传输介质(如:UART
、USB
、SDIO
等),传输Bluetooth HCI
的数据。
下面是UART
传输层的框图:
看完上面的图,我们大概就对传输层有了大概的了解了,下面详细分析一下。
HCI详细介绍,可查
Core5.0 P670

8.2 HCI(Host Controller Interface)介绍
上图,展示了两个设备之间的数据传输路径。Host
通过HCI Driver
驱动程序与Controller
硬件上的HCI Firmware
交换数据和命令,传输层就是提供了这样的能力。
传输层主要的作用:
- 蓝牙协议栈向芯片发送连接的
command
- 蓝牙芯片上报给蓝牙协议栈
command status with create connection opcode
- 蓝牙芯片上报蓝牙协议栈
connect complete
HCI
提供了一种统一接口用来访问,控制Controller
,传输层是透明的,独立于底层传输技术,并且无需关系Host
传输给Controller
的数据是什么内容.
在HOST
与Controller
之间,以Command
与Event
命令方式进行传输。Host
发送Command
信息到Controller
,Controller
将Command Status
和Params
以Event
的形式返回给Host
,最后返回Command Complete Event
表示连接完成。
更加直观一点,如下:
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
交互的数据格式为:
8.3 HCI 数据包格式
HCI
提供了统一的命令格式来访问Controller
,不同的命令也需要花费不同的时间。传输层以命令Command和事件Event的方式进行通信,下面我们主要看一下通信的数据包的格式。
8.3.1 Handles
Handle
:逻辑链路的通道的标识,这里分为三类:Connection_Handles
, Logical Link Handles
, 和Physical Link Handles
8.3.1.1 Primary Controller Handles
Connection_Handles
:被Primary Controller Handles
分配,标识主机和主控制器之间的逻辑通道,当一个新的逻辑链路被建立的时候,Connection_Handles
会被分配。
该Handle
主要被用在:Connection Complete
, Synchronous Connection Complete
, LE Connection Complete
, or LE
Enhanced Connection Complete
的Event
事件中。
8.3.1.1.1 Broadcast Connection_Handles
Host
在第一次上电或者重启的时候,第一次发送HCI
数据包,此时分配一个Connection_Handle
。此后,使用该Handle
去广播。
8.3.1.2 AMP Controller Handles
AMP Controllers
包括两种:Logical Link Handles
, 和Physical Link Handles
。
对于Host
与AMP Controller
之间的 Data
,Command
和Event
操作,如果Physical Link Handles
被指定,则使用该Handle
,如果未被指定,则在指定Connection_Handle
的地方使用Logical Link Handles
在这里不对AMP作详细说明。
8.3.2 HCI Command Packet
HCI Command Packet
用于Host
发送命令给Controller
控制器。
包格式如下:
- OpCode字段
OpCode
:占里两个字节,用于命令标识,分为两个域:OCF:OpCode Group Field
和OGF OpCode Command Field
。
OGF
:占据高6bitOCF
:占据低10bit,其中0X3F
为制造商的调试命令.
- Paramter_Total_Length字段
Paramter_Total_Length
:包中所有参数的长度。
- Paramter字段
8.3.3 HCI Event Packet
每个Command
命令发出之后,都会带一个Event
返回命令执行后的状态。
包格式如下:
- Event_Code字段
Event_Code
:标识不同的事件类型。
- Parameter_Total_Length字段
Parameter_Total_Length
:参数总长度
- Event_Parameter字段
Event_ParameteN
:相关参数
8.3.4 HCI ACL Data Packets
HCI ACL Data Packets
规定了数据包的格式,用于Host
与Controller
之间的数据交换。
数据包有两种类型:
- Automatically-Flushable:自动刷新
自动刷新包,其自动刷新的时间取决于设定的时间。
- Non-Automatically-Flushable:非自动刷新
非自动刷新,则不会自动刷新数据包。
包格式如下:
- Handle字段
Handle
:正如上面所述,该字段有几种类型:
-
Connection_Handle
:用于在主控制器上发送数据包或者段 -
Logical_Link_Handle
:用于AMP控制器发送数据包 -
Physical Link Handles
:用于AMP控制器发送数据包 -
Flag 字段
Flag
包括:PB Flag
和BC Flag
,即Packet_Boundary_Flag
与Broadcast_Flag
,取值如下:
8.3.5 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字段
8.4 HCI连接包示例
HCI
连接命令流程:
1)蓝牙协议栈向芯片发送连接命令:HCI Connect command
2)蓝牙芯片上报命令状态到蓝牙协议栈:HCI Command Complete
3)连接成功后,蓝牙芯片上报蓝牙协议栈连接成功事件:HCI LE Connect complete
8.4.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 P766
For 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:是否支持主从角色转换
8.4.2 Command Complete Event
当Controller
接收到Create_Connection
命令,会发送一个Command Complete
事件给Host
。
事件格式如下:
该事件被用于大多数命令发送后的状态返回。
Event Code:事件代码
Num_HCI_Command_Packets:设置Host
可以发送给Controller
的命令包的个数,如果不允许,则设置为0
Command_Opcode:表示相应的命令代码
Return_Parameters:返回命令指定的参数
8.4.3 Connection Complete Event
该事件表明了Host
与Controller
之间建立连接通道成功。
Event Code:事件代码
Status:连接状态
Connection_Handle:连接成功后,生成的Handle
值
BD_ADDR:连接成功后的MAC地址
Link_Type:连接类型
Encryption_Enabled:是否加密
这些参数也不是一定需要的,下面是抓到的HCI包,希望有所帮助。
好啦,上面就是蓝牙协议HCI接口的详细介绍,详细了解之后,我们就具备了分析HCI数据包的基础能力了!
