如何获取并分析Bluetooth HCI层Command Packet和Event Packet包
??? 首先,如何來確定什么樣的包為Command/Event Packet呢?
???????? 我們知道,通過HCI Packet包括四種,即Command,Event,ACL和SCO/eSCO,對應到MS-Stack中的定義,即為COMMAND_PACKET ,EVENT_PACKET,DATA_PACKET_ACL和DATA_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寫入到Controller,EVENT_PACKET為Controller發送給Host,即單向的數據。而DATA_PACKET_ACL和DATA_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包的數據。
???????? 所以通過在HCI_WritePacket()/HCI_ReadPacket()中對eType值的判斷,很容易知道是Command Packet,還是Event Packet。????????
>> Command Packet
首先來看HCI包的結構:
???????? 其中低10個bit用來表示HCI Command的OCF域,可以拿著這個值到BlueCore Spec中去查詢對應的命令,而bit10~bit15用來表示OGF域。對于OGF即使HCI命令的種類,具體的種類包括Link control, Link PolicyController&BaseBand以及Information等。
???????? For example,HCI_Disconnect在MS-Stack的定義值為0x0406,具體參照文件bt_ddi.h。而其OCF域,也即bit0~bit9為0x006,對應的OGF域,也即bit10~bit15域為0x01。根據BlueCore Spec的定義,OGF為1表示Link Control Command。所有HCI Packet的定義在Volume 2-Core System Packet Part E-Host Controller Interface的Chapter 7th-HCI Command and Events中定義(以BlueCore Spec2.1為例),查詢7.1th-Link Control Command一節,對應的Command Code為0x006,其對應的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 |
???????? 首先看OCF(bit[0~9])為0x0b,而OGF(bit[10~15])為0x01,對照BlueCore Spec,則該條命令應該為Link Controller Command域中的HCI_LINK_KEY_REQUEST_REPLY(0x0b),Parameter Total Length(bit16~23)0x16,為該命令的解釋如下:
?
???????? 根據該命令的詳細解釋,其參數包括兩部分BT_ADDR和Link_key,分別占用6字節和16字節,所以BT_ADDR為77 89 39 98 22 00,而Link_key為54 0B 3F 42 F8 38 EE 90 09 BC 1D 1C 1E D1 E2 61。
???????? 所以,可以看到分析Command Packet的關鍵在于兩點,第一點是根據Packet找到OCF,OGF以及total parameter length,然后找到該command的詳細解釋,即包含了那些參數以及每一個參數的具體長度,就可以來對Command Packet進行解析了。
>> Event Packet
???????? 首先,來看Event Packet的結構:
?
???????? 下面以一個具體的Event Packet來進行分析:
| Read(5, 8): ?17 06 77 89 39 98 22 00 |
???????? 很容易可以看出,Event Code為0x17,Parameter Total Length為0x06。由于Event沒有域之說,可以直接拿著0x17去BlueCore Spec中的Events中去查找對應Event Link Key Request,如下:
?
???????? 根據該Event的詳細解釋,其參數為BT_ADDR,共占用6個字節,即為77 89 39 98 22 00。
總結
以上是生活随笔為你收集整理的如何获取并分析Bluetooth HCI层Command Packet和Event Packet包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软Surface Duo 3不玩双屏改
- 下一篇: AMD Zen4锐龙终于要真正便宜了!果