日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何获取并分析Bluetooth HCI层Command Packet和Event Packet包

發布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何获取并分析Bluetooth HCI层Command Packet和Event Packet包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??? 首先,如何來確定什么樣的包為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包的數據

???????? 所以通過在HCI_WritePacket()/HCI_ReadPacket()中對eType值的判斷,很容易知道是Command Packet,還是Event Packet????????

>> Command Packet

首先來看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 Packet

???????? 首先,來看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

總結

以上是生活随笔為你收集整理的如何获取并分析Bluetooth HCI层Command Packet和Event Packet包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。