王 永 濤,黃 翠,黃 維,梁 俐,陳 躍 威
(1.貴州省水利科學研究院,貴州 貴陽 550002; 2.貴州農業職業學院,貴州 貴陽 551400; 3.貴州東峰自動化科技有限公司,貴州 貴陽 550002)
灌區信息監測站網建設點多、面廣,存在交通不便、施工困難等不利因素影響,極大地制約了灌區信息化的發展應用水平。目前貴州省大型灌區的管理決策一般是以人工經驗為主,并沒有準確全面感知作物水、肥狀況、生長狀態和環境參數。無線傳感器網絡具有成本低、網絡結構靈活、數據傳輸距離遠等特點,為水利信息化提供了有力的技術支撐。RMAC無線傳感器網絡通訊協議能夠盡可能地減小節點的能量消耗和延長整個網絡的生命周期,但同時也存在許多不足。本文在此基礎上,提出了改進型的E-RMAC協議,并進行了仿真。為初步形成以物聯網為基礎,無線傳感器網絡為支撐、自動化技術為手段、高效節水灌溉技術為核心的技術體系提供了重要支撐。可實現作物生長最佳條件的精準調控,達到增產、改善品質、調節生育期、節水節肥、減少環境污染、提高經濟效益的目的[1]。
具有占空比的MAC協議能夠有效解決無線傳感器通信網絡能量有限的難題,在單周期內實現多跳傳輸的RMAC(the Routing enhanced MAC protocol)協議是其中最為典型的無線傳感MAC協議。該協議是 Shu Du, Amit Kumar Saha, David B.Johnson于2007年提出的,很好地實現了節點能量的高效性,大大降低了節點間端到端的傳輸延遲時間,同時提高了節點的吞吐量。RMAC應用了跨層思想,由路由層信息獲知下一跳傳輸節點的地址。協議將整個傳輸周期分為:同步期(SYNC),數據時段(DATA),睡眠時段(SLEEP)。在同步期所有節點實現全網同步,在數據時段節點實現通信信道預約,睡眠期節點可以實現數據包傳輸。這樣一來,通過提前預約信道,大大降低了節點因競爭信道造成的能量消耗,同時降低了節點發送數據報時的碰撞概率[2]。
信道預約時RMAC會在數據時段內向其下游節點發送一個先導控制幀PION(Pioneer Control Frame)實現預約通信。PION幀代替了SMAC的RTS/CTS控制幀,且能在一個數據時段內實現多跳傳輸。PION幀起到兩方面作用:① 向它的下游節點發送請求通信的請求信息,如SMAC的RTS;② 向它的上游節點回送確認通信的確認信息,如SMAC的CTS幀。將兩種控制功能集中于一個幀中,在多跳轉發中效率比較高[3]。在睡眠時段,節點開始發送數據包,節點完成任務就進入睡眠狀態,如果節點沒有任務也進入睡眠狀態。
與RTS和CTS幀不同的是,PION幀的字段不僅包含了本地節點地址、上游節點的地址、下游節點的地址、包傳輸需要時間的域值,還包含了跨層信息:數據包傳輸的最終目的地址,以及PION在傳輸路徑上已經轉發的跳數。其中最終目的地址是由網絡層傳輸的,源節點在產生PION幀時將PION轉發跳數置為0。
當源節點S有數據要發送給目的節點D時,在DATA時段節點S在退避窗口CW中隨機選擇一個退避值,完成退避后再經過DIFS時段確定信道空閑后開始向節點A發送一個PION幀,其中A是S的下一跳節點。當A接收到S發送的PION幀后,如果A不是數據包傳輸的最終目的地,A就構建新的PION幀。首先,A通過網絡層獲取數據包當前傳輸的下一跳節點地址,并將PION轉發跳計數器值加1,記錄上一跳節點地址和目的地址后經由SIFS時段(SIFS用于節點從傳輸或接收狀態的狀態轉換和數據處理)開始傳輸自己的PION幀。此時的PION幀代表兩層含義:① 對節點S的請求確認,如同SMAC的RTS的功能;② 對下一跳節點B的傳輸請求,如同SMAC的CTS的功能。與其它協議不同的是,當S接收到A發送的PION幀后并不立即發送數據包而是等到本周期的睡眠時段開始傳輸數據包。一個周期的數據時段只用于建立確切的數據傳輸調度的PION幀的發送與接收,數據包只在睡眠時段傳輸,PION幀在傳輸路徑上不斷地向下傳輸,直到PION傳輸到目的節點或者本周期的數據時段結束為止[4-5]。
如果節點在數據時段完成了信道預約,所有數據包將在睡眠時段實現傳輸。在睡眠初始時段,節點會變為睡眠狀態,每個節點會根據接收到的上游節點的PION幀信息獲知自己什么時候處于活動狀態,協同完成數據包的轉發[6]。
當A將 PION幀發送出去且S接收到了之后,就在當前工作周期下的睡眠時段開始數據包的傳遞,在睡眠時段的相應時間里A就可以接收數據包,A收到后就向S發送已經收到包的回復信息ACK幀,S就立即進入節能狀態睡眠模式。如果A成功完成了下一跳節點B的通信請求,就會把數據包傳給B節點。如果B發送了確認信息ACK幀且A收到后就立即進入睡眠狀態,這樣的過程一直持續至包發送到目的地或者在數據時段內傳輸到一個節點失敗后,接收到它下游節點發給它的回復后,PION幀停止發送數據包,此情況下,節點會保存數據包。到下一工作周期的數據時段,節點會向其下一跳節點發送新的PION幀,并置PION轉發跳計數器值為0,在睡眠時段再傳輸數據包。如此的進程會被重復執行直到數據包傳輸到目的地。
在上述過程中,節點適時清醒時刻的計算是通過PION幀中的轉發跳計數器值得到的,假如一個節點是此次PION轉發路徑中的第i跳節點,則其清醒時刻為
Twakeup(i) = (i-1)(durDATA+SIFS+durACK+SIFS)
(1)
式中,durDATA和durACK分別代表了發送獨個數據包和獨個ACK幀的時間長度,假如整個網絡施行的是同規格的包,則durDATA為一確定值,否則,應在PION幀中相應的字段里記錄包的尺度,以便整個傳輸路徑上的所有節點能計算出正確的清醒時刻[7]。
為了避免包的碰撞,RMAC采用了802.11體系的虛擬載波偵聽思想來設定網絡分配矢量NAV(Network Allocation Vector)[8]。但是有別于現有其它的網絡分配適量,這個網絡分配矢量是一個時間段,相鄰節點如果串聽到該節點的PION幀,ACK幀會計算一個時間段,并在相應的時間段節點處于睡眠模式。
如果C和A是鄰居關系,為了避免在A節點處發生碰撞,那么在A節點接收數據包時C節點不能發送任何數據包。因此,如果C無意中接收到A傳給B的PION幀,C將會設置出相應的3個時間段到NAV中。
(1) 回復完成的PION幀時隙段:[now,now+durPION],durPION表示發送一個PION需要開銷的時間。這個時隙段用于確保在A接收B發送的確認PION幀時C不會發送任何數據包。
(2) 數據包發送時隙段:[tdatastart,tdataend],tdatastart的值是C根據下一次睡眠時間再綜合A的Twakeup時間得來的,tdataend=tdatastart+durDATA。這個時隙段可以保證在S給A發送數據包時,C不會發送任何數據包,以免干擾A的接收。
(3) 接收成功報告時隙段:[tackstart,tackend],其中tackstart=durDATA+durACK+3SIFS+tdataend,tackend=tackstart+durACK,其中durACK是發送ACK支配的時間。這個時隙段能保證A在接收B發送的ACK幀時,C不會發送任何數據包。
C設置好NAV時間段后,如果接收到其它節點發送的PION幀,且轉發時間與已設定好的NAV不沖突的話,C就會向其上游節點發出確認PION幀;如果時間上有沖突,C就不向其上游節點發送確認PION幀,其上游節點會在下一個工作周期的數據時段向C重發PION幀[9]。
如果在數據時段某個節點丟失一個PION幀,則發送該PION幀的節點就收不到其下游節點發送的確認PION幀,在睡眠期,上游節點就不會發送數據包給下游節點。在此情形下,節點只有在下個工作周期的數據時段重新向下游節點發送一個新的PION幀。但是,如果下游節點不知道其上游節點沒有接收到自己發送的確認幀,下游節點會在睡眠時段一直處于接收狀態,無形之中浪費一部分能量。更為嚴重的是,先導控制幀已經在下游節點傳輸了很多跳,這會導致多數節點因等待參與數據傳輸而浪費大量能量。RMAC協議采用超時機制實現了節點自動進入睡眠模式[10]。
如果在睡眠模式下節點丟失了數據包或者ACK確認幀,在本周期內沒有重傳機制實施重傳,節點只有在下個周期的數據時段開始新的信道預約,完成數據包的發送。
通過對RMAC協議的詳細分析,發現有下列問題亟需解決以進一步優化協議的性能。① 數據時段的利用率不可靠;② 幀傳輸丟失處理的低效;③ 不可避免存在的能量消耗和傳輸延遲。在RMAC協議原來工作機制上,本文提出了新的單周期高效多跳傳輸的E-RMAC(Efficiency-RMAC)協議,該協議采用了重傳機制,在信道預約階段采用了單次重傳機制,在數據包發送階段采用了多次重傳機制[11]。
E-RMAC協議數據時段的工作機制為:S為源節點,A是S的下游節點,如果S接收到A發送的確認PION幀,S跳過時隙段T轉為節能的睡眠模式。如果B成功地把確認PION幀傳輸給了A,A就會立即進入T時隙段,再如果發生了超時就立即進行睡眠模式,此時,T時間段為預先設定的一定值且小于durPION。如果B接收到A發送的PION幀卻沒接收到C發送的確認PION幀,則B進入T時間段,此時T時長為durPION,執行完T時間段并不進入睡眠狀態.而是在C所對應的T時間段內向C重發PION幀,發完PION幀后立即進入睡眠狀態,此時的轉發跳計數器值不累加。如果D成功地把確認PION幀傳輸給了A,此時在T時隙段內C成功接收完B另一次傳輸的PION幀后馬上進入睡眠模式。假如D發送的確認PION幀被C接收失敗了,那么經過SIFS后重新傳輸PION幀到D,這個時候D發送PION幀后進入T時隙段。這樣的過程執行下去直到PION被運送到目的節點或者數據時段宣告結束時停止[12]。
為了盡可能實現數據包在單一周期內可靠的傳輸,E-RMAC采用了多跳傳輸模式,并且源節點和在數據時段未成功接收到下游節點發送的PION幀的節點以及最終目的節點都不執行時隙段T。此處T分兩種情況取值:一個是定值;另一個是durDATA。
通過NAV排除隱含干擾節點的情況。A接收S傳輸的數據包,S會收到A傳輸的ACK,當A獲得了數據包,確認包ACK被正確接收后S馬上進入睡眠模式。在T時間段若發生超時,A就向B發送數據包,B運用公式Twakeup推算出合適的活動時刻參與A之間的通信,A接收到ACK后進入睡眠模式。
如上所述,在T時隙段中發生超時B就對C發送數據包。如果B對C傳輸包失敗了,那么C反過來不向B發送確認包ACK,同時啟動T時隙段。接下來在ACK時隙段內B沒收到由C傳輸的ACK,B就經過SIFS后啟動T時隙段,該時隙段用于向C重發數據包,之后又是B等待C的ACK。在這個過程中,B重發的數據包對C成功后,C就對B傳輸ACK,B轉入睡眠模式,通信成功。C啟動下一次T時隙段超時,C對D發送數據包。在前一過程中,D會處于等待通信狀態直到自己偵聽到C傳輸給B的ACK。當C獲得了D的ACK后,則轉入睡眠模式。如果D非本次通信的目的處,那么節點間的協調通信過程始終不會終止,直到在數據時段內,節點沒能夠接收到下游節點傳輸的確認PION幀或者傳輸目的成功就終止所有通信。
2.4.1Twakeup算法
E-RMAC的Twakeup由數據時段和睡眠時段共同協同完成作用,頭節點和其相鄰節點的Twakeup只與數據時段有關聯,除此之外所有非所述節點還與睡眠時段有很大關系。其中, PION已成功傳輸的跳數和是否需要重發PION決定了節點在數據時段的睡眠時間。
Tsleep1=TDATA-[CW+DISF+2·durPION+2·SIFS]
(2)
Tsleep2=TDATA-[CW+DIFS+4·durPION+3·SIFS]
(3)
Tsleep3=TDATA-[CW+DIFS+ (i+2)·(durPION+
SIFS) +T]
(4)
Tsleep4=TDATA-[CW+DIFS+ (i+4)·durPION+ (i+
3)·SIFS]
(5)
式(2)~(3)表示的是源節點不需要重發PION和需要重發PION時的睡眠時間;式(4)~(5)表示的是PION已經成功傳輸跳數大于等于1的節點,其在沒必要和渴望再一次發送PION時的睡眠時間。
節點處于睡眠狀態下剛開始時的時段睡眠時間:
Tsleep5= (i-1)·(durDATA+durACK+3·SIFS+T)
(6)
節點處于合適的時刻Twakeup(i)是根據式(2)~(6)得到的。睡眠時段節點處于活動狀態后且一直保持此狀態,直至確定已經成功收到上游節點傳輸的數據包且把數據包傳輸到下游節點后才轉入睡眠模式。
2.4.2 NAV算法
E-RMAC與RMAC的計算方法相似,假如D與B的關系是鄰節點關系,則相應的NAV時間段設置如下。
(1) 發送與接收PION幀時間段為:[now,now+2·durPION],當D旁聽到B傳輸到C的信道預約幀后,設置該時間段。這個時間段主要是使D處于閑置狀態時正確接受B與C、A之間發送的控制幀。
(2) 數據傳輸時間段為:[tdatastart,tdataend],其中tdatastart的值由下一個休息時間和B的Twakeup時間計算得到,tdataend=tdatastart+2·durDATA+3·SIFS+durACK,在這個時隙段內D必須處于空閑狀態。
與RMAC不同的是,此處D走完上面過程后必須偵聽大約durACK長的時隙段,如果在此時間段D收到了B發送的數據則沒必要再設置下一個新的數據傳輸時間段;如果在此時間段B傳輸的確認幀被D收到了或者D沒有接收到B傳輸的任何幀,則D需要重設置下一個數據時間段。
下一個新的數據時隙段為:tdatastartnext=tdataend+durACK+SIFS,tdataendnext=tdatastartnext+durDATA,執行完新的時間段后D還需要再監聽durACK時間段,重復上面的過程。
(3)確認幀時隙段為:[tackstart,tackend],與RMAC不同的是處于tdataend時D必須進行durACK的時長的偵聽監測,得出以下情況:
假如B傳輸的DATA正好被D旁聽到了,相應設置ACK時隙段:tackstart=tdataend+durDATA+SIFS,tackend=tdatastart+durACK,當上面設置的時間段都走完了后D還要走完SIFS再接著偵聽T大小的時隙段,倘若D在上面這個時間里面并沒有感知到B的所有幀,D就不會計算新的ACK時隙段,換言之,D就要做出相反的行為設置對應的時隙段。
如果B成功發送給D它的ACK確認幀,D就會等待2·SIFS+T的時間后繼續偵聽;倘若B發送的DATA被D旁聽到了,則ACK時間段設置方法和第一種情況類似;如果接收到B發送的ACK則重復經由2·SIFS+T后繼續偵聽的過程,根據偵聽結果作出判斷。
若D并未接受到B傳輸的所有幀,就需要D等待2·SIFS+T后持續偵聽,根據偵聽結果按第一或者第二種情況設置相應的ACK時間段[13]。
實驗采用NS2仿真平臺進行仿真,NS2模擬過程大致分三大部分。首先添加需要模擬協議的代碼。該步驟需要在NS2里面的許多文件中添加相應的程序塊和持續的調試,本文主要是通過make和make clean命令實現,針對出現的問題不斷修改。在修改和添加代碼時,不僅要修改源代碼,還要修改OTCL代碼。添加完代碼后需要編寫Tcl文件,該文件的后綴名是.tcl,主要用于事件驅動、環境設置、通信協議的添加、通信時間設置、節點發送包的數量及速率、仿真數據的收集等。最后完成仿真數據的分析,NS2中通過awk程序可提取本文需要的數據,最后通過畫圖軟件繪制出仿真結果圖。通過讀圖觀察分析出協議的性能,包括傳輸時延、網絡吞吐量、時間抖動等性能[14]。NS2網絡模擬基本流程如圖1所示。
為了對比,本文在相同的仿真環境下實施了SMAC、RMAC和E-RMAC仿真。其中SMAC采用了非自適應載波偵聽機制,為了排除節點同步造成的影響,假定所有協議在實驗開始前節點已實現了同步。仿真拓撲為鏈狀(Chain)和十字交叉狀(Cross)[15]。鏈狀拓撲實現總共24跳節點間等間隔依次分布,十字交叉狀拓撲實現的是兩個24跳的鏈狀拓撲相互交叉分布,具體如圖2和圖3所示,仿真參數如下。

