第03節-BLE協議各層數據格式概述


本篇博客根據韋大仙的視頻,整理所得。

對於BLE系統,它分為上下兩塊。上面那一塊,我們稱為host主機。下面這一塊是controller,你可以簡單的認為它就是一個藍牙芯片。

對於host這一塊,它運行於linux android 單片機 ,它是純軟件的概念。它和藍牙芯片之間通過usb口或串口來傳輸數據。那么對於host和controller中的各個層,它們是如何表示數據的呢?本篇博客就來討論這個問題。

例子1:

 

 

 

打包:

甲公司A1想給乙公司A2'發送一封信,於是甲公司A1就構造了一個數據包:for A2',然后它將數據包傳給下面的部門B,下面的部門B會將這個數據包發給乙公司。注意部門B中的人並不認識乙公司A部門的人,它只知道乙公司有這樣的一個部門。那怎么辦呢?

它給傳下的數據包 for A2'加上一個頭部,於是變為了 A for A2'。對於甲公司B部門中的人它不知道數據包是給乙公司A2'的,它只知道數據包要給乙公司的A部門。

解包:

A for A2'這樣的一個數據包通過某種方式就傳到了乙公司的B部門。這個B部門的人一看到數據包有A這個頭部,就知道數據包是發給A
部門的,於是就將for A2'的數據包取出來,由A部門的派件員根據里面的信息發給A2',這樣A2'就收到了甲公司中A1發給它的數據包了。

在整個過程中,B部門的人根本沒有分析數據包中的內容 即:for A2'

甲公司B部門的人與乙公司B部門的人也有交流啊,比如說甲公司的B3想發一個數據包給乙公司的B2',該怎么發呢?
首先甲公司的B3構造出一個數據包 for B2',然后再給它加上一個頭部B,由快遞員發給乙公司的B部門。B部門一看這個數據包就是發給本部門的人,於是它就直接看了看這個數據包,哦是發給B2’,於是就發給了B2'
通過對公司中上下部門傳送數據包的流程大概能知道A、B部門數據包的格式。看下面的圖:

 

 

打包:

有上下三層,每層數據包的格式有什么特點呢?
A層:數據的格式最簡單,它不需要幫別人去干活,只需要表明自己的數據是什么類型以及數據本身就可以了。
比如說A層中有兩類數據:typeA1和typeA2。只需要在頭部中表明這個數據是A1還是A2即可。然后后面緊跟數據本身就可以了。最終數據的格式為A1/A2 data for A1/A2。然后將委托B層幫它進行傳輸,意味着B層的數據來源有兩種可能:從A層傳下來的數據和它自己這一層的數據。它既要幫A層傳輸數據,也要傳輸自己的數據。那么在B層的數據格式里面肯定有A/B這樣的一個結構體來分辨這個數據是來自於A層的還是自己這一層的。如果來自於A層,那么在類型的后面直接跟着上層傳來的數據data for A即可。如果是自己這一層的,首先后面先跟數據的類型是B1還是B2,然后再跟上要發送的數據data for B1 or B2

B層將要發送的數據包再委托給C層,因此對於C層來說,數據來源有兩種可能:從B層傳下來的數據和它自己這一層的數據。它既要幫B層傳輸數據,也要傳自己的數據。那么在C層的數據格式里面肯定有B/C這樣的一個結構體來分辨這個數據是來自於B層的還是自己這一層的。如果來自於B層,那么在類型的后面直接跟着上層傳來的數據data for B即可。如果是自己這一層的,首先后面先跟數據的類型是C1還是C2,然后再跟上要發送的數據data for C1 or C2

解包:

對方在收到數據包的時候,首先根據頭部信息進行解析,它是發給哪一層的,確定了哪一層之后,它再去確定數據的格式。比如說數據是發給B層的,然后再去解析數據的類型是B1還是B2。

看一下傳輸線路上數據的格式:

 

 

 

這三種數據格式就是在傳輸線路上實際傳輸的數據,這些數據首先要傳給C層,由C層進行處理,它是如何進行處理的呢?
首先分辨頭部,這頭部有兩種可能:C層和B層。如果發現這個頭部是C層本身的,它就可以解析后續的數據
如果它發現這個數據是要發給B層的,那么它就將數據直接交給上一層B。交到B層之后,它也會分辨頭部,這頭部也有兩種可能:B層和A層。如果它發現這個頭部是B層本身的,那么它就可以解析后續的數據。如果它發現這個數據是要發給A層的,那么它就將數據直接交給A層,數據到達A層之后,由它自己再去解析。

