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

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

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

HCI有四种类型的包格式,分别是:

Host -> ControllerController -> Host详细见
Core5.0.pdf P670
在Host和Controller之间,HCI的命令和事件类型如下:
详细见
Core5.0.pdf P647

交互的数据格式为:

HCI提供了统一的命令格式来访问Controller,不同的命令也需要花费不同的时间。传输层以命令Command和事件Event的方式进行通信,下面我们主要看一下通信的数据包的格式。
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, or LE
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作详细说明。
HCI Command Packet用于Host发送命令给Controller控制器。
包格式如下:

OpCode:占里两个字节,用于命令标识,分为两个域:OCF:OpCode Group Field和OGF OpCode Command Field。
OGF:占据高6bitOCF:占据低10bit,其中0X3F为制造商的调试命令.
Paramter_Total_Length:包中所有参数的长度。


每个Command命令发出之后,都会带一个Event返回命令执行后的状态。
包格式如下:

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

Parameter_Total_Length:参数总长度

Event_ParameteN:相关参数

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

Handle:正如上面所述,该字段有几种类型:
Connection_Handle:用于在主控制器上发送数据包或者段
Logical_Link_Handle:用于AMP控制器发送数据包
Physical Link Handles:用于AMP控制器发送数据包
Flag 字段
Flag包括:PB Flag 和BC Flag,即Packet_Boundary_Flag与Broadcast_Flag,取值如下:


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

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

HCI连接命令流程:
1)蓝牙协议栈向芯片发送连接命令:HCI Connect command
2)蓝牙芯片上报命令状态到蓝牙协议栈:HCI Command Complete
3)连接成功后,蓝牙芯片上报蓝牙协议栈连接成功事件:HCI LE Connect complete
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:是否支持主从角色转换

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

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

Command_Opcode:表示相应的命令代码

Return_Parameters:返回命令指定的参数

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

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

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

BD_ADDR:连接成功后的MAC地址

Link_Type:连接类型

Encryption_Enabled:是否加密

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


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