圖1 NS2網絡模擬基本流程Fig.1 Basic flow chart of NS2 network simulation

圖2 鏈狀拓撲
Fig.2 Chain topology

圖3 十字交叉狀拓撲Fig.3 Crossed topology
由于SMAC是基于競爭性協議,采用的是單周期內單跳傳輸。本周期內數據沒傳輸完,只能在下個周期繼續競爭信道再傳輸,因而從圖3可以看出在兩種拓撲下其時延最大。由于RMAC采用的是提前預約通信,在一個周期內能進行多跳傳輸,這樣大大降低了數據包的時延。從圖中看到RMAC與SMAC相比傳輸效率明顯提高了,平均提高了約4.3倍。由于E-RMAC完善了RMAC的丟幀處理功能,保證了包在每個周期盡可能的傳輸。從圖4可以看出,在兩種拓撲下包的傳輸時延E-RMAC均優于RMAC,大約平均提高了46%。

圖4 包的傳輸時延Fig.4 Transmission delay of packets
如圖5所示,隨著網絡cbr流的增加,整個網絡的競爭增大,SMAC的吞吐量趨于一固定值且遠小于RMAC和E-RMAC。

圖5 網絡端到端平均吞吐量Fig.5 Average throughput of network end-to-end
RMAC的多跳傳輸機制在一定程度上緩解了網絡競爭,增大了吞吐量。由于E-RMAC在多跳傳輸的基礎上實現了丟包重傳機制,增加了每個周期包的成功傳輸概率,尤其在十字交叉拓撲中吞吐量遠優于SMAC和RMAC。
RMAC協議采用的是提前預約信道,在單周期內實現數據包多跳傳輸,大大提高了數據包的轉發速率,特別適合一些基于事件驅動的無線網絡環境應用。但其處理包丟失的缺陷導致了其存在一定的不完整性。不管從預約信道還是從數據包傳輸上講,一旦發生包的丟失,將會導致很多節點浪費一部分能量用于等待接收數據包。若該事件發生在大的網絡中,將會浪費更多的能量,如果將其用于基于事件驅動的無線網絡中,其會大大延遲報告事件的發送,勢必會造成很大的危害。
本文方法改進了丟包處理策略,保證了預約包和數據包在單周期內盡可能的發送與接收。從協議效率上來講,不管是網絡數據包成功發送流量還是所有節點的能耗都有所提高。通過仿真圖可以看到,在復雜的拓撲中E-RMAC協議的性能更優越。因此,本文研究的E-RMAC協議應用于大范圍的監測網意義較大。在大網絡、多節點的大型灌區信息化建設應用中能大大降低布網成本,實現經濟性和實效性,提高灌區信息化的發展應用水平。