1.一種基于RPL協(xié)議的改進(jìn)網(wǎng)絡(luò)編碼與數(shù)據(jù)傳輸方法,其特征在于:包括拓?fù)湫畔@取步驟、節(jié)點(diǎn)編碼度數(shù)增長(zhǎng)控制步驟、傳感器節(jié)點(diǎn)數(shù)據(jù)分組轉(zhuǎn)發(fā)控制步驟、數(shù)據(jù)編碼步驟和數(shù)據(jù)解碼步驟;所述的拓?fù)湫畔@取步驟包括:獲取RPL路由協(xié)議產(chǎn)生的拓?fù)湫畔?,并同時(shí)了解數(shù)據(jù)收集節(jié)點(diǎn)的方向,選擇靠近數(shù)據(jù)收集節(jié)點(diǎn)的鄰居發(fā)送數(shù)據(jù);
所述的節(jié)點(diǎn)編碼度數(shù)增長(zhǎng)控制步驟包括數(shù)據(jù)收集節(jié)點(diǎn)編碼度數(shù)增長(zhǎng)控制子步驟和傳感器節(jié)點(diǎn)編碼度數(shù)增長(zhǎng)控制子步驟;所述的數(shù)據(jù)收集節(jié)點(diǎn)編碼度數(shù)增長(zhǎng)控制子步驟包括以下子步驟:
S101:初始化,根據(jù)節(jié)點(diǎn)獲取到的網(wǎng)絡(luò)規(guī)模N計(jì)算度數(shù)轉(zhuǎn)換點(diǎn)序列K,同時(shí)將數(shù)據(jù)收集節(jié)點(diǎn)期望的編碼度數(shù)D_exp賦值為1,將數(shù)據(jù)收集節(jié)點(diǎn)接收到的分組數(shù)量C_recv賦值為0;
S102:當(dāng)數(shù)據(jù)收集節(jié)點(diǎn)接收到分組Pr,進(jìn)入如下子步驟:
S1021:將C_recv的值做+1操作;
S1022:如果C_recv>K[D_exp],則對(duì)D_exp的值做+1操作,同時(shí)將D_exp的值賦值給鄰居廣播編碼度數(shù)D_adv;其中K[D_exp]表示在編碼度數(shù)為D_exp的時(shí)候,要增加編碼度數(shù)所需要累計(jì)接收到的分組數(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)識(shí)位,DEGREE_UPDATE為編碼分組的一個(gè)二進(jìn)制標(biāo)識(shí),值為1表示編碼節(jié)點(diǎn)已經(jīng)接收到數(shù)據(jù)收集節(jié)點(diǎn)發(fā)送的編碼度數(shù)更新廣播信息,否則沒有收到數(shù)據(jù)手機(jī)節(jié)點(diǎn)的度數(shù)廣播信息;
S1023:返回步驟S1022;
所述的傳感器節(jié)點(diǎn)編碼度數(shù)增長(zhǎng)控制子步驟包括以下子步驟:
S201:初始化,根據(jù)節(jié)點(diǎn)獲取到的網(wǎng)絡(luò)規(guī)模N計(jì)算度數(shù)轉(zhuǎn)換點(diǎn)序列K,同時(shí)將K的值賦值給傳感器節(jié)點(diǎn)更新的度數(shù)轉(zhuǎn)換點(diǎn)序列K_update,將傳感器節(jié)點(diǎn)當(dāng)前的編碼度數(shù)D_now賦值為1,將傳感器節(jié)點(diǎn)當(dāng)前編碼度數(shù)的狀態(tài)D_now.state賦值為0,將傳感器節(jié)點(diǎn)常規(guī)分組的發(fā)送量C_regular_send賦值為0,將傳感器節(jié)點(diǎn)探聽分組的發(fā)送量C_listen_send賦值為0;
S202:當(dāng)傳感器節(jié)點(diǎn)收到廣播的編碼度數(shù)D_adv,進(jìn)入如下子步驟:
S2021:如果D_adv>D_now,則更新編碼度數(shù):將D_now賦值給D_adv,將STATE_UPDATE賦值給D_now.state;同時(shí)更新度數(shù)轉(zhuǎn)換點(diǎn)序列:將(C_regular_send+C_listen_send)/K[D_now-1]賦值給alpha,同時(shí)將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,同時(shí)將K*alpha賦值給K_update;其中,STATE_UPDATE表示在編碼節(jié)點(diǎn)出儲(chǔ)存的當(dāng)前編碼度數(shù)D_now的狀態(tài)是否為最新,STATE_UPDATE=1表示編碼節(jié)點(diǎn)已更新當(dāng)前編碼度數(shù)并與數(shù)據(jù)收集節(jié)點(diǎn)期望的編碼度數(shù)一致,否則節(jié)點(diǎn)當(dāng)前編碼度數(shù)未更新或與數(shù)據(jù)收集節(jié)點(diǎn)期望的編碼度數(shù)不一致;
S203:當(dāng)傳感器節(jié)點(diǎn)發(fā)送分組Ps,進(jìn)入如下子步驟:
如果D_now.state=STATE_UPDATE,則Ps.flags|=DEGREE_UPDATE;
S204:當(dāng)傳感器節(jié)點(diǎn)收到編碼分組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,同時(shí)將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é)點(diǎn)下一個(gè)使用的編碼度數(shù);
S206:返回步驟S202;
所述的傳感器節(jié)點(diǎn)數(shù)據(jù)分組轉(zhuǎn)發(fā)控制步驟包括以下子步驟:
S301:將傳感器節(jié)點(diǎn)的無線模塊運(yùn)行在混雜模式下,傳感器節(jié)點(diǎn)收到兩種不同類型的分組,常規(guī)分組即目的物理地址是本節(jié)點(diǎn)的分組,以及探聽分組即目的物理地址非本節(jié)點(diǎn)的分組;
S302:如果傳感器節(jié)點(diǎn)收到常規(guī)分組Pr,進(jìn)入如下子步驟:
S3021:如果Pr未被轉(zhuǎn)發(fā)過,對(duì)Pr再編碼轉(zhuǎn)發(fā);
S3022:如果Pr已經(jīng)被轉(zhuǎn)發(fā)過,且(C_listen_send/C_regular_send)≥((N_neighbor-N_child)/N_child),對(duì)Pr再編碼轉(zhuǎn)發(fā);其中,C_listen_send表示傳感器節(jié)點(diǎn)探聽分組的發(fā)送量,C_regular_send表示傳感器節(jié)點(diǎn)常規(guī)分組的發(fā)送量,N_neighbor表示包括節(jié)點(diǎn)自身的鄰居節(jié)點(diǎn)數(shù)目,N_child表示包括節(jié)點(diǎn)自身的子節(jié)點(diǎn)數(shù)目;
S303:如果傳感器節(jié)點(diǎn)收到探聽分組Ps,且(C_listen_send/C_regular_send)<((N_neighbor-N_child)/N_child),進(jìn)入如下子步驟:
隨機(jī)延遲,對(duì)Ps再編碼轉(zhuǎn)發(fā);
S304:如果傳感器節(jié)點(diǎn)發(fā)送常規(guī)分組Pr,則C_regular_send的值做+1操作;如果傳感器節(jié)點(diǎn)發(fā)送探聽分組Ps,則C_listen_send的值做+1操作,同時(shí)調(diào)用節(jié)點(diǎn)編碼度數(shù)增長(zhǎng)控制步驟;
S305:返回步驟S302;
所述的數(shù)據(jù)編碼步驟用于傳感器節(jié)點(diǎn)數(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)換為符號(hào)S,進(jìn)入步驟S507;如果P.degree>1,將P轉(zhuǎn)換為碼字C,進(jìn)入步驟S503;
S503:使用符號(hào)集合s_set化簡(jiǎn)C:如果C.degree=0,C已解碼,丟棄C,進(jìn)入步驟S510;如果C.degree=1,解碼并生成符號(hào)S,進(jìn)入步驟S507;
S504:使用碼字集合c_set化簡(jiǎn)C:如果C.degree=0,C是重復(fù)碼字,丟棄C,進(jìn)入步驟S510;如果C.degree=1,生成符號(hào)S,進(jìn)入步驟S507;
S505:使用C對(duì)c_set進(jìn)行化簡(jiǎn),如果化簡(jiǎn)的c_set產(chǎn)生符號(hào),則從c_set得到符號(hào)S,進(jìn)入步驟S507;
S506:將C加入c_set,并進(jìn)入步驟S510;
S507:輸入符號(hào)S;
S508:如果S未加入s_set,將S加入s_set,使用S對(duì)c_set化簡(jiǎn);否則丟棄S;
S509:如果c_set中有度數(shù)為1的碼字,將碼字轉(zhuǎn)換成符號(hào)S,返回步驟S508;
S510:結(jié)束。
2.根據(jù)權(quán)利要求1所述的一種基于RPL協(xié)議的改進(jìn)網(wǎng)絡(luò)編碼與數(shù)據(jù)傳輸方法,其特征在于:所述的節(jié)點(diǎn)編碼度數(shù)增長(zhǎng)控制步驟中,傳感器節(jié)點(diǎn)的度數(shù)增長(zhǎng)要受到節(jié)點(diǎn)跳數(shù)的限制,跳數(shù)為1的節(jié)點(diǎn)可以達(dá)到K_update的最大度數(shù)D_max,跳數(shù)為2的節(jié)點(diǎn)則只能達(dá)到D_max-1,依次類推,跳數(shù)為H的節(jié)點(diǎn)的最大編碼度數(shù)為max(D_max-H+1,2)。
3.根據(jù)權(quán)利要求1所述的一種基于RPL協(xié)議的改進(jìn)網(wǎng)絡(luò)編碼與數(shù)據(jù)傳輸方法,其特征在于:所述的傳感器節(jié)點(diǎn)數(shù)據(jù)分組轉(zhuǎn)發(fā)控制步驟中,將常規(guī)分組與探聽分組發(fā)送數(shù)量和節(jié)點(diǎn)的鄰居數(shù)與子節(jié)點(diǎn)數(shù)成比例;設(shè)節(jié)點(diǎn)有包括節(jié)點(diǎn)本身的鄰居數(shù)n、包括節(jié)點(diǎn)本身的子節(jié)點(diǎn)數(shù)c,則非子節(jié)點(diǎn)鄰居有(n-c)個(gè),設(shè)當(dāng)前已發(fā)送的常規(guī)分組為tx個(gè),探聽分組為ty個(gè),那么:
4.根據(jù)權(quán)利要求1所述的一種基于RPL協(xié)議的改進(jìn)網(wǎng)絡(luò)編碼與數(shù)據(jù)傳輸方法,其特征在于:所述的數(shù)據(jù)編碼步驟中碼字緩存的選擇包括以下子步驟:
S601:初始化,將空碼字賦值給碼字C_new,將碼字緩存集合c_set的第一位c_set.start賦值給索引變量index,將false狀態(tài)賦值給參與編碼的碼字中是否包含本節(jié)點(diǎn)未發(fā)送的碼字b_new_code;
S602:如果本節(jié)點(diǎn)產(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é)點(diǎn)通過接收和發(fā)送分組的過程對(duì)碼字的優(yōu)先級(jí);
S603:如果index=c_set.end,查找結(jié)束,進(jìn)入步驟S606;其中,c_set.end為碼字緩存集合c_set的最后一位;
S604:將c_set[index]賦值給C_cur,C_cur表示從碼字緩存集合中選擇一個(gè)編碼分組,進(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表示同一個(gè)分組的發(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()表示兩個(gè)編碼分組之間的距離,degree_x表示要從碼字緩存中選出的碼字的總編碼度數(shù);
S605:將index的值做+1操作,返回步驟S605;
S606:如果C_new.degree=0,則編碼失??;否則,編碼成功,返回C_new。
5.根據(jù)權(quán)利要求4所述的一種基于RPL協(xié)議的改進(jìn)網(wǎng)絡(luò)編碼與數(shù)據(jù)傳輸方法,其特征在于:所述的send_count的值越大,代表該碼字的優(yōu)先級(jí)越低;當(dāng)傳感器從父節(jié)點(diǎn)收到一個(gè)碼字,該碼字的send_count增加值為P1;從同一級(jí)的節(jié)點(diǎn)收到一個(gè)碼字或本節(jié)點(diǎn)發(fā)送一個(gè)碼字,該碼字的send_count增加值為P2;從子節(jié)點(diǎn)收到一個(gè)碼字,該碼字的send_count增加值為P3,為了保證距離數(shù)據(jù)收集節(jié)點(diǎn)更遠(yuǎn)的節(jié)點(diǎn)產(chǎn)生的數(shù)據(jù)能以較大概率到達(dá)數(shù)據(jù)收集節(jié)點(diǎn),P1、P2和P3滿足:
P1>P2>P3。
6.根據(jù)權(quán)利要求4所述的一種基于RPL協(xié)議的改進(jìn)網(wǎng)絡(luò)編碼與數(shù)據(jù)傳輸方法,其特征在于:所述的數(shù)據(jù)解碼步驟中,在步驟S501之前還包括一個(gè)過濾子步驟,包括以下子步驟:
S701:接收到碼字P;
S702:如果碼字P被包含于碼字緩存c_set中,即P=c_set[i],則丟棄P,并增加對(duì)應(yīng)碼字緩存c_set[i]的優(yōu)先級(jí),進(jìn)入步驟S706;
S703:如果碼字P包含碼字緩存c_set[i]中,使用c_set[i]化簡(jiǎn)P,并增加對(duì)應(yīng)碼字緩存c_set[i]的優(yōu)先級(jí);
S704:如果碼字緩存c_set[i]包含碼字P,進(jìn)入如下子步驟:
S7041:如果c_set未滿,使用P化簡(jiǎn)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é)束。