HCI层数据包格式

前言:

Host 和蓝牙控制器都是通过HCI接口交互的,所以了解HCI通信包格式是很有必要的。有助于抓包分析和解决问题!

HCI的命令格式(HCI Command Packet)

HCI层数据包格式_第1张图片

OpCode的bit10~bit15用来表示OGF域,用来表示HCI命令的种类。HCI总共有7中类型的命令,分别定义如下:

For the Link Control commands, the OGF is defined as 0x01.

For the Link Policy Commands, the OGF is defined as 0x02.

For the HCI Control and Baseband Commands, the OGF is defined as0x03

For Informational Parameters Commands, the OGF is defined as 0x04

For the Status Parameters Commands, the OGF is defined as 0x05.

For the Testing Commands, the OGF is defined as 0x06.

The OGF of 0x3F is reserved for vendor-specific debugcommands.

OGF 和OCF都为00,表示NOP命令。

OCF对应每组命令组相应的命令。

Parameter Length表示所带参数的长度,以字节数为单位,随后就是所带的参数列表。下面以Inquiry命令为例对HCI的命令包做具体说明:

在Inquiry命令中,OGF=0x01表示此命令属于链路控制命令,同时OCF=0x0001则表示此命令为链路控制命令中的Inquiry命令。OCF与OGF共占2字节,又由于底位字节在前,则它们在命令包为0x0104。在Inquiry 命令中,参数Parameter Length为5。Inquiry命令带3个参数,第一个参数为LAP(low address part), 它将用来产生Baseband中查询命令包的包头中的Access Code。第二个参数为Inquiry_Length,它时表示在Inquiry命令停止前所定义的最大时间,超过此时间,Inquiry命令将终止。第三个参数为NUM_Response,它的值为0X00表示设备响应数不受限制,只为0x00-0xff则表示在Inquiry命令终止前最大的设备响应数。因此,若LAP=0x9e8b00,Inquiry_Length=0x05,NUM_Response=0x05,则协议上层调用Inquiry命令是HCI向基带发的明令包将为:0x01 04 05 00 8b 9e 05 05。

HCI  ACL数据包格式(HCI ACL Data Packets)

HCI层数据包格式_第2张图片

HCI同步数据包格式(HCI Synchronous Data Packets)

HCI层数据包格式_第3张图片

Handle表示Connection_Handle . ACL和SCO(eSCO)数据包中的Connection Handle即连接句柄,是一个12比特的标志符,是用来描述host和蓝牙控制器之间的逻辑通道,当一个新的逻辑链接(具体可以参考蓝牙核心-链路管理相关概念)创建时由控制器分配。控制器分配后通过Connection Complete,Synchronous Connection Complete, or LE Connection Complete events事件包返回给host。Connection Handle用于唯一确认两台蓝牙设备间的数据或语音连接,可以看作是两台蓝牙设备间唯一的数据通道的标识。

两台设备间只能有一条ACL连接,也就是只有一个ACL的连接句柄,相应L2CAP的信道都是建立在这个连接句柄表示的数据通道上;两台设备间可以有多个SCO的连接,则一对设备间会有多个SCO的连接句柄。连接句柄在两设备连接期间一直存在,不管设备处于什么状态。在ACL数据包中,Flags分为PB Flag和BC Flag,PB Flag为包的界限标志,PB Flag=0x00表示此数据包为上层协议包(如L2CAP包)的起始部分;PB Flag=0x01表示此数据包为上层协议包(如L2CAP包)的后续部分。BC Flag为广播发送的标志,BC Flag=0x00表示无广播发送,只是点对点的发送;BC Flag=0x01表示对所有处于激活状态的从设备进行广播发送,BC Flag=0x02表示对所有的从设备包括处于休眠状态的从设备进行广播发送。ACL和SCO数据包中的Data Total Length 都表示所载荷的数据的长度,以字节位单位。


HCI事件包(HCI Event Packet)

HCI层数据包格式_第4张图片

事件包的Event Code用来区分不同的事件包,Parameter Length表示所带参数的长度,以字节数为单位,随后就是所带的参数列表。以Command Status Event事件包为例对HCI的事件包进行具体说明。

当主机控制器收到主机发来的如上面所提到的Inquiry命令包并开始处理时,它就会向主机发送Command Status Event事件包,此事件包为:0x0f 04 00 0a 01 04。0xOf表示此事件包为Command Status Event事件包,0x04表示此事件包带4字节长度的参数,0x00为此事件包的第一个参数即Status,表示命令包正在处理。0x0a为事件包的第二个参数NUM_HCI_Command_Packets,表示主机最多可在向主机控制器发10个命令包。0x01 04 为第三个参数Command_Opcode, 表示此事件包是对Inquiry命令包的响应。


你可能感兴趣的:(bluetooth)