準備工具
-
協議解析工具Wireshark,下載地址https://www.wireshark.org/download.html。
-
hci_dump.pklg文件,該文件由btstack示例程序運行時產生,此處可直接下載hci_dump.pklg。
說明
(以下內容摘抄自韋東山的《BLE協議.docx》)
運行BTStack程序時,會生成hci_dump.pklg文件,可以使用WireShark打開此文件。截圖如下:
BTStack中涉及的數據有2類:
1.從硬件上獲得的數據、發給硬件的數據
2.爲更新系統狀態而虛構的數據
1. 跟硬件相關的數據有4類:
① 發送給藍牙控制器的Command
② 從藍牙控制器獲得的Event,藍牙控制器收到Command後會回覆Event
③ ACL數據,這涉及收、發兩個方向
④ SCO數據,這涉及收、發兩個方向
這4種數據類型,用一個頭部信息來表示,參考bluetooth.h:
#define HCI_COMMAND_DATA_PACKET 0x01
#define HCI_ACL_DATA_PACKET 0x02
#define HCI_SCO_DATA_PACKET 0x03
#define HCI_EVENT_PACKET 0x04
但是在程序中,單憑這4個數值無法分辨數據的流高,比如ACL數據的類型是0x03,我們單憑0x03無法知道這數據是發給硬件、還是從硬件讀到。爲了便於調試,BTStack在打印Log信息時,把這些硬件數據類型轉換爲新數值:
參考函數: hci_dump_packetlogger_setup_header
1. Command : 0x00
2. Event: 0x01
3. ACL out 0x02
4. ACL in 0x03
5. SCO out 0x08
6. SCO in 0x09
7. Log Message 0xfc
2. 爲更新系統狀態而虛構的數據:
有很多種虛構的數據,下面舉幾個例子:
① 提示狀態發生了變化:
在BTStack中,可能有很多層對hci_stack->state感興趣,所以當hci_stack->state發生變化時,可以使用hci_emit_state發送一個虛擬的Event數據包,這會導致這些層的處理函數被調用。
在WireShark中看到的原始數據爲:01 60 01 xx,第1個01表示Event,60表示BTSTACK_EVENT_STATE,第2個01表示數據長度爲1, xx表示數據即state值。
② 當一個數據包已經成功發給硬件之後,我們要通知上層:你可以繼續發送數據給硬件了。這通過hci_emit_transport_packet_sent函數來實現:
在WireShark中看到的原始數據爲:01 6e 00,第1個01表示Event,6e表示HCI_EVENT_TRANSPORT_PACKET_SENT,00表示後續數據長度爲0。