藍牙5.0協議解讀 via Bluetooth Core v5.0(使用smartRF packet sniffer進行抓包)

目錄

 

簡介

一、常見的廣播包

二、廣播包的結束,解析連接successfully的數據包

三、數據包解析(DATA CHANNEL PDU)


簡介

        Bluetooth Core version 5.0已經發布了很久一段時間了,對於進行藍牙設備的相關開發藍牙協議核心規範是一份不錯的攻略指導書,2822頁覆蓋其相關的協議、規範、數據包解讀等等。接下來我們藉助smartRF packet sniffer藍牙通信抓包軟件以及Bluetooth Core v5.0進行相關的數據解讀。

PS:此處默認大夥都安裝了smartRF packet sniffer,沒的話我在這兒貼一個該軟件的傳送門:https://download.csdn.net/download/qq_33475105/11832890 ,現在CSDN都默認了下載積分真是無語。

免費下載地址: http://www.ghostyu.com/download/10

Start:

一、常見的廣播包

上圖是一個最爲常見的廣播包,解析開始:

Time:抓取的數據包的間隔的時間;

Channel:通信頻道。

                ①在廣播期間,設備的通信頻道是37、38、39三個頻道。

                ②設備與Host連接成功後使用的頻道是0~36頻道。

                ③通信期間的跳頻的經由數據信道選擇算法確定的,在接下來的數據包解析中會有相關的敘述。

Access Address:訪問地址,按照協議文檔所述該訪問地址是默認的,The Access Address for all other advertising channel packets shall be 10001110100010011011111011010110b (0x8E89BED6)。

Adv PDU Type:廣播包數據類型。常見的廣播包類型如下:

• ADV_IND

• ADV_DIRECT_IND

• ADV_NONCONN_IND

• ADV_SCAN_IND

• ADV_EXT_IND

• AUX_ADV_IND

• AUX_SYNC_IND

• AUX_CHAIN_IND

  PS:在此插入介紹一下PDU的概念 ,PDU是什麼呢?

         協議數據單元PDU(Protocol Data Unit)是指對等層次之間的傳遞的數據包。

Adv PDU Header:該Header包括四個部分:Type、Txadd、Rxadd、PDU-Length。

①Type:此處的指的是廣播包的數據類型,主要有一下幾種。

廣播類型

②Txadd和Rxadd這兩個參數的位是由the advertiser's address是否是公共的還是隨機的來決定該參數是“1”或者是“0”,public(Txadd ==0) or random (Rxadd == 1)。

③PDU-Length:數據包的長度。所以上述的數據包的Adv Header中表示的內容是:廣播包類型是0,即ADV_IND,Txadd和Rxadd地址都是公共的非隨機,該數據包的長度爲33。

        ADV_IND類型的廣播包的組成架構如上圖,6 octets的廣播地址 + 31 octets以內的廣播數據,所以一個廣播包最大爲37個字節。

AdvA:廣播地址。

AdvData:數據包的格式爲:Length + Type +Data,由這三項組成一個小包。

        按上面的描述一個Bluetooth devide能廣播31個octets的數據內容,然而並不是最多隻能廣播31 octets,看下面這幅數據包的圖像:

        該Bluetooth device在廣播的時候,總共有三個不同Type的廣播包,分別是:ADV_IND、ADV_SCAN_REQ、ADV_SCAN_RSP。其中ADV_IDN廣播包的介紹上面以及敘述了,剩下的ADV_SCAN_REQ、ADV_SCAN_RSP是scanning PDUs。

ADV_SCAN_REQ:該數據的字段由ScanA和AdvA字段組成。 ScanA字段應包含TxAdd指示的掃描儀的公共或隨機設備地址。 AdvA字段是此PDU尋址到的設備的地址。AdvA字段應包含廣播的公共或隨機設備地址,如RxAdd所示。這些PDU不包含任何主機數據。

ADV_SCAN_RSP:該數據字段由AdvA和ScanRspData字段組成。 AdvA字段應包含TxAdd指示的廣告客戶的公共或隨機設備地址。 ScanRspData字段可以包含來自廣播的設備的任何數據。

      綜上所述,在一次完整的廣播中,Bluetooth devive可以最多廣播31 octets + 31 octets的數據內容,即最多進行62字節的廣播。


二、廣播包的結束,解析連接successfully的數據包

ADV_CONNECT_REQ 數據包,主要爲LLDATA數據段,其他部分和上述的廣播數據包雷同。

AAAccessAddr,鏈路層連接的訪問地址。該地址是後續數據通信時的訪問地址,是一個32bit的值,每次訪問它都會需要一個新的訪問地址時,鏈路層應生成一個滿足下列要求的新隨機值:

•不得是該設備上任何現有鏈路層連接的訪問地址。

•它不應是任何已啓用的定期廣告的訪問地址。

•它不得超過六個連續的零或一。

•不得是廣告頻道數據包的訪問地址。

•序列不得與廣告頻道數據包的訪問地址僅相差一位。

•它不能使所有四個八位位組相等。

•過渡不得超過24個。

•它的最高有效六位應至少有兩個轉換。

            援引藍牙Core v5.0中的描述On an implementation that also supports the LE Coded PHY ,該AA還需要滿足以下的條件:

•它的最低有效8位中至少應有3個。

•最低有效16位中的跳變不得超過11個。

 

