日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分包组包 北斗通信_蓝牙mesh底层传输层(分包和组包)

發布時間:2024/9/27 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分包组包 北斗通信_蓝牙mesh底层传输层(分包和组包) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當傳輸大于15字節的上層傳輸層PDU時,底層傳輸層就需要對上層傳輸層PDU進行分包并重新組包為了減少底層傳輸層包的數量,這里使用塊應答機制。

問題:怎么通過塊應答機制減少底層傳輸層包的數量?

上層傳輸層需要分成兩個底層傳輸層PDU的例子.jpg

示例中上層傳輸層訪問PDU包含1字節的OPCode字段,3字節的NetKeyIndex和APPKeyIndex字段,還有16字節的APPkey字段。這以為著當使用應用秘鑰加密和驗證時,上層傳輸層PDU為24字節。這被底層傳輸層分為兩個包,即分包0和分包1。每個分包具有一個標識分包數的包頭,然后被傳遞到網絡層,在那里計算完整的網絡層PDU。網絡層再使用該網絡層PDU的序列號加密網絡層PDU,然后對這些消息進行模糊處理,最終只有NID(和IV索引)字節以明文形式可見。因此可以使用兩個網絡層PDU安全地傳遞單個訪問消息。

分包

底層傳輸層將上層傳輸層PDU分為一個或多個底層傳輸層PDU。同一時間底層傳輸層將同一上層傳輸層PDU的分包訪問消息和分包控制消息發送到同一目的地。只有當上一個傳輸層PDU的所有分包都已被應答或消息被取消時,底層傳輸層才可以發送另外一個上層傳輸層PDU。

上層傳輸層訪問消息一個分包最大為12字節,上層傳輸層控制消息一個分包最大為8字節。因為上層傳輸層PDU中TransMIC的值是變動的,訪問消息是4字節,控制消息是8字節。

分包消息會在底層傳輸層會確認消息,但是不分包消息則不會。為了更加有效可靠的傳輸上層PDU,應該使用單包分段消息代替未分包消息。因為單包分段消息會被重傳,而未分包消息就不會。

上層PDU使用SegO字段識別每個分包。用于加密和驗證的SeqAuth值將不同分包鏈接在一起。同一個上層PDU分包后的每個下層傳輸層PDU應具有相同的IV Index。

SeqAuth是一個56bit的值,它由IV Index和第1個分包的序列號組成,其中IV Index在高字節,序列號在低字節。只有低位的13bit(稱為SeqZero)才包含在分包消息和分包應答消息中。在對完整的分包消息進行組包時,可以從任何段中的IV Index、SeqZero和SEQ得到SeqAuth值。例如,如果接收到的消息的SEQ是0x647262, IV索引是0x58437AF2,接收到的SeqZero值是0x1849,那么SeqAuth值就是0x58437AF2645849。如果收到的SEQ值為0x647262, SeqZero值為0x1263,則SeqAuth值為0x58437AF2645263。

由于SeqZero的大小有限,一旦SEQ比SeqAuth高8192,就不可能發送分段消息。如果一個分段消息在SEQ比SeqAuth高8192時還沒有被確認,則取消上行傳輸PDU的發送。

消息的每個段都包括它的段偏移號和最后的段號。段號(SegO)和最后段號(SegN)都包含在消息中,以允許接收方在接收到消息的任何段后總是確定上層傳輸PDU的大小(到最近的8字節)。

組包

當使用了低功耗節點功能時,消息應答由朋友節點執行,而低功耗節點不會發送應答消息。在收到分包消息時,首先應檢查SeqAuth以確認此消息是否正在接收或先前是否已接收。如果尚未接收,則接收設備應根據SeqN字段分配足夠的內存,以便存儲上層傳輸層PDU的分包并跟蹤它的分包是否被收到。

如果未使用低功耗功能,則該消息的目的地是單播地址,并且此時節點無法接收此上層傳輸層PDU,例如因為節點繁忙或資源不足以重新組裝此消息,然后節點通過將BlockAck值設置為0x00000000來向源節點發信號,通知它無法接收此上層傳輸層PDU。

底層傳輸層針對每條收到的某個SeqAuth取值的所有分包消息都設置了序列認證值(Sequence Authentication Value)和塊應答值(Block Acknowledgement)。

如果底層傳輸層收到SeqAuth值小于序列認證值的消息分包,則忽略該段。如果底層傳輸層收到新消息的分包,則它應將該段中的SeqAuth值保存為新的序列認證值。

如果底層傳輸層收到多個分包消息的其中一個分包,但此時因為它當前正忙或沒有資源接收更多的分包消息,并且如果該消息的目的地是單播地址,底層傳輸層應回復一個BlockAck字段為0x00000000的應答消息。

當接收SeqAuth值大于序列認證值的一個分包消息時,底層傳輸層將啟動不完成定時器,定義底層傳輸層接收不同分包的等待最大時間,此定時器應被設置為最少10秒。

當接收SeqAuth值大于目的地為單播地址的序列認證值的分包消息時,底層傳輸層應啟動一個應答定時器,該定時器定義底層傳輸層發送分包應答消息的時間,最少設置為150+50xTTLms.

底層傳輸層應將接收的每個分包在塊應答值中進行標記,該塊應答值可以稍后傳輸回源節點。收到分包消息的所有分包之后,底層傳輸層將發送分包確認消息,其中BlockAck字段被設置為用于序列認證值的塊應答值。它應取消未完成定時器和應答定時器,并將重新組裝的消息發送到上層傳輸層。

當應答定時器到期時,底層傳輸層將為當前序列認證值包發送分包應答消息,其中BlockAck字段被設置為塊應答值。

當未完成定時器到期時,底層傳輸層應認為正在接收的消息已經失敗并取消應答定時器,之前接收的部分消息都應被忽略。

如果只看這一篇,會感覺寫的太撈了,根本不知道在講什么玩意,連個例子都沒有。沒辦法,如果沒有整個mesh知識體系,舉出例子了也沒法理解。如果直接上例子,不講規則,也沒法搞。

總結

以上是生活随笔為你收集整理的分包组包 北斗通信_蓝牙mesh底层传输层(分包和组包)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。