BLE:廣播channel上的PDU分析


本文涉及如下BLE問題:

  • BLE設備是如何被發現的

  • 如何快速的找到BLE設備或者如何降低廣播階段的功耗

  • BLE廣播通道/頻道(channle)上的PDU

     

1. 廣播的目的

  •  讓別人能發現自己,對於一個不廣播的設備,周圍設備感覺不到其存在的,因此,要讓別的設備能發現,則必須向外廣播,在廣播中可以帶上豐富的數據,比如設備的能力,設備名字以及其他自定義的數據,這也就有了第二種可能。
  • 給不需要建立連接的應用廣播數據,比如一個BLE溫度計,其本身可以不接收任何連接,而可以選擇通過廣播將溫度發送出去。檢測者只要監聽廣播就能獲取當前的溫度。

掃描者只有在收到廣播數據后,才能去與廣播者建立連接。廣播是周期性的將廣播數據從廣播通道上發送出去,這里有如下幾個問題:

1.     廣播通道,廣播數據是在37/38/39通道上將廣播出去,當然也可以只配置在某一個廣播通道上發送

2.     廣播數據:即廣播類型的PDU,廣播所攜帶的信息。

3.     周期性:即廣播間隔(advertising interval)

一個廣播包在37,38,39分別廣播出去為一個廣播事件(Advertising event), 

 

以一定的時間間隔廣播數據,這個間隔稱為稱為advertising interval,為了改善設備的兼容性,在兩個廣播時間間隔之間,還有加上一個隨機的0-10ms的delay時間。

時間關系如下:

Advertising event的周期= advertising interval + delay

其中:delay是一個0-10ms的隨機數。

advertising interval的范圍:20ms – 10.24s,並且要求是0.625ms的整數倍。

2.  掃描

掃描是為了獲取設備信息,發現周圍設備,分兩種情況:

被動掃描(Passive scan):這種情況,掃描者不發送任何信息,只監聽廣播數據,掃描者能收到廣播,廣播者並不知道掃描設備的存在:

 

主動掃描:掃描者在接到廣播數據(ADV_IND)后,主動發起掃描請求(SCAN_REQ),廣播者接到掃描請求回應掃描(SCAN_RSP),掃描回應(SCAN_RSP)也可以攜帶廣播者數據:

但需要注意的是,掃描者發送SCAN_REQ請求無法攜帶有效用戶數據(參考掃描類型的PDU Payload),因此廣播和掃描者之間是單向通信,掃描者能知道廣播者信息,但廣播者無法知道掃描者信息。

 

廣播者只是在廣播通道發送廣播數據,並不知道任何scanner的存在,advertiser和  scanner之間也不存在任何同步方式,只有廣播和掃描所在的通道隨機重合時,廣播包才能被掃描設備收到,因此,和廣播設備一樣,掃描設備也有一些時間參數要求。

掃描有兩個重要的參數:scan interval 和scan window

Scan interval:定義多久發送一次掃描請求,

Scan window:定義掃描持續的時間是多長

Scan interval 的取值范圍是:2.5ms-10.24s

advertiser 和 scanner之間不存在任何同步方式,只有廣播和掃描所在的通道隨機重合時,雙方才能發現。

對於廣播和掃描而言,功耗主要消耗在發送或者接收數據期間,因此,廣播間隔和掃描間隔對功耗有很大影響,不同的應用應根據實際設置合適的間隔。

 

3 初始化連接(Initiating)

當接到廣播數據后,scanner可以發起建立連接請求,建立連接請求的數據包(CONNECT_REQ)是在廣播通道上發起的。如下所示:

CONNECT_REQ請求中會帶上重要的連接參數,包括連接時間間隔,supervision timeout,以及和跳頻相關的參數,並且在建立連接后,切換到數據通道上交互數據。這些將在連接的建立中詳細敘述。

4. 廣播channle上的PDU的展開

將廣播通道的PDU結構進一步展開如下:

1. PDU Type:指示PDU的類型,PDUType有七種,分別如下:

                          

7個類型的PDU,分為三類:

  • 四個廣播類型的廣播PDU

  • 兩個掃描類型的PDU

  • 一個發起連接PDU

2 RFU: reserved

3 TxAdd和RxAdd:由PDUType決定其意義,后面的章節與PDUType一並分析;

4 Length: PDU的長度,6 bits,有效范圍 6-37 octets,

 5 Payload:取決於PDUType,后面的章節與PDU Type一並分析;

廣播類型的PDU包括 16 bits的header 和(0-31)字節的payload,header中最重要的一個字段是PDU Type, Txaddr, RxAddr以及payload都是由PDU type決定其意義的,現在將PDUType的七種情況展開分析:

 

根據上圖信息,目前,還有兩個結構沒有展開:AdvData和LLData,

下面以ADV_IND和CONNECT_REQ  為例來展開分析對應PDU

5. ADV_IND  PDU展開

ADV_IND PDU

最終,看到AdvData由一個個AD Structure組成,每個advStructure包括三個部分:

·       AD length,AD Type 和ADData的長度

·       AD Type:AD Data的數據含義,

·       AD Data:AD Type所指示的數據

AD type定義在Core Specification Supplement(CSS) v7 https://www.bluetooth.com/specifications/adopted-specifications

先來看從代碼中找到AD type支持的類型:

最后一個AD Type = 0xFF時,可以擴展私有數據。

抓包示例(抓包軟件會解析或者附帶一些的幀頭數據):

這是工具已經解析了的數據,物理層原始數據如下:

按照PDU結構解析后如下:

SCAN_RSP的原始數據包如下:

解析后:

CONNECT_REQ PDU也是廣播通道上的PDU,我們后續再繼續展開分析。

6. 廣播階段設備的交互流程

一般情況下,廣播階段設備的交互流程如下所所示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM