1. 程式人生 > >藍芽mesh協議初讀

藍芽mesh協議初讀

藍芽mesh協議棧共8層,由上到下分別是ModelLayer,foundation model layer,Access layer,upper transport layer,lower transportlayer,network layer,bear layer,Bluetooth low energy.

Mesh的網路有四個關鍵的引數分別是network address,network key,applicationkey,IV index.

                Networkaddress 是指資料包的傳送地址或者源地址。

                Networkkey 在網路層用於資料的安全,通俗說就是用於校驗。

                Applicationkey於上一個的功能類似只是用於accesslayer。

                IVindex 用於延長網路的存活時間(不明白)。

一個mesh網路下可以包含一個或者多個 subnet(子網),一個子網裡面的node可以互相通訊,因為他們有同樣的networkkeys,顧名思義,一個節點如果儲存了別的子網的networkkey,他自然也能以成員身份與這個子網裡的其餘nodes通訊。這些個keys是在provision過程中由tool程式進行分配的。可以在configurationmodel 下新增別的子網。負責將別的node配置進網路的node叫configurationclient , 被配置的那個node就叫做configuration server 。 配置的 過程其實就是client生成 並分配各種keys 的過程 ,並且要確保網路內的各個node在networklayer和accesslayer都可以正常通訊。

Mesh目前有兩個承載層,一個是廣播承載層一個是GATT承載層,兩個的區別就是一個是廣播一個是單播。

任何用MESH message ad type 的廣播都是不能被連線不能被加網的,因為如果節點收到這類message就會丟棄。(???)GATT層是為了讓那些不支援廣播的nodes能夠加入網路並且能夠參與通訊。GATT使用代理協議(proxyprotocol)使兩個GATT層的節點相互通訊,GATT定義了兩個role分別是client和server。

Address:

Unicast addrss : provisioner會為每個節點分配唯一的一個unicastaddress,並且可以被收回。unicastaddress 的第15位為0,並且自身不可以為0x0000,所以他的範圍在0x0001~0x7fff。

                Virtualaddress: 每個虛擬地址邏輯上標識一個UUID標籤,作為地址具體有啥用沒看出來據說UUID在uppertransport layer有監測資料完整的作用。當一個訪問訊息被接收到一個具有匹配雜湊的虛擬地址時,上層傳輸層使用每個對應的標籤UUID作為附加資料,作為訊息的身份驗證的一部分,直到找到匹配為止。

NETWORK PDU

NID : 由netkey生成,用以保護PDU。Netkey用以加密祕鑰和隱私祕鑰。7個位元,用以更簡單的檢查祕鑰從而檢驗和解密networkpdu。

NetMIC:用以檢測PDU的完整性。

網路層通過網路層介面來支援上下層收發資料,介面提供輸入輸出過濾器,並且這些過濾器可以通過特殊的PDU或者節點自身提供的服務來配置。輸入過濾器決定收到的資料包是傳送給上層還是丟棄,輸出過濾器決定來自上層的資料包是丟棄(當TTL為1)還是傳送給下層的advertising或者GATTbearers。

當接收到一個數據包時,在網路層,會比對NID,如果比對成功,通過NID來認證networkkey,如果認證成功,源地址和目的地址才會有效,如果這個資料包已在網路快取區則丟棄,這個資料包就會遞交給上層lowertransport layer。只有上升到了lower transport layer,轉播功能方能使用,然後TTL減一,這個資料包被標記為轉播並且配置相關引數然後傳至網路層介面。

如果資料來自廣播承載層並且relay使能,為了避免資料的衝突,在接收資料和轉播之間要有一定的間隔。若資料來自GATT承載層,則不需要這樣的考慮。

如果資料來自廣播承載層並且使能proxy功能,則資料包被傳至GATT承載層進行重傳,

當要傳送一個數據包時,資料包的IVI,NID,CTL等區域的值都會裝載,其中的TransportPDU是來自上層,資料包裝在完成後傳送至網路層介面通過過濾器後由承載層送出。

網路層資料包快取區用以減少不必要的安全檢查和過多的重傳。一個PDU收到後若快取區已經有了則丟棄,若沒有則驗證,驗證通過則儲存在快取區。快取區存放的不是完整的PDU只會存放一些用於查詢的資料。當快取區滿了的時候,新的資料會頂替掉舊的資料。

下傳輸層接收來自上傳輸層的PDU,看情況對其進行分片。當收到下層傳遞的PDU時,會重灌可能的PDUS,並在重灌完成後傳遞到上傳輸層。對於這層的PDU來說最重要的就是SEG引數,表明了這個PDU是否是分片PDU。Friend 佇列儲存於該層。

上傳輸層用於加密。用applicationkey 和device key 對上層的access payload進行加密。TransMIC用以檢查accesspayload的完整性,有分包的MIC是64bit,沒有的是32bits。

ACCESS Layer 決定上層應用的資料包形式,並對下層加解密進行控制。Model在這層進行定義,現有兩種model一個是官方的SIGMODEL一個是VendorModel,Accesspayload只有兩個引數,一個是opcode一個是parameter,一個payload最多可以有32個分片沒個分片12個bytes,共有384個byte之長其中包括TransMIC。

Mesh beacons 是為了讓節點和未加網節點發現的定時廣播,beacon有兩種,分別是未加網裝置beacon,一種是網路安全beacon,前者的目的是讓自己被provisioner發現,後者目的是讓nodes識別子網及其安全狀態。