CRCInit:該參數用於數據通道PDU的CRC校驗的配置,其中該參數的大小爲24 bit,移位寄存器預先設置爲鏈路層連接設置的CRC初始化值即該參數CRCInit的值。linear feedback shift register (LFSR)使用線性反饋移位寄存器來生成CRC校驗。

WinSize:該字段應設置爲指示sendWindowSize值,其方式如下:sendWindowSize = WinSize * 1.25 ms。用於確定傳輸窗口開放的時間。

WinOffset:該字段設置爲指示transmitWindowOffset值:transmitWindowOffset= WinOffset * 1.25 ms。

Therefore the start of the first packet will be no earlier than

transmitWindowDelay + transmitWindowOffset 

and no later than

transmitWindowDelay + transmitWindowOffset + transmitWindowSize 

Interval:該參數用於設置connlnterval的值,其相關公式爲:connInterval = Interval * 1.25 ms,範圍是7.5ms至4.0s,connInterval參數由發起方的鏈路層在CONNECT_IND PDU中從主機指定的範圍設置。

Latency:該參數用於設置connSlaveLatency的值,其設置的方式如下:connSlaveLatency = Latency,假如Latency設置爲x,則從機累計x次未應答,連接就會斷開。

Timeout:該參數用於設置 connSupervisionTimeout 的值, 其設置方式如下: connSupervisionTimeout = Timeout * 10 ms。

        連接可能由於各種原因而中斷,例如設備超出範圍,遇到嚴重的干擾或電源故障情況。由於這可能會在沒有任何事先警告的情況下發生,很重要的一點就是主機和從機都必須監視連接狀態,爲了能夠檢測到鏈路丟失,主機和從機都應使用鏈路層連接監視計時器TLLconnSupervision。接收到有效數據包後,計時器應復位。如果在建立連接之前鏈路層連接監督計時器達到6 * connInterval,則應將連接視爲丟失。這樣可以快速終止無法建立的連接。

        連接監督超時(connSupervisionTimeout)是一個參數,它定義在兩個連接被視爲丟失之前,兩個接收到的數據包PDU之間的最長時間。 connSupervisionTimeout應爲100毫秒至32.0 s範圍內的10毫秒的倍數,並且應大於(1 + connSlaveLatency)* connInterval * 2。如果在建立連接和計時器之後的任何時候處於連接狀態達到connSupervisionTimeout值,則應認爲連接已丟失。如果認爲連接丟失,則鏈路層不得再發送任何其他數據包。 鏈路層退出連接狀態,並應過渡到待機狀態。 應通知主機失去連接。

        連接事件的時間由兩個參數確定:連接間隔(connInterval)和從屬延遲(connSlaveLatency)。connSlaveLatency的值應爲0到((connSupervisionTimeout /(connInterval * 2))-1)範圍內的整數。 connSlaveLatency參數也應小於500。當connSlaveLatency設置爲0時,從屬設備應在每個錨點偵聽。 如果從屬服務器在應用了從屬服務器延遲之後沒有收到來自主機的數據包,則它應該在每個錨點上偵聽,並且直到從主機接收到數據包之後才應用從屬服務器延遲。

ChM:該參數包含了指示已使用和未使用的數據信道的信道映射。下圖顯示了從PHY通道到通道索引和通道類型的映射。下表中“”表示指定通道類型使用了PHY通道和索引。上述抓包數據中該參數的值爲“1FFFFFFFFF”,即“‭0001111111111111111111111111111111111111‬”。

Hop:該參數應用於設置指示數據頻道選擇算法中使用的hopIncrement。它的隨機值應在5到16之間。

頻道選擇算法Channel Selection Algorithm #1

       該算法僅支持連接事件的通道選擇,其包括兩個階段:計算未映射的信道索引,然後將該索引映射到已使用信道集中的數據信道索引。 unmappedChannel和lastUnmappedChannel是兩個連續連接事件的未映射通道索引。 unmappedChannel是當前連接事件的未映射通道索引。 lastUnmappedChannel是上一個連接事件的未映射通道索引。 對於連接的第一個連接事件,lastUnmappedChannel應爲0。

在連接事件開始時,應使用以下基本算法來計算unmappedChannel:

unmappedChannel =(lastUnmappedChannel + hopIncrement)mod 37

當連接事件關閉時,lastUnmappedChannel必須設置爲unmappedChannel的值。使用以下算法將unmappedChannel重新映射到頻道圖中已使用的頻道之一:

remappingIndex = unmappedChannel mod numUsedChannels

SCA:該參數應用於設置指示用於確定最壞情況的MasterSCA的睡眠時鐘精度,SCA字段的值應按照下中的定義進行設置,


三、數據包解析(DATA CHANNEL PDU

LL Data PDU Data header字段:該字段的數據封裝格式如下圖所示

      該字段的數據主要由:LLID、NESN、SN、MD、RFULength構成,每個參數的描述如下圖所示,在常見的數據包類型是01b和10b,以及11b型,分別是空的數據包,L2CAP的消息數據包以及控制信息的數據包。LL Data PDU是用於發送L2CAP數據的數據信道PDU,Header中的LLID字段應設置爲01b或10b。

LL Control PDU:LL Control PDU是用於控制鏈路層連接的數據信道PDU。該數據包構成形式如下圖所示

LL Control PDU的長度字段不得設置爲00000000b。 所有的LL Control PDU都有固定的長度,具體取決於操作碼。

操作碼Opcode:

注:上文部分插圖摘錄自Bluetooth Core v5.0。目前正在學習藍牙5.0,有什麼錯誤敬請大家指正,謝謝!

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