BLE廣播信道空中包詳解


廣播信道空中包

在學習BLE的過程中,對於廣播信道的空中包有許多混淆的地方,包括各個空中包的用途,幀格式等。現在想把他們做一個總結和歸納。

BLE廣播信道中的空中包分為有以下幾種:

  • 可連接非定向廣播 (ADV_IND)
  • 可連接定向廣播 (ADV_DIRECT_IND)
  • 不可連接廣播 (ADV_NONCONN_IND)
  • 掃描請求 (SCAN_REQ)
  • 掃描響應 (SCAN_RSP)
  • 連接請求 (CONNECT_REQ)
  • 可掃描通知 (ADV_SCAN_IND)

下面將分別詳細介紹下這幾種空中包。

空中包幀格式

之前的博文中有介紹BLE協議空中包的格式,所有空中包格式如下圖所示:

廣播信道空中包的PDU部分如下圖所示:

Header部分如下圖所示:

接下來將結合6中廣播信道的空中包來解釋幀格式中各個字段的意義

可連接非定向廣播 (ADV_IND)

可連接非定向廣播,是使用最為頻繁的廣播包,幾乎所有提供了連接功能的BLE設備都使用這種空中包。

可連接的意思是,該設備提供了能與之建立鏈路層連接的功能;非定向的意思是,並非只有某個特定的設備才能與之建立連接。可連接非定向合起來的意思是,所有收到該廣播的設備,都可與之建立鏈路層連接

接下來看一下這種廣播包幀格式中的payload部分,如下圖所示:

由上圖可知,payload部分包含2個字段:AdvA和AdvData

  • AdvA: Adv Address,它表示廣播者的設備地址
  • AdvData:廣播數據,包括service data,service uuid以及manufacture data等等。

那么AdvA中的設備地址到底是公共設備地址還是私有設備地址呢?我們知道Header部分有一個字段TxAdd,占位1個bite。如果該比特為0,則表示AdvA是公共設備地址;如果該比特為1,則表示AdvA是私有設備地址

可連接定向廣播 (ADV_DIRECT_IND)

可連接定向廣播,是指明了對方設備地址的,為之提供了連接功能的廣播包。簡而言之就是,只有廣播包中指定的那個設備才能與之建立鏈路層連接,其余設備的連接請求均被忽略。

幀格式中的payload部分,如下圖所示:

由上圖可知,payload部分包含2個字段:AdvA和InitA:

  • AdvA:Adv Address,它表示廣播者的設備地址
  • InitA:表示接收者的設備地址,它指明了該廣播包的接收者地址,也表示后續也只有該設備才能與之建立鏈路層連接

Header中的TxAdd字段表示AdvA地址是公共地址還是私有地址;RxAdd字段表示InitA地址是公共地址還是私有地址。相應的,如果為0表示公共地址;如果是1,則表示私有地址

不可連接廣播 (ADV_NONCONN_IND)

不可連接廣播,通常用於向周圍的設備周期性的廣播一些特定的信息,附近的任何設備都可以接收這種廣播包,但不可與之建立連接。

例如,這種廣播包可用於防丟器的應用場景,在一些容易丟棄的物件上內置BLE芯片,並周期性的廣播不可連接廣播包,手機掃描這種廣播包,同時也會獲得這種廣播包的接收信號強度(RSSI),接收信號強度是與距離相關的,手機離設備遠的時候,它的強度就弱,弱到一定程度手機就會發出報警聲,表示物件已經離開手機很遠了。

幀格式中的payload部分,如下圖所示:

它的payload部分和可連接非定向廣播包一模一樣,只不過它是不可連接的。

掃描請求 (SCAN_REQ)

上面說到的那些廣播包都是廣播者發出的空中包,掃描請求是掃描者向指定的廣播者發出的空中包,廣播者收到掃描請求后,要立即回復掃描響應

掃描請求的payload部分如下圖所示:

由上圖可知,它包含2個字段:ScanA和AdvA:

  • ScanA:Scanner Address, 表示掃描者的設備地址
  • AdvA:廣播者的設備地址

我們知道對於掃描請求來說,掃描者是發送方,廣播者是接收方。所以Header中的TxAdd表示掃描者的設備地址類型,RxAdd表示廣播者的設備地址類型,相應的,為0表示公共設備地址,為1表示私有設備地址

掃描響應 (SCAN_RSP)

掃描響應是廣播者發出的空中包,它是作為對掃描請求的響應,其中會攜帶一些與廣播者相關的數據,並返回給掃描者。

掃描響應的payload部分如下圖所示:

由上圖可知,它包含2個字段:AdvA和ScanRspData:

  • AdvA:廣播者的設備地址
  • ScanRspData:Scanner Response Data,表示返回給掃描者的響應數據

對於掃描響應來說,廣播者是發送方,掃描者是接收方。因而Header中的TxAdd表示AdvA的設備地址類型,0是公共地址,1是私有地址

值得注意的是,雖然掃描響應中並沒有指定掃描者的設備地址,但也只有發出對應掃描請求的設備才能接收該掃描請求,其他設備會將其忽略。

連接請求 (CONNECT_REQ)

連接請求,既不是廣播者發出的,也不是掃描者發出的。它是由發起者發出,並由廣播者來接收,簡而言之就是發起者向指定的廣播者發起的一個連接請求。

發起者在發起連接請求之前,它必須先知道廣播者的設備地址,那么它是如何知道對方地址的呢?一種方式就是通過掃描。我們知道廣播者有2種可連接的廣播包,分別是可連接非定向廣播包和可連接定向廣播包。那么當掃描者接收到其中一種可連接廣播包的時候,它就知道對方的設備地址了,因而可以發起連接請求。如果是可連接定向廣播包,前提是定向的是掃描者自己,那么才能發起連接請求。

連接請求的payload部分如下圖所示:

由上圖可知,payload部分包含3個字段:

  • InitA: Initiator Address,發起者設備地址
  • AdvA:廣播者設備地址
  • LLData:Link Layer Data,表示與鏈路層連接相關的連接參數

LLData的結構如下圖所示:

LLData的內容比較復雜,下面簡單介紹一下:

  • AA:Access Address,訪問地址
  • CRCInit:用於CRC計算的一個初始值
  • WinSize:transmitWindowSize,傳輸窗口的大小
  • WinOffset:transmitWindowOffset,傳輸窗口的偏移量
  • Interval:connInterval,簡單理解就是一個睡眠喚醒周期的時間
  • Latency:connSlaveLatency,表示Slave可以連續多長時間不用監聽信道
  • Timeout:connSuppervisionTimeout,設備雙方約定這么長時間之后沒有相互收到對方的包了,那么彼此可以認為連接已經丟失了,比如設備超出距離的情形
  • Chm:Channel Map,后續連接中使用到和未使用到的數據信道
  • Hop:跳頻的跳數
  • SCA:它和Master的睡眠時鍾精度有關

可掃描通知 (ADV_SCAN_IND)

可掃描通知,是廣播者發出的空中包,它會攜帶廣播數據,同時也會響應其他設備的掃描請求,但與可連接非定向廣播包不同的是,他不能響應其他設備的連接請求。

簡而言之就是,可獲取設備信息(廣播數據和掃描響應中的數據),但不能被連接。

可掃描通知的payload部分如下圖所示:

由上圖可知,payload部分包含2個字段:

  • AdvA:廣播者的設備地址
  • AdvData:廣播數據

Header中的TxAdd為0表示AdvA是個公共地址,為1表示私有地址


免責聲明!

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



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