Contiki學習筆記 RPL協議詳解

2021-06-20 22:31:15 字數 2128 閱讀 6080

前一篇部落格沒寫完也拖了很久時間沒更新了,今天補上。

整個contiki帶的協議結構如下圖所示:

這裡我想針對上面這幅圖說說我的理解。看過計算機網路的人應該都知道tcp/ip的iso架構,感測網的架構跟這個架構差不多。咋們從下往上看,首先是物理層:這個對於我這種硬體出生的人很好理解,就是radio嘛~有些radio是符合ieee 802.15.4的,比如cc2420;但是不滿足也沒有關係啊,最多跟別人的radio不相容嘍~比如我之前用的si1000;當然話說回來,物理層採集到的rssi和lqi值對上層路由判斷還是很有用處的。

之後是mac&rdc層:我為什麼要把兩個層放在一起講,因為rdc實際是屬於mac層的,在tcp/ip中是沒有rdc層;為什麼沒有?因為rdc是為了節點的低功耗,tcp/ip不用考慮功耗的;當然感測網協議也可以不需要考慮低功耗,所以可以把rdc去掉,在contiki裡面用nullrdc;mac層的存在是為了維護點對點鏈路的穩定性,比如上圖看到的csma協議就採取了重發和避碰兩種機制保證穩定性。

再看適配層:這層同樣很奇特,因為你可能在其他感測網協議中都沒見過;它的存在是為了使得uip和mac層更好的通訊,主要工作包括:包壓縮、資料處理等,contiki裡面6lowpan協議用到的就是sicslowpan.c檔案。

再上面就看到網路層:這一層是為了整個網路鏈路建立和維護存在。一般感測網協議核心就在網路層和應用層中。

傳輸層:可能的話是為了維護整條鏈路穩定性,注意這裡的整條鏈路是區別於mac層的點對點穩定性的,比如tcp會用流量、重傳等維護穩定性;但是很遺憾感測網用tcp代價太大,所以就引出了應用層的coap協議來配合udp來維護鏈路。

這兩月除錯下來,除了coap沒怎麼跑,其他部分倒是都試了一遍。就現在測試結果來看,很不行。主要體現在資料量大、低功耗時丟包率大。而且網上也沒有人針對contiki這個協議提出過測試結果,更別提改進辦法了。所以很奇怪adam他們是怎麼進行商用的~

關於rpl學習我在前一篇提過了,主要資料是標準文件和cooja實際,而uip部分因為涉及不深也不好多說。

很多人在討論rpl跟uip的關係,我之前也一直很糊塗深入了解後發現實際

rpl是uip的一部分

,和uip應該是平行關係,也正印證了上圖的關係。開啟「core/net/uip6.c」檔案可以發現rpl的路由包是屬於icmp6型別,與

ns(鄰居請求,請求鄰居相信)、na(鄰居公告,響應ns或告知鏈路變化)、ra(路由器通告引數)、rs(路由請求,請求生成ra)這些包是平等關係。所以rpl是網路層協議是毋庸置疑的!

你可能要說網路層已經有uip了幹嘛還要rpl?實際是這樣的,uip是從tcp/ip協議衍生過來的,並不具有多跳功能,也就是說如果去掉rpl網路就只能單跳了。

rank:這裡我們例舉rpl的樹形結構(rpl不只有樹形結構,多謝

cy2007126

dio(dodag information object):包含節點自身資訊,比如rank、mac位址什麼,鄰居只有收到了dio以後才確定是否能給它。

dao(destination advertisement object):這個包是為了資料下傳用的,子節點傳給父節點報告其距離等訊息。

dis(dodag information solicitation):徵集dio包用的。

1. 節點復位完成,首先傳送dis包,徵集鄰居節點資訊,這點有點像arp

2. 鄰居點接收到dis開始傳送dio包。

3. 收到dio包的節點更新自身鄰居表,並選擇合適的節點傳送資料報。

4. 同時節點會向選中的父節點傳送dao包,告知其是子節點。

5. 父節點更新了自身的路由表後,再向父節點的父節點發dao,最後到達sink點後雙向鏈路最終形成。

有人可能會問,乙個點可能會收到很多節點的路由包,它如何選擇呢?

contiki裡面兩種仲裁機制:最短路徑、etx。在rpl-conf.h第63行可以修改。

我理解的rpl差不多也就這麼多了,如果之後又深入了解還會跟各位分享的。

python3協程學習筆記

在此之前,協程對我來說是乙個比較陌生的概念,學習之後,發現其應用場景還是有不少,大師之言 協程能自然地表述很多演算法,例如 遊戲 非同步i o,以及其他事件驅動型邊吃形式活協作式多工。舉例來說,asyncio tornado twisted simpy庫都是基於協程特性在單個執行緒中管理多個併發活動...

Contiki學習(二) 定時器的用法

一 定義定時器 static struct etimer timer etimer定義如下 struct etimer 二 設定定時器 ccif void etimer set struct etimer et,clock time t interval et etimer指標 interval 定...

Kotlin協程筆記

會阻塞主線程,等待協程執行完,才會繼續執行主線程 不會阻塞主線程,返回job型別的物件 var job globalscope.launch 3 async 用於啟動乙個非同步協程任務,與launch用法基本一樣,不阻塞執行緒,區別在於 async的返回值是deferred,將最後乙個封裝成了該物件...