在解包的過程中,首先由C層進行解析,然后再由B層進行解析,最后由A層進行解析。
對於BLE協議里面,各個層次的數據結構與上圖是非常類似的。下面這張圖描述了BLE各個層次數據的格式:

 

 

 在上面這張圖中,只列出了ATT層、L2CAP、LL層這三層。對於上面的GAP、GATT層,它們是依賴於下面的層來實現的,它們本身並沒有什么數據格式。對於最底下的物理層,它是與無線電相關的,我們並不關心。

首先看一下,LL層。對於LL層,它要發出兩種類型的數據:一種是advertising數據,一種是data channel數據
所謂data channel數據就是兩個設備建立連接之后發送的數據。那么怎么分辨是廣播數據,還是連接之后的數據呢?
利用訪問地址進行區分,就是圖中的Random和0x8E89BED6對於廣播數據,它的值永遠是0x8E89BED6。當對端的鏈路層在收到一個數據包時,它首先去分辨頭部,如果發現等於0x8E89BED6的話,就知道了這是一個廣播包。

對於廣播包,它有很多種,那我如何分辨它是哪一種廣播包呢?這里面又有一個頭部type,用來分辨是哪一個廣播包。然后跟着是廣播數據。
對於Data channel ,它如何表示某個設備呢?用一個隨機數來表示某一個設備,那這個隨機數是怎么確定的呢?


在BLE系統里面,一個設備A和設備B一旦建立了連接,就會分配一個Access Address,這是一個隨機數。注意,這個連接一旦斷開,再次建立連接,它會分配另外一個隨機數

這個隨機數各不相同,可以認為該隨機數代表一個連接。那么就可以利用隨機數來表示已經建立連接的對端設備。因此就可以用Random來表示對端已連接的設備。

后面跟着就是發給對端設備的數據了,這個數據的來源有兩種可能:LL層自己本身或上層的L2CAP層。那么它是如何區分這個數據是LL層的還是上層的L2CAP層的?

在數據包中使用LLID來分辨數據來源(對於打包是來源,對於解包就是目的地了)。如果來自於本層LL層,那么LLID=11b,本層的數據有很多類型,比如說REQ、RSP、IND。那么如何分辨是哪種類型呢?在數據本身里面有一個opcode,根據opcode來分辨數據的類型。
如果數據來自於L2CAP層,LLID=10b或01b,后面跟着的就是來自於上層的數據。

對於L2CAP層,數據來源有兩種可能:本層的數據或ATT層的數據。它如何去區分是本層的數據還是上層傳遞給它的數呢?在該層引入了一個channel ID,使用channel ID來分辨是本層的數據還是上層的數據。當channel ID=04時,傳輸的是ATT層的數據;當channel ID=05/06時,傳輸的是本層的數據。本層的數據又有非常多的類型,它如何分辨傳遞的是哪一些呢?它是利用code來進行分辨是哪些L2CAP層數據。
對於ATT層,這一層本身也有很多種數據,它是如何分辨的呢?它引入了一個opcode。注意在這一層中它不需要再傳遞上層的數據了,因此就不需要加區分哪一層的頭部了。

將上圖中各層數據的格式組合起來,就得到了在空中傳輸的數據的格式了,如下圖所示:

 

 

這些數據通過無線電傳到對端的LL層,就開始了解包的過程。如果LL層能處理的話,它就進行處理,否則它會轉交給上一層。
首先分辨Access Address,如果發現Access Address =0x8E89BED6,這是一個廣播包,它是可以處理的,可以看看里面的數據是什么東西。如果發現Access Address為某個隨機數,此時就需要區分哪一層了。
當LLID=11b時,由LL層進行處理;當LLID=10b/01b時,LL層無權處理,需要轉交到L2CAP層進行處理。

L2CAP層如何進行處理呢?

首先取出Channel ID,如果Channel ID =05/06,它就需要處理后續的數據了。如果Channel ID=04,它無權處理,需要交給ATT層進行處理。


 




 


免責聲明!

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



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