本發(fā)明涉及一種基于RPL協(xié)議的改進(jìn)網(wǎng)絡(luò)編碼與數(shù)據(jù)傳輸方法。
背景技術(shù):
由于無線傳感器網(wǎng)絡(luò)的多數(shù)應(yīng)用場景都存在鏈路質(zhì)量較差的特點,在這樣的環(huán)境中,數(shù)據(jù)收集會受到很大影響。RPL是用于無線傳感器網(wǎng)絡(luò)等一類低功耗、連接有損的網(wǎng)絡(luò)的路由協(xié)議,經(jīng)過仿真測試,該協(xié)議能夠在鏈路質(zhì)量較差的網(wǎng)絡(luò)中正常運行。然而,在這樣的網(wǎng)絡(luò)環(huán)境中普遍存在分組丟失的情況,數(shù)據(jù)傳輸在這樣的網(wǎng)絡(luò)中有效性非常差,隨著網(wǎng)絡(luò)規(guī)模增大,傳感器節(jié)點到達(dá)數(shù)據(jù)收集節(jié)點的跳數(shù)增多,數(shù)據(jù)收集節(jié)點的數(shù)據(jù)收集率往往會大幅下降。
傳統(tǒng)無線網(wǎng)絡(luò)中已經(jīng)存在許多用于解決無線信道質(zhì)量差這一問題的方案,并且多數(shù)都采用重傳確認(rèn)的方法,Growth Codes作為一種特殊的網(wǎng)絡(luò)編碼方式,利用網(wǎng)絡(luò)編碼這種新的處理方法,提高了數(shù)據(jù)傳輸?shù)目煽啃裕荊rowth Codes應(yīng)用于無配置的網(wǎng)絡(luò),數(shù)據(jù)傳輸效率較低。
實施Growth Codes的基本依據(jù)是基于無線傳感器網(wǎng)絡(luò)中的這樣一個事實:雖然數(shù)據(jù)到達(dá)數(shù)據(jù)收集節(jié)點的帶寬有限,但是傳感器節(jié)點與其鄰居之間交換數(shù)據(jù)的帶寬卻是足夠的。
由于Growth Codes的應(yīng)用場景是“零配置”的,每個傳感器節(jié)點不知道數(shù)據(jù)收集節(jié)點的方向和位置,因此每一輪數(shù)據(jù)發(fā)送,傳感器節(jié)點都隨機選擇一個鄰居進(jìn)行數(shù)據(jù)交換,期望數(shù)據(jù)朝著數(shù)據(jù)收集節(jié)點的方向擴散。同時,這種交換也使得數(shù)據(jù)在網(wǎng)絡(luò)中有多個備份,使數(shù)據(jù)不會因為一次傳輸失敗或一個節(jié)點失效而丟失,因此增加了數(shù)據(jù)在網(wǎng)絡(luò)中生存的持久性。數(shù)據(jù)收集節(jié)點每一輪會從與之直接相連的傳感器鄰居收到一部分?jǐn)?shù)據(jù)。如果傳感器節(jié)點之間只是簡單地交換原始符號,那么數(shù)據(jù)收集節(jié)點一開始會收到一部分原始符號,但隨著時間增長,由于數(shù)據(jù)收集節(jié)點接收到的數(shù)據(jù)是隨機的,因此會收到越來越多的重復(fù)分組。在被深入研究的Coupon Collector’s Problem中已經(jīng)證明,N個原始符號均勻地隨機地生成,那么數(shù)據(jù)收集節(jié)點需要接收大約O(NlogN)個符號才能恢復(fù)所有N個原始符號。
為了減少數(shù)據(jù)收集節(jié)點接收的重復(fù)分組數(shù)目,提高恢復(fù)原始數(shù)據(jù)的速率,減少傳感器節(jié)點之間交換分組的次數(shù),在傳感器節(jié)點的數(shù)據(jù)交換過程中引入了網(wǎng)絡(luò)編碼。Growth Codes使用的是一種簡單的“異或編碼”運算,可以快速地進(jìn)行編/解碼,使之在資源受限的傳感器網(wǎng)絡(luò)中可實現(xiàn)。該方案使傳感器節(jié)點最初發(fā)送編碼復(fù)雜度較低的分組,這樣,數(shù)據(jù)收集節(jié)點可以直接恢復(fù)出原始數(shù)據(jù)。隨著數(shù)據(jù)收集節(jié)點收集的原始數(shù)據(jù)的增加,傳感器節(jié)點逐漸提高編碼復(fù)雜度,而數(shù)據(jù)收集節(jié)點可以利用已知的數(shù)據(jù)信息,對接收的具有較高復(fù)雜度的編碼數(shù)據(jù)進(jìn)行解碼,恢復(fù)出新的數(shù)據(jù)。
在Growth Codes中,原始數(shù)據(jù)被稱為符號,經(jīng)過編碼過程生成的數(shù)據(jù)被稱為碼字,編碼復(fù)雜度,即參與編碼過程的原始符號的總數(shù)被稱為碼字的編碼度數(shù)或度數(shù)。
為了使數(shù)據(jù)收集節(jié)點能盡可能多且盡可能快地恢復(fù)出原始數(shù)據(jù),必須合理的選擇編碼度數(shù)。下面簡述典型Growth Codes如何確定最優(yōu)的度數(shù)增長方式。
設(shè)網(wǎng)絡(luò)中只有一個數(shù)據(jù)收集節(jié)點,假設(shè)每個節(jié)點發(fā)出的碼字以相同的概率到達(dá)數(shù)據(jù)收集節(jié)點,則每個碼字被成功解碼的概率(pr,d)與編碼包的度數(shù)(d)和當(dāng)時數(shù)據(jù)收集節(jié)點已恢復(fù)出的符號的個數(shù)(r)有關(guān):
其中N是網(wǎng)絡(luò)中一個周期所發(fā)送的符號(或發(fā)送分組的節(jié)點)的總數(shù)。
證明:令數(shù)據(jù)收集節(jié)點的符號集合為X,其中已接收的符號數(shù)目為r,則編碼度數(shù)為d的碼字,能被解碼的概率為:
如果度數(shù)為d的碼字能被解碼并恢復(fù)出新的數(shù)據(jù),其編碼原始符號中必然有(d-1)個符號是屬于已知符號集合X的,而剩下的一個符號必然是不屬于集合X的,因此由組合理論可知,這樣的碼字總數(shù)為:
所有可能的長度為d的碼字總數(shù),則是從所有(N個節(jié)點的)符號中選出d個的組合,即因此,可以得出式2-1的結(jié)論。
在已知r個符號的情況下,如果pr,i≥pr,i+1,即解碼度數(shù)為i的碼字的概率大于或等于解碼度數(shù)為(i+1)的碼字的概率,則有:
由此可得:
i·(N-i)≥(r-i+1)·(i+1)
所以:
因此對于解碼節(jié)點,在已知符號數(shù)小于或等于的情況下,度數(shù)為i的碼字的解碼概率大于度數(shù)為(i+1)的碼字,否則度數(shù)為(i+1)的碼字更有可能被解碼。
令Ri表示解碼度數(shù)為(i+1)的分組的概率首次大于解碼度數(shù)為i的分組的概率時,數(shù)據(jù)收集節(jié)點已經(jīng)恢復(fù)的原始分組的數(shù)量,則:
數(shù)據(jù)收集節(jié)點在接收到個度數(shù)為1的分組前,發(fā)送節(jié)點不應(yīng)該發(fā)送度數(shù)大于1的分組。根據(jù)Coupon Collector’s Problem,接收節(jié)點在收到個原始分組前,總共應(yīng)該收到的分組數(shù)為:
即發(fā)送節(jié)點應(yīng)該發(fā)送的分組總數(shù)。
當(dāng)數(shù)據(jù)收集節(jié)點已經(jīng)收到Ri≤r≤Ri+1個分組時,數(shù)據(jù)收集節(jié)點期望接收到度數(shù)為(i+1)的分組。假設(shè)發(fā)送節(jié)點只發(fā)送度數(shù)為(j=i+1)的分組。則數(shù)據(jù)收集節(jié)點收到這樣一個分組,該分組解碼得到新數(shù)據(jù)的概率為:
在解碼得到第(r+1)個符號之前,數(shù)據(jù)收集節(jié)點收到度數(shù)為(i+1)的碼字的解碼概率不變,因此這一過程服從二項分布B(n,pr,j)。若解碼得到第(r+1)個符號平均還需要n個分組,則:
則從期望接收度數(shù)為j的分組到期望接收度數(shù)為(j+1)的分組,數(shù)據(jù)收集節(jié)點應(yīng)該收到的分組數(shù)為:
而數(shù)據(jù)收集節(jié)點從開始到期望接收度數(shù)為(j+1)的分組共需要收到得分組數(shù)為:
根據(jù)式2-8,發(fā)送節(jié)點根據(jù)自己當(dāng)前發(fā)送的分組數(shù)量,來決定將要發(fā)送分組應(yīng)該具有的編碼度數(shù)。
RPL網(wǎng)絡(luò)中尚無關(guān)于提高數(shù)據(jù)可靠性的機制的相關(guān)研究,因此需要一種將Growth Codes與RPL路由協(xié)議結(jié)合,提出了基于Growth Codes的改進(jìn)數(shù)據(jù)傳輸方案。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種基于RPL協(xié)議的改進(jìn)網(wǎng)絡(luò)編碼與數(shù)據(jù)傳輸方法。
本發(fā)明的目的是通過以下技術(shù)方案來實現(xiàn)的:一種基于RPL協(xié)議的改進(jìn)網(wǎng)絡(luò)編碼與數(shù)據(jù)傳輸方法,包括拓?fù)湫畔@取步驟、節(jié)點編碼度數(shù)增長控制步驟、傳感器節(jié)點數(shù)據(jù)分組轉(zhuǎn)發(fā)控制步驟、數(shù)據(jù)編碼步驟和數(shù)據(jù)解碼步驟;所述的拓?fù)湫畔@取步驟包括:獲取RPL路由協(xié)議產(chǎn)生的拓?fù)湫畔ⅲ⑼瑫r了解數(shù)據(jù)收集節(jié)點的方向,選擇靠近數(shù)據(jù)收集節(jié)點的鄰居發(fā)送數(shù)據(jù);
所述的節(jié)點編碼度數(shù)增長控制步驟包括數(shù)據(jù)收集節(jié)點編碼度數(shù)增長控制子步驟和傳感器節(jié)點編碼度數(shù)增長控制子步驟;所述的數(shù)據(jù)收集節(jié)點編碼度數(shù)增長控制子步驟包括以下子步驟:
S101:初始化,根據(jù)節(jié)點獲取到的網(wǎng)絡(luò)規(guī)模N計算度數(shù)轉(zhuǎn)換點序列K,同時將數(shù)據(jù)收集節(jié)點期望的編碼度數(shù)D_exp賦值為1,將數(shù)據(jù)收集節(jié)點接收到的分組數(shù)量C_recv賦值為0;
S102:當(dāng)數(shù)據(jù)收集節(jié)點接收到分組Pr,進(jìn)入如下子步驟:
S1021:將C_recv的值做+1操作;
S1022:如果C_recv>K[D_exp],則對D_exp的值做+1操作,同時將D_exp的值賦值給鄰居廣播編碼度數(shù)D_adv;其中K[D_exp]表示在編碼度數(shù)為D_exp的時候,要增加編碼度數(shù)所需要累計接收到的分組數(shù)量;
S1033:如果分組Pr的度數(shù)Pr.degree<D_exp或(Pr.degree=D_exp且Pr.flags&DEGREE_UPDATE=0),則將D_exp的值賦值給鄰居廣播的編碼度數(shù)D_adv;其中,Pr.flags表示分組Pr中設(shè)置的標(biāo)識位,DEGREE_UPDATE為編碼分組的一個二進(jìn)制標(biāo)識,值為1表示編碼節(jié)點已經(jīng)接收到數(shù)據(jù)收集節(jié)點發(fā)送的編碼度數(shù)更新廣播信息,否則沒有收到數(shù)據(jù)手機節(jié)點的度數(shù)廣播信息;
S1023:返回步驟S1022;
所述的傳感器節(jié)點編碼度數(shù)增長控制子步驟包括以下子步驟:
S201:初始化,根據(jù)節(jié)點獲取到的網(wǎng)絡(luò)規(guī)模N計算度數(shù)轉(zhuǎn)換點序列K,同時將K的值賦值給傳感器節(jié)點更新的度數(shù)轉(zhuǎn)換點序列K_update,將傳感器節(jié)點當(dāng)前的編碼度數(shù)D_now賦值為1,將傳感器節(jié)點當(dāng)前編碼度數(shù)的狀態(tài)D_now.state賦值為0,將傳感器節(jié)點常規(guī)分組的發(fā)送量C_regular_send賦值為0,將傳感器節(jié)點探聽分組的發(fā)送量C_listen_send賦值為0;
S202:當(dāng)傳感器節(jié)點收到廣播的編碼度數(shù)D_adv,進(jìn)入如下子步驟:
S2021:如果D_adv>D_now,則更新編碼度數(shù):將D_now賦值給D_adv,將STATE_UPDATE賦值給D_now.state;同時更新度數(shù)轉(zhuǎn)換點序列:將(C_regular_send+C_listen_send)/K[D_now-1]賦值給alpha,同時將K*alpha賦值給K_update;
S2022:如果D_adv=D_now且D_now.state≠STATE_UPDATE,則將STATE_UPDATE賦值給D_now.state,將(C_regular_send+C_listen_send)/K[D_now-1]賦值給alpha,同時將K*alpha賦值給K_update;其中,STATE_UPDATE表示在編碼節(jié)點出儲存的當(dāng)前編碼度數(shù)D_now的狀態(tài)是否為最新,STATE_UPDATE=1表示編碼節(jié)點已更新當(dāng)前編碼度數(shù)并與數(shù)據(jù)收集節(jié)點期望的編碼度數(shù)一致,否則節(jié)點當(dāng)前編碼度數(shù)未更新或與數(shù)據(jù)收集節(jié)點期望的編碼度數(shù)不一致;
S203:當(dāng)傳感器節(jié)點發(fā)送分組Ps,進(jìn)入如下子步驟:
如果D_now.state=STATE_UPDATE,則Ps.flags|=DEGREE_UPDATE;
S204:當(dāng)傳感器節(jié)點收到編碼分組Pr,進(jìn)入如下子步驟:
S2041:如果Pr.degree>D_now且Pr.flags&DEGREE_UPDATE≠0,則將D_adv賦值給D_now,將STATE_UPDATE賦值給D_now.state,(C_regular_send+C_listen_send)/K[D_now-1]賦值給alpha,同時將K*alpha賦值給K_update;
S2042:如果Pr.degree=D_now且Pr.flags&DEGREE_UPDATE≠0,則將STATE_UPDATE賦值給D_now.state;
S205:如果將STATE_UPDATE賦值給D_now.state,則將next_degree()賦值給D_now,將~STATE_UPDATE賦值給D_now.state;其中,next_degree()表示編碼節(jié)點下一個使用的編碼度數(shù);
S206:返回步驟S202;
所述的傳感器節(jié)點數(shù)據(jù)分組轉(zhuǎn)發(fā)控制步驟包括以下子步驟:
S301:將傳感器節(jié)點的無線模塊運行在混雜模式下,傳感器節(jié)點收到兩種不同類型的分組,常規(guī)分組即目的物理地址是本節(jié)點的分組,以及探聽分組即目的物理地址非本節(jié)點的分組;
S302:如果傳感器節(jié)點收到常規(guī)分組Pr,進(jìn)入如下子步驟:
S3021:如果Pr未被轉(zhuǎn)發(fā)過,對Pr再編碼轉(zhuǎn)發(fā);
S3022:如果Pr已經(jīng)被轉(zhuǎn)發(fā)過,且(C_listen_send/C_regular_send)≥((N_neighbor-N_child)/N_child),對Pr再編碼轉(zhuǎn)發(fā);其中,C_listen_send表示傳感器節(jié)點探聽分組的發(fā)送量,C_regular_send表示傳感器節(jié)點常規(guī)分組的發(fā)送量,N_neighbor表示包括節(jié)點自身的鄰居節(jié)點數(shù)目,N_child表示包括節(jié)點自身的子節(jié)點數(shù)目;
S303:如果傳感器節(jié)點收到探聽分組Ps,且(C_listen_send/C_regular_send)<((N_neighbor-N_child)/N_child),進(jìn)入如下子步驟:
隨機延遲,對Ps再編碼轉(zhuǎn)發(fā);
S304:如果傳感器節(jié)點發(fā)送常規(guī)分組Pr,則C_regular_send的值做+1操作;如果傳感器節(jié)點發(fā)送探聽分組Ps,則C_listen_send的值做+1操作,同時調(diào)用節(jié)點編碼度數(shù)增長控制步驟;
S305:返回步驟S302;
所述的數(shù)據(jù)編碼步驟用于傳感器節(jié)點數(shù)據(jù)分組轉(zhuǎn)發(fā)控制步驟中的編碼,包括以下子步驟:
S401:如果是常規(guī)分組的編碼Pr,則將常規(guī)分組Pr賦值給P,否則將空碼字賦值給P;
S402:如果P.degree≥D_now,則轉(zhuǎn)發(fā)P,并進(jìn)入步驟S404;
S403:從碼字緩存c_set中選擇碼字P與進(jìn)行編碼,生成碼字P_new:如果P_new.degree>0,轉(zhuǎn)發(fā)P_new;否則放棄本次發(fā)送;
S404:結(jié)束;
所述的數(shù)據(jù)解碼步驟包括以下子步驟:
S501:等待,直到收到編碼分組P;
S502:如果P.degree=1,將P轉(zhuǎn)換為符號S,進(jìn)入步驟S507;如果P.degree>1,將P轉(zhuǎn)換為碼字C,進(jìn)入步驟S503;
S503:使用符號集合s_set化簡C:如果C.degree=0,C已解碼,丟棄C,進(jìn)入步驟S510;如果C.degree=1,解碼并生成符號S,進(jìn)入步驟S507;
S504:使用碼字集合c_set化簡C:如果C.degree=0,C是重復(fù)碼字,丟棄C,進(jìn)入步驟S510;如果C.degree=1,生成符號S,進(jìn)入步驟S507;
S505:使用C對c_set進(jìn)行化簡,如果化簡的c_set產(chǎn)生符號,則從c_set得到符號S,進(jìn)入步驟S507;
S506:將C加入c_set,并進(jìn)入步驟S510;
S507:輸入符號S;
S508:如果S未加入s_set,將S加入s_set,使用S對c_set化簡;否則丟棄S;
S509:如果c_set中有度數(shù)為1的碼字,將碼字轉(zhuǎn)換成符號S,返回步驟S508;
S510:結(jié)束。
所述的節(jié)點編碼度數(shù)增長控制步驟中,傳感器節(jié)點的度數(shù)增長要受到節(jié)點跳數(shù)的限制,跳數(shù)為1的節(jié)點可以達(dá)到K_update的最大度數(shù)D_max,跳數(shù)為2的節(jié)點則只能達(dá)到D_max-1,依次類推,跳數(shù)為H的節(jié)點的最大編碼度數(shù)為max(D_max-H+1,2)。
所述的傳感器節(jié)點數(shù)據(jù)分組轉(zhuǎn)發(fā)控制步驟中,將常規(guī)分組與探聽分組發(fā)送數(shù)量和節(jié)點的鄰居數(shù)與子節(jié)點數(shù)成比例;設(shè)節(jié)點有包括節(jié)點本身的鄰居數(shù)n、包括節(jié)點本身的子節(jié)點數(shù)c,則非子節(jié)點鄰居有(n-c)個,設(shè)當(dāng)前已發(fā)送的常規(guī)分組為tx個,探聽分組為ty個,那么:
所述的數(shù)據(jù)編碼步驟中碼字緩存的選擇包括以下子步驟:
S601:初始化,將空碼字賦值給碼字C_new,將碼字緩存集合c_set的第一位c_set.start賦值給索引變量index,將false狀態(tài)賦值給參與編碼的碼字中是否包含本節(jié)點未發(fā)送的碼字b_new_code;
S602:如果本節(jié)點產(chǎn)生的數(shù)據(jù)this_code已經(jīng)發(fā)送過且未被確認(rèn)且(D_now>1或c_set[index].send_count>0),則C_new+this_code賦值給C_new;其中,send_count為節(jié)點通過接收和發(fā)送分組的過程對碼字的優(yōu)先級;
S603:如果index=c_set.end,查找結(jié)束,進(jìn)入步驟S606;其中,c_set.end為碼字緩存集合c_set的最后一位;
S604:將c_set[index]賦值給C_cur,C_cur表示從碼字緩存集合中選擇一個編碼分組,進(jìn)入如下子步驟:
S6041:如果C_cur已經(jīng)被編碼過程選用,跳過該碼字,進(jìn)入步驟S605;
S6042:如果b_new_code=true,則進(jìn)行進(jìn)一步判斷:如果C_cur.send_count>0或者C_cur.send_count=0,結(jié)束碼字選擇,進(jìn)入步驟S606;
S6043:如果C_cur.send_count>SEND_COUNT_LIMIT,結(jié)束碼字選擇,進(jìn)入步驟S606;其中SEND_COUNT_LIMIT表示同一個分組的發(fā)送次數(shù)限制;
S6044:如果C_cur.send_count=0,將b_new_code賦值為true;
S6045:如果dist(C_new,C_cur)=C_new.degree+C_cur.degree且dist(C_new,C_cur)≤degree_x,則將C_new+C_cur的值賦給C_new,dist()表示兩個編碼分組之間的距離,degree_x表示要從碼字緩存中選出的碼字的總編碼度數(shù);
S605:將index的值做+1操作,返回步驟S605;
S606:如果C_new.degree=0,則編碼失??;否則,編碼成功,返回C_new。
所述的send_count的值越大,代表該碼字的優(yōu)先級越低;當(dāng)傳感器從父節(jié)點收到一個碼字,該碼字的send_count增加值為P1;從同一級的節(jié)點收到一個碼字或本節(jié)點發(fā)送一個碼字,該碼字的send_count增加值為P2;從子節(jié)點收到一個碼字,該碼字的send_count增加值為P3,為了保證距離數(shù)據(jù)收集節(jié)點更遠(yuǎn)的節(jié)點產(chǎn)生的數(shù)據(jù)能以較大概率到達(dá)數(shù)據(jù)收集節(jié)點,P1、P2和P3滿足:
P1>P2>P3。
所述的數(shù)據(jù)解碼步驟中,在步驟S501之前還包括一個過濾子步驟,包括以下子步驟:
S701:接收到碼字P;
S702:如果碼字P被包含于碼字緩存c_set中,即P=c_set[i],則丟棄P,并增加對應(yīng)碼字緩存c_set[i]的優(yōu)先級,進(jìn)入步驟S706;
S703:如果碼字P包含碼字緩存c_set[i]中,使用c_set[i]化簡P,并增加對應(yīng)碼字緩存c_set[i]的優(yōu)先級;
S704:如果碼字緩存c_set[i]包含碼字P,進(jìn)入如下子步驟:
S7041:如果c_set未滿,使用P化簡c_set[i],則將P存入c_set,并進(jìn)入步驟S706;
S7042:如果c_set已滿且c_set[i].degree≤D_now,則丟棄P,并進(jìn)入步驟S706;
S7043:否則,使用P替換c_set[i],并進(jìn)入步驟S706;
S705:如果c_set未滿,將P存入c_set,并進(jìn)入步驟S706;如果c_set已滿,進(jìn)入如下子步驟:
S7051:如果P.degree≥D_now,并進(jìn)行進(jìn)一步判斷:如果max_degree(c_set)≤P.degree,則丟棄P,并進(jìn)入步驟S706;否則,使用P替換c_set中滿足max_degree(c_set)>P.degree的分組中send_count最大的分組,并進(jìn)入步驟S706;
S7052:如果P.degree<D_now,使用P替換c_set中send_count最大的分組中度數(shù)最小的分組,并進(jìn)入步驟S706;
S706:結(jié)束。
本發(fā)明的有益效果是:本發(fā)明的目標(biāo)是通過網(wǎng)絡(luò)編碼方案提高無線傳感器網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)慕研?。面對無線傳感器網(wǎng)絡(luò)數(shù)據(jù)傳輸丟失可能性大情況,我們利用Growth Codes的數(shù)據(jù)分布存儲和網(wǎng)絡(luò)編碼思想,并結(jié)合RPL路由協(xié)議對Growth Codes的編碼方案提出了改進(jìn)。通過仿真測試并與未添加網(wǎng)絡(luò)編碼方案的網(wǎng)絡(luò)對比,驗證了我們所設(shè)計的基于Growth Codes的網(wǎng)絡(luò)編碼方案,使得運行RPL路由協(xié)議的無線傳感器網(wǎng)絡(luò)的數(shù)據(jù)傳輸?shù)目煽啃缘玫搅孙@著的提高。同時,該方案在數(shù)據(jù)傳輸過程中發(fā)送分組數(shù)量與鏈路質(zhì)量相關(guān),傳感器節(jié)點編碼的運算復(fù)雜度適當(dāng),實現(xiàn)該方案的開銷合理。具體地:
(1)、節(jié)點掌握一部分拓?fù)湫畔?,并了解?shù)據(jù)收集節(jié)點的方向,因此可以選擇靠近數(shù)據(jù)收集節(jié)點的鄰居發(fā)送數(shù)據(jù),避免產(chǎn)生數(shù)據(jù)環(huán)路和數(shù)據(jù)逆流。
(2)、為了降低發(fā)送分組的開銷,不采用Growth Codes的分布式度數(shù)增長方案,本文采用帶編碼度數(shù)反饋機制的方案,同時修改數(shù)據(jù)轉(zhuǎn)發(fā)策略。
(3)、針對距離數(shù)據(jù)收集節(jié)點遠(yuǎn)的節(jié)點發(fā)出的數(shù)據(jù)到達(dá)數(shù)據(jù)收集節(jié)點的概率較低的問題,編碼節(jié)點優(yōu)先轉(zhuǎn)發(fā)這些數(shù)據(jù)。
(4)、提高解碼器性能:使用碼字集合和符號集合對接收分組解碼。
附圖說明
圖1為本發(fā)明緩存碼字選擇的流程圖;
圖2為本發(fā)明數(shù)據(jù)收集節(jié)點的解碼的流程圖;
圖3為仿真分析中Random Network部署節(jié)點示意圖;
圖4為仿真分析中Grid Network部署節(jié)點示意圖;
圖5為Random Network部署的數(shù)據(jù)收集率統(tǒng)計曲線示意圖;
圖6為Grid Network部署的數(shù)據(jù)收集率統(tǒng)計曲線示意圖;
圖7為Random Network部署的分組發(fā)送量統(tǒng)計曲線示意圖;
圖8為Grid Network部署的分組發(fā)送量統(tǒng)計曲線示意圖。
具體實施方式
下面結(jié)合附圖進(jìn)一步詳細(xì)描述本發(fā)明的技術(shù)方案:
Growth Codes設(shè)定的網(wǎng)絡(luò)環(huán)境是“零配置”的,節(jié)點無法獲得有效的網(wǎng)絡(luò)拓?fù)湫畔ⅰT诒疚脑O(shè)定的場景中,網(wǎng)絡(luò)編碼應(yīng)用于運行RPL路由協(xié)議的網(wǎng)絡(luò)中,節(jié)點可以利用已知的拓?fù)湫畔?yōu)化改進(jìn)網(wǎng)絡(luò)編碼過程。本實施例中可以在以下幾個方面對Growth Codes的進(jìn)行改進(jìn):
一、節(jié)點掌握一部分拓?fù)湫畔?,并了解?shù)據(jù)收集節(jié)點的方向,因此可以選擇靠近數(shù)據(jù)收集節(jié)點的鄰居發(fā)送數(shù)據(jù),避免產(chǎn)生數(shù)據(jù)環(huán)路和數(shù)據(jù)逆流。
二、為了降低發(fā)送分組的開銷,不采用Growth Codes的分布式度數(shù)增長方案,本文采用帶編碼度數(shù)反饋機制的方案,同時修改數(shù)據(jù)轉(zhuǎn)發(fā)策略。
三、針對距離數(shù)據(jù)收集節(jié)點遠(yuǎn)的節(jié)點發(fā)出的數(shù)據(jù)到達(dá)數(shù)據(jù)收集節(jié)點的概率較低的問題,編碼節(jié)點優(yōu)先轉(zhuǎn)發(fā)這些數(shù)據(jù)。
四、提高解碼器性能:使用碼字集合和符號集合對接收分組解碼。
具體地:
一、由于第一個改進(jìn)方面主要是利用了RPL路由協(xié)議產(chǎn)生的拓?fù)湫畔?,因此以下不再詳述?/p>
二、修改的度數(shù)增長策略
在運行RPL路由協(xié)議的網(wǎng)絡(luò)中,為了利用網(wǎng)絡(luò)拓?fù)湫畔⒉⒔档途幋a算法的開銷,典型Growth Codes中的分布式算法并不是最優(yōu)的。
由于傳感器節(jié)點具有路由器的功能,而數(shù)據(jù)總是定向匯集到數(shù)據(jù)收集節(jié)點,因此靠近數(shù)據(jù)收集節(jié)點的傳感器節(jié)點發(fā)送的分組要明顯多于位于網(wǎng)絡(luò)邊緣的節(jié)點。Growth Codes采用的分布式編碼過程,假設(shè)每個節(jié)點都需要負(fù)責(zé)發(fā)送網(wǎng)絡(luò)中的所有數(shù)據(jù),所以每個節(jié)點采用相同的度數(shù)分布,雖然實現(xiàn)方式比較簡單,但是由于前面的假設(shè),各個節(jié)點發(fā)送的分組數(shù)量較多。
本實施例采用帶有編碼度數(shù)反饋的編碼復(fù)雜度增長方案。數(shù)據(jù)收集節(jié)點根據(jù)接收分組數(shù)量決定編碼復(fù)雜度(編碼度數(shù))增長的時機,并發(fā)布編碼度數(shù)增長信息。傳感器節(jié)點則通過數(shù)據(jù)分組捎帶傳播度數(shù)增長信息。
下述部分分別詳細(xì)描述了數(shù)據(jù)收集節(jié)點和傳感器節(jié)點如何進(jìn)行編碼度數(shù)增長控制。
具體地,數(shù)據(jù)收集節(jié)點的度數(shù)轉(zhuǎn)換過程:
傳感器節(jié)點的度數(shù)轉(zhuǎn)換過程:
由于網(wǎng)絡(luò)邊緣的節(jié)點可發(fā)送的分組較少,難以編碼高復(fù)雜度的分組,且高復(fù)雜度分組不利于中間節(jié)點對分組進(jìn)行再編碼,因此網(wǎng)絡(luò)邊緣節(jié)點不需要采用與數(shù)據(jù)收集節(jié)點相鄰的節(jié)點相同的度數(shù)分布,所以傳感器節(jié)點的度數(shù)增長要受到節(jié)點跳數(shù)的限制。跳數(shù)為1的節(jié)點可以達(dá)到K_update的最大度數(shù)D_max,跳數(shù)為2的節(jié)點則只能達(dá)到D_max-1,依次類推,跳數(shù)為H的節(jié)點的最大編碼度數(shù)為max(D_max-H+1,2)。節(jié)點在執(zhí)行度數(shù)增長算法next_degree()時,必須首先考慮跳數(shù)限制。
三、數(shù)據(jù)轉(zhuǎn)發(fā)策略
考慮數(shù)據(jù)發(fā)送的情景。初始階段,所有節(jié)點都發(fā)送度數(shù)為1的報文,這樣,如果不考慮鏈路丟包及網(wǎng)絡(luò)擁塞,也不考慮編碼,由于網(wǎng)絡(luò)運行路由協(xié)議,則數(shù)據(jù)收集節(jié)點將一次性收集齊所有節(jié)點發(fā)送的報文。如果在高誤碼率和丟包率的網(wǎng)絡(luò)中,考慮報文在傳輸過程中的丟失,則數(shù)據(jù)收集節(jié)點只能收集到部分報文;然后考慮加入編碼,由于中間節(jié)點要轉(zhuǎn)發(fā)分組,其統(tǒng)計的發(fā)送次數(shù)可能滿足度數(shù)增長要求,因此數(shù)據(jù)收集節(jié)點收到的分組還會包含度數(shù)大于1的分組。
根據(jù)上述情況,需要網(wǎng)絡(luò)中的節(jié)點增加發(fā)送的數(shù)據(jù),才能使數(shù)據(jù)收集節(jié)點完成解碼操作,從而收到盡可能多的或全部的原始數(shù)據(jù)。由于我們使用的Growth Codes利用到了數(shù)據(jù)收集節(jié)點已經(jīng)收到部分原始分組這一信息,因此可以不斷提高編碼復(fù)雜度,減少重發(fā)分組數(shù)量,從而減少因重發(fā)分組而消耗的能量。
為了在增加數(shù)據(jù)到達(dá)數(shù)據(jù)收集節(jié)點的可能性的同時增加節(jié)點的編碼機會,我們應(yīng)該充分利用無線信道的廣播特性。在數(shù)據(jù)鏈路層進(jìn)行分組探聽,即開啟混雜模式,可以使數(shù)據(jù)傳播范圍更寬,使數(shù)據(jù)具有延多條路徑到達(dá)數(shù)據(jù)收集節(jié)點的可能性。通過接收探聽分組,節(jié)點可以接收到來自更多其它節(jié)點的數(shù)據(jù),因此具有更多的編碼機會,使數(shù)據(jù)更有效的在網(wǎng)絡(luò)中擴散。
節(jié)點的無線模塊運行在混雜模式下,因此節(jié)點會收到兩種不同類型的分組,即目的物理地址是本節(jié)點的分組(常規(guī)分組)以及目的物理地址非本節(jié)點的分組(探聽分組)。顯然,節(jié)點不能全部轉(zhuǎn)發(fā)探聽到的分組,否則在節(jié)點密度大的區(qū)域,各個節(jié)點互相轉(zhuǎn)發(fā)探聽到的分組,會形成惡性的廣播風(fēng)暴。因此,應(yīng)該使用適當(dāng)?shù)霓D(zhuǎn)發(fā)策略,將兩類分組的發(fā)送結(jié)合起來。
首先,為了保證常規(guī)編碼分組的傳輸,在收到常規(guī)編碼分組后,立即進(jìn)行再編碼轉(zhuǎn)發(fā),避免延遲。
為了避免節(jié)點密度大的區(qū)域探聽分組轉(zhuǎn)發(fā)過多,同時保證節(jié)點密度小的區(qū)域適當(dāng)發(fā)送分組,我們考慮使常規(guī)分組與探聽分組發(fā)送數(shù)量和節(jié)點的鄰居數(shù)與子節(jié)點數(shù)成比例。設(shè)節(jié)點有鄰居數(shù)n(包括節(jié)點本身)、子節(jié)點數(shù)c(包括節(jié)點本身),則非子節(jié)點鄰居有(n-c)個,設(shè)當(dāng)前已發(fā)送的常規(guī)分組為tx個,探聽分組為ty個,那么:
如果c=10,n-c=5,即節(jié)點有10個子節(jié)點,5個非子節(jié)點鄰居,那么ty=0.5tx,即探聽分組發(fā)送數(shù)量為正常分組發(fā)送數(shù)量的一半;如果c=1,n-c=2,即節(jié)點有一個子節(jié)點(節(jié)點本身)和兩個非子節(jié)點鄰居,那么ty=2.0tx,即探聽分組發(fā)送數(shù)為正常分組發(fā)送數(shù)量的2倍。
以下描述了傳感器節(jié)點的分組轉(zhuǎn)發(fā)控制算法。
分組轉(zhuǎn)發(fā)控制過程:
子節(jié)點數(shù)c=1的節(jié)點,在RPL網(wǎng)絡(luò)中,實際上既沒有子節(jié)點,也沒有位于同一級的鄰居節(jié)點,該節(jié)點只能探聽到父節(jié)點發(fā)送的分組。所以,這樣的節(jié)點除了發(fā)送自身產(chǎn)生的分組之外,不必轉(zhuǎn)發(fā)其他分組。由于這類節(jié)點位于網(wǎng)絡(luò)邊緣,通常距離數(shù)據(jù)收集節(jié)點較遠(yuǎn),而數(shù)據(jù)到達(dá)數(shù)據(jù)收集節(jié)點的概率隨著與數(shù)據(jù)收集節(jié)點的距離的增加而指數(shù)遞減,因此為了提高網(wǎng)絡(luò)邊緣數(shù)據(jù)到達(dá)數(shù)據(jù)收集節(jié)點的概率,這些節(jié)點將按照探聽分組的發(fā)送方式嘗試重發(fā)自身生成的數(shù)據(jù)。由于任何節(jié)點都可以探聽到其他節(jié)點發(fā)送的分組,如果接收分組中包含節(jié)點自身的數(shù)據(jù)且分組來自距離數(shù)據(jù)收集節(jié)點較近的節(jié)點,則停止本節(jié)點數(shù)據(jù)的重發(fā)。這種方式可以擴展作為所有節(jié)點分組確認(rèn)的一種輔助方式。
四、編碼算法
當(dāng)節(jié)點準(zhǔn)備發(fā)送分組時,總是先根據(jù)已有信息,對數(shù)據(jù)進(jìn)行“異或”運算得到碼字,然后再發(fā)送。實施例中第三節(jié)提到發(fā)送的分組分為兩類,即常規(guī)分組和探聽分組,常規(guī)分組的編碼是將要發(fā)送的常規(guī)分組與碼字緩存中選出的分組進(jìn)行運算,而探聽分組參與編碼的所有分組都來自碼字緩存。
以下描述了編碼算法:
編碼過程:
編碼算法的核心在于如何選擇碼字緩存中的碼字,使得未知數(shù)據(jù)能盡可能向數(shù)據(jù)收集節(jié)點傳遞。同時,要注意編碼碼字中包含的未知信息不能太多,導(dǎo)致數(shù)據(jù)收集節(jié)點不能對接收到的碼字解碼。
碼字緩存中的碼字按照優(yōu)先級以及碼字的度數(shù)進(jìn)行排序,使得發(fā)送分組時按優(yōu)先級選擇碼字進(jìn)行編碼。節(jié)點通過接收和發(fā)送分組的過程對碼字的優(yōu)先級進(jìn)行評估,本文將該評估值命名為send_count,該參數(shù)并不準(zhǔn)確代表發(fā)送次數(shù),而是包含發(fā)送次數(shù)在內(nèi)的一種信息,send_count的值越大,代表該碼字的優(yōu)先級越低。當(dāng)傳感器從父節(jié)點收到一個碼字,該碼字的send_count增加值為P1;從同一級的節(jié)點收到一個碼字或本節(jié)點發(fā)送一個碼字,該碼字的send_count增加值為P2;從子節(jié)點收到一個碼字,該碼字的send_count增加值為P3,為了保證距離數(shù)據(jù)收集節(jié)點更遠(yuǎn)的節(jié)點產(chǎn)生的數(shù)據(jù)能以較大概率到達(dá)數(shù)據(jù)收集節(jié)點,P1、P2和P3應(yīng)該滿足:
P1>P2>P3
碼字緩存中比較特殊的一個碼字是本節(jié)點自身生成的數(shù)據(jù)構(gòu)成的度數(shù)為1的碼字。為了保證本節(jié)點的數(shù)據(jù)能夠被傳遞到數(shù)據(jù)收集節(jié)點,該碼字總是單獨儲存,并不參與上述的優(yōu)先級排序過程,以避免隨后碼字緩存填滿之后該碼字被覆蓋。
如果要求從碼字緩存中選擇碼字編碼生成不超過指定度數(shù)的新碼字,圖1給出了緩存碼字選擇的流程圖,下文給出了算法更加詳細(xì)的描述。
五、解碼算法
Growth Codes中用于理論推導(dǎo)的受限解碼器S只利用已收集的符號對接收碼字進(jìn)行解碼,并將不能解碼的碼字丟棄。實際上暫時不能解碼的碼字包含未知數(shù)據(jù),在獲取更多信息后,可能從中恢復(fù)出新的符號,例如數(shù)據(jù)收集節(jié)點收到一個暫時不能解碼的碼字(x1+x2),如果將碼字緩存起來,稍后收到(x1+x2+x3),則可以直接解碼得到x3;另一種情況,如果稍后一個碼字解碼得到x1,則可以從緩存中解碼得到x2。因此改進(jìn)的解碼算法將緩存暫時不能解碼的碼字。而解碼過程既可以利用符號集合也可以利用碼字集合,增加了解碼成功恢復(fù)數(shù)據(jù)的可能性。
以下敘述了數(shù)據(jù)收集節(jié)點的解碼算法,圖2以流程圖的形式描述了該算法。
解碼過程1:
解碼過程2:(輸入符號)
當(dāng)碼字的編碼度數(shù)較高時,中間節(jié)點進(jìn)行再編碼的可能性便降低了,而中間節(jié)點通過再編碼可以選擇優(yōu)先級較高的分組進(jìn)行傳輸,因此這樣不利于提高數(shù)據(jù)傳輸?shù)目煽啃浴榱私鉀Q這一問題,中間節(jié)點將對接收分組進(jìn)行部分解碼(解碼運算復(fù)雜度比數(shù)據(jù)收集節(jié)點要低),化簡碼字以降低碼字的度數(shù),以利于重新編碼。由于傳感器節(jié)點只收集了碼字,因此只使用碼字集合對接收碼字進(jìn)行化簡,以及使用接收碼字對碼字集合進(jìn)行化簡。
傳感器節(jié)點化簡碼字的過程與碼字緩存的管理相結(jié)合。碼字緩存條目數(shù)量的設(shè)定與平臺的存儲容量相關(guān),通常傳感器節(jié)點的存儲資源有限,因此這一數(shù)量不會太大,這限制了緩存分組的數(shù)目,使編碼機會減少。為了減小存儲空間受限對編碼機會的影響,傳感器節(jié)點需要對接收的編碼分組進(jìn)行過濾,對于不滿足編碼需要的分組不加入編碼緩存,同時動態(tài)更新編碼緩存,隨著編碼度數(shù)以及發(fā)送次數(shù)的增長,緩存中的某些分組可能不再滿足設(shè)定的過濾條件,這些分組將隨著新分組的加入而被移除。分組過濾條件與當(dāng)前編碼度數(shù)、已緩存碼字等有關(guān)。以下描述了本實施例的過濾算法。
參數(shù)定義:
c_set:碼字緩存;
D_now:當(dāng)前編碼度數(shù)
碼字過濾過程:
數(shù)據(jù)收集節(jié)點可以使用較大的接收緩存,且緩存的碼字?jǐn)?shù)量較少(大部分可以即時解碼),因此采用不同的過濾策略,其分組過濾策略和解碼過程是相聯(lián)系的(數(shù)據(jù)收集節(jié)點只丟棄已解碼的和重復(fù)的碼字)。
六、仿真分析
在本文中,仿真使用的軟件為COOJA——專為Contiki操作系統(tǒng)設(shè)計的仿真軟件,它可以使用硬件平臺和抽象平臺進(jìn)行仿真。我們在小規(guī)模的網(wǎng)絡(luò)中評估我們設(shè)計的網(wǎng)絡(luò)編碼方案。網(wǎng)絡(luò)由24個傳感器節(jié)點和1個數(shù)據(jù)收集節(jié)點組成,傳感器節(jié)點不僅要發(fā)送自身產(chǎn)生的數(shù)據(jù),還需要為鄰居節(jié)點轉(zhuǎn)發(fā)數(shù)據(jù)。
我們使用了兩種方式部署節(jié)點,如圖3和圖4所示。其中圖3為Random Network,圖4為Grid Network。圖中,①為數(shù)據(jù)收集節(jié)點。
網(wǎng)絡(luò)的其他一些參數(shù)和屬性描述如下。節(jié)點的有效通信半徑設(shè)置為50m,在有效通信距離之外還有一段信號干擾區(qū)域(有效通信范圍向外延伸20m)。處在干擾區(qū)域中節(jié)點不僅不能收到有效通信范圍外的節(jié)點發(fā)送的分組,接收有效通信范圍內(nèi)節(jié)點發(fā)送的分組也會受到影響。另外,COOJA可以仿真產(chǎn)生沖突的情況,即多個發(fā)送節(jié)點發(fā)送數(shù)據(jù)的時間點非常接近,則會導(dǎo)致部分或全部節(jié)點數(shù)據(jù)發(fā)送失敗。
我們在仿真過程中需要修改的參數(shù)是鏈路質(zhì)量,用節(jié)點接收分組的成功率RX來反應(yīng)鏈路質(zhì)量。我們分別對RX取表5-1中的值的情況進(jìn)行仿真。
表5-1鏈路質(zhì)量的取值范圍
RX 50% 60% 70% 80% 90% 100%
我們假設(shè)網(wǎng)絡(luò)中所有傳感器節(jié)點在設(shè)定的開始時間后的0~3s內(nèi)隨機選擇時間發(fā)送節(jié)點自身產(chǎn)生的數(shù)據(jù)。我們的設(shè)計目標(biāo)是提高數(shù)據(jù)傳輸?shù)慕研?,因此我們要測量數(shù)據(jù)收集節(jié)點的數(shù)據(jù)收集率,即數(shù)據(jù)收集節(jié)點解碼恢復(fù)的原始數(shù)據(jù)量與傳感器節(jié)點發(fā)送的原始數(shù)據(jù)量之比。另外,我們要測試網(wǎng)絡(luò)中編碼分組的發(fā)送(包括轉(zhuǎn)發(fā))量,以評估網(wǎng)絡(luò)編碼帶來的開銷。最后,我們還要測量數(shù)據(jù)收集節(jié)點收集數(shù)據(jù)的速率,以衡量網(wǎng)絡(luò)編碼帶來的時延以及解碼的效率。
為了使我們的仿真結(jié)果更有說服性,我們增加了一組對比仿真,即不使用網(wǎng)絡(luò)編碼方案,傳感器節(jié)點按照RPL路由協(xié)議進(jìn)行數(shù)據(jù)交付。
(1)數(shù)據(jù)收集率
我們分別對兩種部署方式的網(wǎng)絡(luò)在給定的鏈路質(zhì)量下進(jìn)行了測試,每種網(wǎng)絡(luò)配置進(jìn)行了10次測試,記錄并分析網(wǎng)絡(luò)輸出信息,我們得到了以下結(jié)果,如圖5和圖6所示。
分析兩種部署方式下,與沒有任何數(shù)據(jù)處理機制的情況相比,加入網(wǎng)絡(luò)編碼方案后可以顯著提升數(shù)據(jù)傳遞到數(shù)據(jù)收集節(jié)點的可靠性。另外,可以看到即使在鏈路質(zhì)量良好的情況下(RX=100%),沒有網(wǎng)絡(luò)編碼的對比方案的數(shù)據(jù)收集率仍然比加入網(wǎng)絡(luò)編碼的要低一些,這是因為網(wǎng)絡(luò)中還存在沖突和干擾,而對比方案沒有任何抵抗這些威脅的措施。
(2)分組發(fā)送量
在測量數(shù)據(jù)收集率的同時,我們還對網(wǎng)絡(luò)中編碼分組的發(fā)送量進(jìn)行了記錄。對比方案中沒有編碼分組,我們統(tǒng)計的是所有發(fā)送和轉(zhuǎn)發(fā)的數(shù)據(jù)分組的數(shù)量,兩者是等價的。圖7和8給出了兩種部署方式下的仿真結(jié)果。
沒有加入網(wǎng)絡(luò)編碼的方案,鏈路質(zhì)量越差,分組發(fā)送量越少。因為一部分分組在傳輸過程中丟失,導(dǎo)致轉(zhuǎn)發(fā)分組的次數(shù)減少了。
加入網(wǎng)絡(luò)編碼的情況下,鏈路質(zhì)量越差,分組發(fā)送量越多。這樣才能保證數(shù)據(jù)傳遞到數(shù)據(jù)收集節(jié)點的概率。兩種網(wǎng)絡(luò)拓?fù)湎?,發(fā)送分組量在可接受范圍內(nèi),隨著鏈路質(zhì)量提高,發(fā)送開銷越小,符合設(shè)計要求。
本實施例的目標(biāo)是通過網(wǎng)絡(luò)編碼方案提高無線傳感器網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)慕研汀C鎸o線傳感器網(wǎng)絡(luò)數(shù)據(jù)傳輸丟失可能性大情況,我們利用Growth Codes的數(shù)據(jù)分布存儲和網(wǎng)絡(luò)編碼思想,并結(jié)合RPL路由協(xié)議對Growth Codes的編碼方案提出了改進(jìn)。通過仿真測試并與未添加網(wǎng)絡(luò)編碼方案的網(wǎng)絡(luò)對比,驗證了我們所設(shè)計的基于Growth Codes的網(wǎng)絡(luò)編碼方案,使得運行RPL路由協(xié)議的無線傳感器網(wǎng)絡(luò)的數(shù)據(jù)傳輸?shù)目煽啃缘玫搅孙@著的提高。同時,該方案在數(shù)據(jù)傳輸過程中發(fā)送分組數(shù)量與鏈路質(zhì)量相關(guān),傳感器節(jié)點編碼的運算復(fù)雜度適當(dāng),實現(xiàn)該方案的開銷合理。