如何分析HCI的Command Packet和Event Packet包

    技术2022-05-20  92

            首先,如何来确定什么样的包为Command/Event Packet呢?

             我们知道,通过HCI Packet包括四种,即CommandEventACLSCO/eSCO,对应到MS-Stack中的定义,即为COMMAND_PACKET EVENT_PACKETDATA_PACKET_ACLDATA_PACKET_SCO

    如下(详细参照bt_hcip.h):

    enum HCI_TYPE {

             COMMAND_PACKET  = 1,

             DATA_PACKET_ACL = 2,

             DATA_PACKET_SCO = 3,

             EVENT_PACKET    = 4,

             ETYPE_FINISH    = 5

    };

    需要指出的是COMMAND_PACKET方向是从Host写入到ControllerEVENT_PACKETController发送给Host,即单向的数据。而DATA_PACKET_ACLDATA_PACKET_SCO为双向的数据,即可以HostàController,也可以ControlleràHost

    接下来看两个与发包和收包相关的函数的定义,如下:

    int HCI_WritePacket(HCI_TYPE eType, BD_BUFFER *pBuff)

    int HCI_ReadPacket(HCI_TYPE *peType, BD_BUFFER *pBuff)

             其第一个参数etype就是用来表示R/W Packet的类型,第二个参数为包的具体数据:

             所以通过在HCI_WritePacket()/HCI_ReadPacket()中对eType值的判断,很容易知道是Command Packet,还是Event Packet        

    >> Command

    首先来看HCI包的结构:

             其中低10bit用来表示HCI CommandOCF域,可以拿着这个值到BlueCore Spec中去查询对应的命令,而bit10bit15用来表示OGF域。对于OGF即使HCI命令的种类,具体的种类包括Link control Link PolicyController&BaseBand以及Information等。

             For exampleHCI_DisconnectMS-Stack的定义值为0x0406,具体参照文件bt_ddi.h。而其OCF域,也即bit0bit90x006,对应的OGF域,也即bit10bit15域为0x01。根据BlueCore Spec的定义,OGF1表示Link Control Command。所有HCI Packet的定义在Volume 2-Core System Packet Part E-Host Controller InterfaceChapter 7th-HCI Command and Events中定义(以BlueCore Spec2.1为例),查询7.1th-Link Control Command一节,对应的Command Code0x006,其对应的Command应该是HCI_Disconnect,如下所示:

     

             下面举一个具体的Command Packet分析过程:

    Write(1, 25):

     0B 04 16 77 89 39 98 22 00 54 0B 3F 42 F8 38 EE

     90 09 BC 1D 1C 1E D1 E2 61

    G=0x1, code=0xb

             首先看OCFbit[0~9])为0x0b,而OGFbit[10~15])为0x01,对照BlueCore Spec,则该条命令应该为Link Controller Command域中的HCI_LINK_KEY_REQUEST_REPLY0x0b),Parameter Total Lengthbit16230x16,为该命令的解释如下:

     

             根据该命令的详细解释,其参数包括两部分BT_ADDRLink_key,分别占用6字节和16字节,所以BT_ADDR77 89 39 98 22 00,而Link_key54 0B 3F 42 F8 38 EE 90 09 BC 1D 1C 1E D1 E2 61

             所以,可以看到分析Command Packet的关键在于两点,第一点是根据Packet找到OCFOGF以及total parameter length,然后找到该command的详细解释,即包含了那些参数以及每一个参数的具体长度,就可以来对Command Packet进行解析了。

    >> Event

             首先,来看Event Packet的结构:

     

             下面以一个具体的Event Packet来进行分析:

    Read(5, 8):

     17 06 77 89 39 98 22 00

             很容易可以看出,Event Code0x17Parameter Total Length0x06。由于Event没有域之说,可以直接拿着0x17BlueCore Spec中的Events中去查找对应Event Link Key Request,如下:

     

             根据该Event的详细解释,其参数为BT_ADDR,共占用6个字节,即为77 89 39 98 22 00


    最新回复(0)