低功耗藍牙HCI交互實例解析

準備工具

說明 

(以下內容摘抄自韋東山的《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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章