本发明属于水下无线传感器网络领域,特别涉及一种不需要时钟同步的水下移动节点网络自组织方法。
背景技术:
随着技术的进步,水下移动节点编队,例如:水下航行器编队、蛙人编队等,越来越多的被应用到海洋开发利用中。因此,水下移动节点间的信息交互与共享成为制约水下移动节点编队执行任务的一个关键因素。
在单跳通信距离达到km级以上时,水声通信仍是水下无线通信的主流方式。相比于无线信道,水声通信存在带宽受限、传播时延长、多普勒频偏大、信道变化快、能量消耗多等不利因素。当使用水声通信作为水下移动节点网络的物理层时,以下难点不可避免:
1.物理层误码率较高,一般在10-3量级,导致数据包错误率高;
2.半双工通信且信道资源受限,容易因为信号冲突丢失数据包;
3.信号传播时延长且受环境影响明显,节点间时钟同步困难且能耗大;
4.节点移动加速了链路状态的变化,使得网络路由变化快,不易跟踪;
5.节点携带能量有限且执行任务期间不易更换或补充。
以上困难使得目前针对水下移动节点网络的研究大多集中于:以大量固定节点为主、少量移动节点为辅的混合式水下网络(参考文献[1]:s.p.wang,m.yang,j.p.wang,etc.mobilenodedeploymentinhybridsensornetworks;参考文献[2]:y.c.wang,w.c.peng,m.h.chang,etc.exploringload-balancetodispatchmobilesensorsinwirelesssensornetworks;参考文献[3]:t.wimalajeewa,s.k.jayaweera.impactofmobilenodedensityondetectionperformancemeasuresinahybridsensornetwork;参考文献[4]:l.filipe,u.lee,m.gerla.phero-trai:abio-inspiredlocationserviceformobileunderwatersensornetworks);网络节点间的时钟同步方面(参考文献[5]:f.lu,d.mirza,c.schurgers.d-sync:doppler-basedtimesynchronizationformobileunderwatersensornetworks;参考文献[6]:j.liu,z.zhou,z.peng,etc.mobi-sync:efficienttimesynchronizationformobileunderwatersensornetworks;参考文献[7]:n.chirdchoo,w.s.soh,k.c.chua,etc.mu-sync:atimesynchronizationprotocolforunderwater);而针对网络路由的研究相对偏少。目前的移动节点网络路由主要是静态路由或者泛洪广播两种方法(参考文献[8]:j.j.kong,j.h.cui,d.p.wu,etc.buildingunderwaterad-hocnetworksandsensornetworksforlargescalereal-timeaquaticapplications;参考文献[9]:j.h.cui,j.j.kong,m.gerla,etc.thechallengesofbuildingscalablemobileunderwaterwirelesssensornetworksforaquaticapplications);前者适用于移动节点相对位置不变的情况,难以跟踪路由变化、难以达到信息交互和共享的目的;后者能耗较大且容易因为广播风暴造成信道拥塞;参考文献[10](f.salvi-garau,m.stojanovic.multi-clusterprotocolforadhocmobileunderwateracousticnetworks)提出了一种移动节点网络多簇路由方法,但是需要移动节点的地理位置信息作为支持。而由于电磁波在水下被严重吸收,gps系统基本无法在水下使用,在没有其他节点辅助的情况下,很难获取到水下节点的地理位置信息。
技术实现要素:
本发明的目的在于在没有时钟同步和地理位置的情况下,考虑到移动节点编队的通信特点,利用水声通信将水下移动节点编队快速自组织形成以广播类数据包为主、点对点数据包为辅的无线网络,使得编队中各个节点间能够通过网络进行信息交互与共享,并在通信过程中跟踪节点间链路和路由变化。
为了实现上述目的,本发明采用了如下的技术方案:
一种不需要时钟同步的水下移动节点网络自组织方法,所述方法包括:在布放水下移动节点时,由最后布放的节点发起网络自组织,在没有时钟同步的条件下形成路由表,并在通信过程中跟踪通信链路及路由变化。
作为上述方法的一种改进,所述方法具体包括:
步骤1)布放水下移动节点,布放前对各个节点进行初始化,并为各个节点设定唯一的节点编号及总节点数量;
步骤2)为最后布放的节点设定“存活klv”数据包和“融合fus”数据包的发送次数及时间,其余节点通过接收这两种数据包设定自身发送这两种数据包的次数及时间;所有节点通过收发上述两种数据包形成路由表;
步骤3)每个节点按照路由表收发“全体brd”数据包或者“单体prt”数据包、“回执ack”数据包进行正常通信,并通过数据包中的通行记录跟踪节点间的通信链路及路由变化。
作为上述方法的一种改进,所述步骤1)具体包括:
步骤1-1)设定y种数据包的时间长度ly,ly为正实数,单位为秒;
其中,y为正整数,数据包类型至少有5种:存活数据包klv、融合数据包fus、全体数据包brd、单体数据包prt和回执数据包ack;其中融合数据包fus和全体数据包brd属于广播类数据包,单体数据包prt和回执数据包ack属于点对点类数据包;除存活数据包klv外,其余4种数据包均包含变量通行记录;时间长度ly按下式设定
ly=by/rate(1)
其中,by为第y种数据包所占用的bit位数,by为正整数,单位bit,rate为移动节点通信速率,rate为正实数,单位bit/s;
步骤1-2)为各个节点设定水声网络包含的总移动节点数量t及当前节点地址t;
总节点数量t为正整数,且不大于通行记录所占用的bit位数;当前节点地址t为整数且t∈[0,t),且应保证不同节点的t在网络中是唯一的;
步骤1-3)设定klv发送次数的上限k,k为正整数,fus发送次数的上限f,f为正整数,prt重发计数器的上限c,c为正整数,prt回复时间限制h,h为正实数,单位为s,链路最大存活时间a,a为正实数,单位为s;
将a按照下式设定:
a=r/v(2)
其中,r为移动节点的通信半径,r为正实数,单位为m,v为移动节点最大移动速度,v为正实数,单位m/s;
步骤1-4)为各个节点建立空白路由表、空白接收记录表和空白链路存活表;
路由表是一个2维整型数组,行数为t,建议列数至少为2,行列序号均从0开始;该数组的行序号即对应各个节点地址;每一行各列元素取值为可以到达该行序号所对应节点的不同下一跳节点地址;初始化时均赋值为t,表示暂时无法通过网络中已有的节点路由访问到该行序号所对应节点;另外,第t行第0列赋值为t;
接收记录表是一个1维结构体数组,建议行数至少为2,行序号从0开始;每个结构体中包含接收包类型、接收包信源、接收包序号、接收时间共四个元素,前三个元素为整型,接收时间为实型;初始化时全部赋值为-1以清空,表示暂时没有接收到数据包;
链路存活表是一个1维实型数组,行数为t,行序号从0开始;每一行元素取值即为当前节点与该行序号所对应节点的链路存活时间倒计时,单位为s;链路存活表仅记录当前节点与1跳可以直接到达的其他节点间的链路存活时间倒计时;初始化时全部赋值为-1以清空,表示暂时没有可以到达其他节点的链路;将第t行的元素赋值为a;
步骤1-5)清零所有定时器、计数器,所有计数器从0开始计数;所有标志置为否;开启链路存活表更新定时器lat,该定时器时长不大于1s。
作为上述方法的一种改进,所述步骤2)具体包括:
步骤2-1)判断当前节点是否为最后布放的节点,如果“是”,转入步骤2-2)至步骤2-3),否则,转入步骤2-4);
步骤2-2)为最后布放的节点设定k次klv的时间和f次fus的时间,已设定标志置为“是”;最后布放的节点第0次发送klv的时间应设定在其布放完毕之后,记为t0;第k次发送klv的时间tk按照下式设定:
tk=t0 k×(2×t-1)×(l1 r/c)(3)
其中,k为整数,k∈[0,k);c为实数,表示布放海域的水中声速,单位为m/s;
第f次发送fus的时间t’f按照下式设定:
t’f=t’0 f×(2×t-1)×(l2 r/c)(4)
其中,f为整数,f∈[0,f);t’0为第0次发送fus的时间:
t’0=t0 k×(2×t-1)×(l1 r/c);
步骤2-3)最后布放的节点开启klv发送定时器klt,定时到第0次发送klv的时间,进入步骤2-4);
步骤2-4)当前节点等待中断并响应;如果是lat定时器中断,则进入步骤2-5);如果是klt定时器中断,则进入步骤2-6);如果是fut定时器中断,则进入步骤2-7);如果是接收数据中断,则进入步骤2-9);
步骤2-5)更新链路存活表和路由表;
遍历链路存活表的t行,若其中第i行的元素不大于0,则跳过该行继续遍历;否则,将该元素减去lat定时器的时长;如果减后该元素取值仍然大于0,则跳过该行继续遍历;否则,开始遍历路由表;若路由表中某行某列的元素取值等于i,则将该元素赋值为t;否则该元素取值不变继续遍历路由表;完成遍历链路存活表后,开启链路存活表更新定时器lat,返回步骤2-4);
步骤2-6)生成klv数据包并发送;
根据klv数据包格式生成空数据包,其中帧同步交由物理层赋值,数据类型赋值为klv,信源地址赋值为t,帧序号赋值为帧序号计数器当前值,帧序号计数器加1,校验赋值为上述变量校验和;发送该数据包后,klv计数器加1,进入步骤2-8);
步骤2-7)生成fus数据包并发送;
根据fus数据包格式生成空数据包,其中帧同步交由物理层赋值,数据类型赋值为fus,信源地址赋值为t,当前地址赋值为t,帧序号赋值为帧序号计数器当前值,帧序号计数器加1;遍历链路存活表,若其第i行的元素大于0,则将通行记录的第i个bit位置为1,否则保持0不变;校验赋值为上述变量校验和;发送该数据包后,fus计数器加1,进入步骤2-8);
步骤2-8)如果当前节点此时klv计数器小于k,则开启klv发送定时器klt,定时到下次发送klv的时间,进入步骤2-4);否则,如果当前节点此时fus计数器小于f,则开启fus发送定时器fut,定时到下次发送fus的时间,进入步骤2-4);否则,进入步骤3);
步骤2-9)当前节点根据接收数据的类型分别进行处理;处理完毕后返回步骤2-4)。
作为上述方法的一种改进,所述步骤2-9)具体包括:
步骤2-9-1)当前节点读取接收数据包的所有参数并进行校验,如果校验错误,则不做任何处理,返回步骤2-4);如果校验正确,则查看接收数据包类型:如果是klv类型数据,则进入步骤2-9-2);如果是fus类型数据,则进入步骤2-9-4);
步骤2-9-2)查看已设定标志,如果为“是”,则进入步骤2-9-3);否则,设定当前节点发送klv和fus的次数和时间;然后进入步骤2-9-3);
设接收数据包的信源地址为s,s为整数,s∈[0,t)、帧序号为l,l为整数,l∈[0,k),将当前节点帧序号计数器赋值为l,klv发送计数器也赋值为l,设定当前节点剩余k-l次发送klv的时间和f次发送fus的时间;
先按照下式设定当前节点其余k-l次发送klv的时间tk’,k’为整数,k’∈[l,k):
tk’=tl (k’-l)×(2×t-1)×(l1 r/c)(5)
其中,tl为当前节点第l次发送klv的时间,按照下式设定:
tl=tc ((t–s 1 t)%t)×(l1 r/c)(6)
其中,tc为当前节点的当前时间,%表示取余运算;
第f次发送fus的时间t’f按照下式设定:
t’f=t’0 f×(2×t-1)×(l2 r/c)(7)
其中,t’0为第0次发送fus的时间,t’0=tl (k-l)×(2×t-1)×(l1 r/c);
将已设定标志置为“是”;
步骤2-9-3)更新路由表和链路存活表;
将路由表第s行第0列的元素赋值为s;将链路存活表中第s行和第t行的元素赋值为a;返回步骤2-4);
步骤2-9-4)查看已设定标志,如果为“是”,则进入步骤2-9-5);否则,设定当前节点发送fus的次数和时间;然后进入步骤2-9-5);
设接收数据包的当前地址为u,u为整数,u∈[0,t)、帧序号为m,m为整数,m∈[k,f k),则将当前节点帧序号计数器赋值为m,klv发送计数器赋值为k,fus发送计数器赋值为m-k,设定当前节点剩余f k-m次发送fus的时间;
先按照下式设定当前节点其余f k-m次发送fus的时间t’f’,f’为整数,f’∈[m-k,f):
t’f’=t’m–k (f’–k m)×(t 1)×(2×t–1)×(l2 r/c)(8)
其中,t’m–k为当前节点第m-k次发送fus的时间,按下式设定:
t’m–k=tc ((t–u t)%t)×(2×t–1)×(l2 r/c)(9)
将已设定标志置为“是”;
步骤2-9-5)查看是否需要广播该fus数据包,如需要则广播;
设接收数据包的通行记录为np,np为整数,np∈[0,2t);将np复制一份,记为np’,将需要广播标志置为“否”,遍历链路存活表;如果np’的第i个bit位为0,同时链路存活表的第i行的元素大于0,则将np’的第i个bit位置为1,同时将需要广播标志置为“是”;否则,则继续遍历;
如果完成遍历时,需要广播标志为“否”,则进入步骤2-9-6);否则,将接收fus数据包的当前地址赋值为t,通行记录赋值为np’,其余变量不变,校验赋值为上述变量校验和;发送该数据包后进入步骤2-9-6);
步骤2-9-6)更新路由表和链路存活表;
将路由表第u行第0列的元素赋值为u;将链路存活表中第u行和第t行的元素赋值为a;
遍历接收记录表,如果接收记录表中存在某一行的前三个元素分别依次等于fus、s和m,则返回步骤2-4);否则,如果完成遍历时,接收记录表中不存在任何一行的前三个元素分别依次等于fus、s和m,则将接收记录表中空行或使用时间最早的一行中的元素分别依次赋值为fus、s、m、tc;
然后根据np更新路由表;依次遍历np的第i个bit位;若该bit位为0,则跳过该bit位继续遍历;若该bit位不为0,则遍历路由表第i行的各列;如果路由表该行中存在某一列元素的取值等于u,则跳过该bit位继续遍历;如果路由表该行中不存在任何一列的元素等于u,同时i不等于t、s也不等于t时,则将路由表该行中除第0列外时间最早一列的元素赋值为u;否则跳过该bit位继续遍历np;当遍历完np的所有bit位时,返回步骤2-4)。
作为上述方法的一种改进,所述步骤3)具体包括:
步骤3-1)当前节点发送brd数据包或者prt数据包进行正常通信,同时等待中断并响应;
如果是lat定时器中断,则进入步骤3-2);如果是应用业务产生的brd数据包则进入步骤3-3);如果是应用业务产生的prt数据包则进入步骤3-4);如果是act定时器中断,则进入步骤3-5);如果是接收数据中断,则进入步骤3-6);
步骤3-2)更新链路存活表和路由表;
遍历链路存活表的t行,若其中第i行的元素不大于0,则跳过该行继续遍历;否则,将该元素减去lat定时器的时长;如果减后该元素取值仍然大于0,则跳过该行继续遍历;否则,开始遍历路由表;若路由表中某行某列的元素取值等于i,则将该元素赋值为t;否则该元素取值不变继续遍历路由表;
完成遍历链路存活表后,开启链路存活表更新定时器lat,返回步骤3-1);
步骤3-3)生成brd数据包并发送;
根据brd数据包格式生成空数据包,其中帧同步交由物理层赋值,数据、数据长度由应用业务赋值,数据类型赋值为brd,信源地址赋值为t,当前地址赋值为t,帧序号赋值为帧序号计数器当前值,帧序号计数器加1;遍历链路存活表,若第i行的元素大于0,则将通行记录的第i个bit位置为1,否则保持0不变;校验赋值为上述变量校验和;发送该数据包后,返回步骤3-1);
步骤3-4)生成prt数据包并发送;
根据prt数据包格式生成空数据包,其中帧同步交由物理层赋值,数据、数据长度和目的地址d由应用业务赋值,d为整数,d∈[0,t);数据类型赋值为prt,信源地址赋值为t,当前地址赋值为t,通行记录的第t个bit位置为1,帧序号赋值为帧序号计数器当前值,帧序号计数器加1;如果路由表第d行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的元素中随机选取一个赋值给下跳地址;校验赋值为上述变量校验和;发送该数据包后,记录下数据、数据长度、d和帧序号,开启等待ack定时器act,建议设定其时长不小于2×t×(l4 r/c);prt重发计数器赋值为0,返回步骤3-1);
步骤3-5)重新发送prt数据包;
prt重发计数器加1,如果超过prt重发限制c,则放弃发送该prt数据包,清空记录的数据、数据长度、d和帧序号,返回步骤3-1);否则根据prt数据包格式生成空数据包,其中帧同步交由物理层赋值,将记录的数据、数据长度、d和帧序号分别赋值给对应变量,数据类型赋值为prt,信源地址赋值为t,当前地址赋值为t,通行记录的第t个bit位置为1;如果路由表第d行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的元素中随机选取一个赋值给下跳地址;校验赋值为上述变量校验和;发送该数据包后,记录下数据、数据长度、d和帧序号,开启等待ack定时器act,建议设定其定时时长不小于2×t×(l4 r/c),返回步骤3-1);
步骤3-6)根据接收数据的类型分别处理;处理完毕后返回步骤3-1)。
作为上述方法的一种改进,所述步骤3-6)具体包括:
步骤3-6-1)读取接收数据包的所有参数并进行校验,如果校验错误,则不做任何处理,返回步骤3-1);如果校验正确,则查看接收数据包类型:如果是brd类型数据,则进入步骤3-6-2);如果是prt类型数据,则进入步骤3-6-3);如果是ack类型数据,则进入步骤3-6-4);
步骤3-6-2)查看是否需要广播该brd数据包,如果需要则广播;
设接收数据包的信源地址为s、当前地址为u、目的地址为d、通行记录为np、帧序号为n,n为整数,n≥f k;将brd、s、n、tc和数据、数据长度变量复制并传递给应用业务处理;将np复制一份,记为np’,将需要广播标志置为“否”,遍历链路存活表;如果np’的第i个bit位为0,同时链路存活表的第i行的元素大于0,则将np’的第i个bit位置为1,同时将需要广播标志置为“是”;否则,则继续遍历;如果完成遍历时,需要广播标志为“否”,则直接进入步骤3-6-7);否则,将接收brd数据包的当前地址赋值为t,通行记录赋值为np’,其余变量不变,校验赋值为上述变量校验和;延迟((t–s 1 t)%t)×(l3 r/c)s后,发送该数据包后,进入步骤3-6-7);
步骤3-6-3)查看是否需要回执ack数据包,如果需要则回复;
如果d不等于t,则进入步骤3-6-5);否则,将prt、s、n、tc和数据、数据长度变量复制并传递给应用业务处理;将需要回执标志置为“是”,遍历接收记录表;如果接收记录表中存在某一行的前三个元素分别依次等于prt、s、n,且其第4列元素取值与tc差的绝对值不大于h,则将需要回执标志置为“否”;
完成遍历时,如果需要回执标志为“否”,则进入步骤3-6-7);否则,根据ack数据包格式生成空数据包,其中帧同步交由物理层赋值,数据类型赋值为ack,信源地址赋值为t,当前地址赋值为t,目的地址赋值为s,通行记录的第t个bit位置为1,帧序号赋值为n;如果路由表第s行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的元素中随机选取一个赋值给下跳地址;校验赋值为上述变量校验和;发送该数据包后,清空接收记录表中第j行,进入步骤3-6-7);
步骤3-6-4)查看是否是所等待的ack,如果是则清除等待状态;
如果d不等于t,则进入步骤3-6-5);否则,如果s等于已记录的目的地址且n等于已记录的帧序号,则关闭等待ack定时器act,清除已记录的数据、数据长度、目的地址和帧序号;进入步骤3-6-7);
步骤3-6-5)查看是否需要中继;
设接收数据包的下跳地址为x,通行记录为np;将np复制一份,记为np’,将需要广播标志置为“否”,遍历链路存活表;如果np’的第i个bit位为0,同时链路存活表的第i行的元素大于0,则将np’的第i个bit位置为1,同时将需要广播标志置为“是”;否则,则继续遍历;
完成遍历后,如果x等于t且np的第t个bit位为0,或者x等于t且需要广播标志为“是”,则进入步骤3-6-6);否则,进入步骤3-6-7);
步骤3-6-6)中继该数据包;
无论接收的数据包是prt还是ack,将其当前地址赋值为t;如果路由表第d行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的列元素中随机选取一个赋值给下跳地址;如果x等于t,则将通行记录赋值为np’;否则将np的第t个bit位置为1;校验赋值为上述变量校验和;发送该数据包后,进入步骤3-6-7);
步骤3-6-7)更新路由表和链路存活表;
无论接收的数据包是prt还是ack,记接收数据包的类型为y;将路由表第u行第0列的元素赋值为u;将链路存活表中第u行和第t行的元素赋值为a;
遍历接收记录表,如果接收记录表中存在某一行的前三个元素分别依次等于y、s和n,则返回步骤3-1);否则,如果完成遍历时,接收记录表中不存在任何一行的前三个元素分别依次等于y、s和n,则将接收记录表中空行,或者最早的一行;中的元素分别依次赋值为y、s、n、tc;
然后根据np更新路由表;依次遍历np的第i个bit位;若该bit位为0,则跳过该bit位继续遍历;若该bit位不为0,则遍历路由表第i行的各列;如果路由表该行中存在某一列元素的取值等于u,则跳过该bit位继续遍历;如果路由表该行中不存在任何一列的元素等于u,同时i不等于t、s也不等于t时,则将路由表该行中除第0列外时间最早一列的元素赋值为u;否则跳过该bit位继续遍历np;当遍历完np的所有bit位时,返回步骤3-1)。
本发明的优势在于:
1、在不需要时钟同步和地理位置的前提下,对移动节点编队进行快速自组织;
2、通过控制不同节点发送广播类数据包的时延,避免信号冲突;
3、在通信数据包中增加了通行记录变量,用于跟踪链路和路由变化;
4、利用通行记录变量控制广播类数据包的范围,一定程度上节省了能量消耗;
5、本发明的方法利用水声通信将水下移动节点编队快速自组织形成以广播类数据包为主、点对点数据包为辅的无线网络,使得编队中各个节点间能够通过网络进行信息交互与共享,并在通信过程中跟踪节点间链路和路由变化。
附图说明
图1为本发明的不需要时钟同步的水下移动节点自组网方法的流程图;
图2为本发明的数据包格式图;
图3为软件仿真时移动节点的布放和运动轨迹图;
图4为软件仿真时移动节点拓扑变化图;
图5为软件仿真时的节点模型图;
图6(a)为软件仿真时利用通行记录控制广播范围的对比示意图;
图6(b)为软件仿真时未利用通行记录控制广播范围的对比示意图;
图7(a)为泊松分布为60s软件仿真时是否控制广播范围的能耗对比图;
图7(b)为泊松分布为120s软件仿真时是否控制广播范围的能耗对比图;
图8(a)为泊松分布为60s为软件仿真时是否控制广播范围的prt端到端延时对比图;
图8(b)为泊松分布为120s为软件仿真时是否控制广播范围的prt端到端延时对比图;
图9(a)为泊松分布为60s软件仿真时是否控制广播范围的brd丢包数量对比图;
图9(b)为泊松分布为120s软件仿真时是否控制广播范围的brd丢包数量对比图。
具体实施方式
下面结合附图和具体实施例对发明进行详细的说明。
如图1所示,本发明的不需要时钟同步的水下移动节点自组网方法,在没有时钟同步和地理位置的情况下,利用水声通信将水下移动节点编队快速自组织形成网络,使得编队中各个节点间能够进行信息交互与共享,并且在交互与共享的过程中跟踪节点间链路和路由变化。所述方法具体包括:
步骤1)进行初始化,具体包括以下几步:
步骤1-1)设定各种数据包的时间长度ly(ly为正实数,单位s);
其中,y=1、2、3、4、5…,数据包类型至少有5种:1.存活数据包klv、2.融合数据包fus、3.全体数据包brd、4.单体数据包prt、5.回执数据包ack;其中fus和brd属于广播类数据包,prt和ack属于点对点类数据包;除klv外,其余4种数据包均包含变量通行记录;时间长度ly按下式设定
ly=by/rate(1)
其中,by为第y种数据包所占用的bit位数(by为正整数,单位bit),rate为移动节点通信速率(rate为正实数,单位bit/s);
步骤1-2)为各个节点设定水声网络包含的总移动节点数量t及当前节点地址t;
总节点数量t为正整数,且不大于通行记录所占用的bit位数;当前节点地址t为整数且t∈[0,t),且应保证不同节点的t在网络中是唯一的;
步骤1-3)设定klv发送次数的上限k(k为正整数)、fus发送次数的上限f(f为正整数)、prt重发计数器的上限c(c为正整数)、prt回复时间限制h(h为正实数,单位为s)、链路最大存活时间a(a为正实数,单位为s);
建议将a按照下式设定:
a=r/v(2)
其中,r为移动节点的通信半径(r为正实数,单位为m),v为移动节点最大移动速度(v为正实数,单位m/s);
步骤1-4)为各个节点建立空白路由表、空白接收记录表、空白链路存活表;
路由表是一个2维整型数组,行数为t,建议列数至少为2,行列序号均从0开始;该数组的行序号即对应各个节点地址;每一行各列元素取值为可以到达该行序号所对应节点的不同下一跳节点地址;初始化时均赋值为t,表示暂时无法通过网络中已有的节点路由访问到该行序号所对应节点;另外,第t行第0列赋值为t;
接收记录表是一个1维结构体数组,建议行数至少为2,行序号从0开始;每个结构体中包含接收包类型、接收包信源、接收包序号、接收时间共四个元素,前三个元素为整型,接收时间为实型;初始化时全部赋值为-1以清空,表示暂时没有接收到数据包;
链路存活表是一个1维实型数组,行数为t,行序号从0开始;每一行元素取值即为当前节点与该行序号所对应节点的链路存活时间倒计时,单位为s;链路存活表仅记录当前节点与1跳可以直接到达的其他节点间的链路存活时间倒计时;初始化时全部赋值为-1以清空,表示暂时没有可以到达其他节点的链路;另外,将第t行的元素赋值为a;
步骤1-5)清零所有定时器、计数器,所有计数器从0开始计数;所有标志置为否;开启链路存活表更新定时器lat,建议该定时器时长不大于1s。
步骤2)进行网络自组织,具体包括:
步骤2-1)为最后布放的节点设定k次klv的时间和f次fus的时间,已设定标志置为“是”;其余节点直接进入步骤2-3);
最后布放的节点第0次发送klv的时间应设定在其布放完毕之后,记为t0;第k(k为整数,k∈[0,k))次发送klv的时间tk按照下式设定:
tk=t0 k×(2×t-1)×(l1 r/c)(3)
其中,c为实数,表示布放海域的水中声速,也可采用典型值1500.0,单位为m/s;
第f(f为整数,f∈[0,f))次发送fus的时间t’f按照下式设定:
t’f=t’0 f×(2×t-1)×(l2 r/c)(4)
其中,t’0为第0次发送fus的时间,t’0=t0 k×(2×t-1)×(l1 r/c);
步骤2-2)如果此时klv计数器小于k,则开启klv发送定时器klt,定时到下次发送klv的时间,进入步骤2-3);否则,如果fus计数器小于f,则开启fus发送定时器fut,定时到下次发送fus的时间,进入步骤2-3);否则,进入步骤3);
步骤2-3)等待中断并响应;
如果是lat定时器中断,则进入步骤2-4);如果是klt定时器中断,则进入步骤2-5);如果是fut定时器中断,则进入步骤2-6);如果是接收数据中断,则进入步骤2-7);
步骤2-4)更新链路存活表和路由表;
遍历链路存活表的t行,若其中第i行的元素不大于0,则跳过该行继续遍历;否则,将该元素减去lat定时器的时长;如果减后该元素取值仍然大于0,则跳过该行继续遍历;否则,开始遍历路由表;若路由表中某行某列的元素取值等于i,则将该元素赋值为t;否则该元素取值不变继续遍历路由表;
完成遍历链路存活表后,开启链路存活表更新定时器lat,返回步骤2-3);
步骤2-5)生成klv数据包并发送;
根据附图2所示klv数据包格式生成空数据包,其中帧同步交由物理层赋值,数据类型赋值为klv,信源地址赋值为t,帧序号赋值为帧序号计数器当前值,帧序号计数器加1,校验赋值为上述变量校验和;发送该数据包后,klv计数器加1,返回步骤2-2);
步骤2-6)生成fus数据包并发送;
根据附图2所示fus数据包格式生成空数据包,其中帧同步交由物理层赋值,数据类型赋值为fus,信源地址赋值为t,当前地址赋值为t,帧序号赋值为帧序号计数器当前值,帧序号计数器加1;遍历链路存活表,若其第i行的元素大于0,则将通行记录的第i个bit位置为1,否则保持0不变;校验赋值为上述变量校验和;发送该数据包后,fus计数器加1,返回步骤2-2);
步骤2-7)根据接收数据的类型分别处理;处理完毕后返回步骤2-3)。
步骤2-7-1)读取接收数据包的所有参数并进行校验,如果校验错误,则不做任何处理,返回步骤2-3);如果校验正确,则查看接收数据包类型:如果是klv类型数据,则进入步骤2-7-2);如果是fus类型数据,则进入步骤2-7-4);其他类型的数据处理方法请参考步骤3-6);
步骤2-7-2)查看已设定标志,如果为“是”,则进入步骤2-7-3);否则,设定当前节点发送klv和fus的次数和时间;
设接收数据包的信源地址为s(s为整数,s∈[0,t))、帧序号为l(l为整数,l∈[0,k)),将当前节点帧序号计数器赋值为l,klv发送计数器也赋值为l,设定当前节点剩余k-l次发送klv的时间和f次发送fus的时间;
先按照下式设定当前节点其余k-l次发送klv的时间tk’(k’为整数,k’∈[l,k)):
tk’=tl (k’-l)×(2×t-1)×(l1 r/c)(5)
其中,tl为当前节点第l次发送klv的时间,按照下式设定:
tl=tc ((t–s 1 t)%t)×(l1 r/c)(6)
其中,tc为当前节点的当前时间,%表示取余运算;
第f(f为整数,f∈[0,f))次发送fus的时间t’f按照下式设定:
t’f=t’0 f×(2×t-1)×(l2 r/c)(7)
其中,t’0为第0次发送fus的时间,t’0=tl (k-l)×(2×t-1)×(l1 r/c);
将已设定标志置为“是”;
步骤2-7-3)更新路由表和链路存活表;
将路由表第s行第0列的元素赋值为s;将链路存活表中第s行和第t行的元素赋值为a;返回步骤2-3);
步骤2-7-4)查看已设定标志,如果为“是”,则进入步骤2-7-5);否则,设定当前节点发送fus的次数和时间;
设接收数据包的当前地址为u(u为整数,u∈[0,t))、帧序号为m(m为整数,m∈[k,f k)),则将当前节点帧序号计数器赋值为m,klv发送计数器赋值为k,fus发送计数器赋值为m-k,设定当前节点剩余f k-m次发送fus的时间;
先按照下式设定当前节点其余f k-m次发送fus的时间t’f’(f’为整数,f’∈[m-k,f)):
t’f’=t’m–k (f’–k m)×(t 1)×(2×t–1)×(l2 r/c)(8)
其中,t’m–k为当前节点第m-k次发送fus的时间,按下式设定:
t’m–k=tc ((t–u t)%t)×(2×t–1)×(l2 r/c)(9)
将已设定标志置为“是”;
步骤2-7-5)查看是否需要广播该fus数据包,如需要则广播;
设接收数据包的通行记录为np(np为整数,np∈[0,2t));将np复制一份,记为np’,将需要广播标志置为“否”,遍历链路存活表;如果np’的第i个bit位为0,同时链路存活表的第i行的元素大于0,则将np’的第i个bit位置为1,同时将需要广播标志置为“是”;否则,则继续遍历;
如果完成遍历时,需要广播标志为“否”,则进入步骤2-7-6);否则,将接收fus数据包的当前地址赋值为t,通行记录赋值为np’,其余变量不变,校验赋值为上述变量校验和;发送该数据包后进入步骤2-7-6);
步骤2-7-6)更新路由表和链路存活表;
将路由表第u行第0列的元素赋值为u;将链路存活表中第u行和第t行的元素赋值为a;
遍历接收记录表,如果接收记录表中存在某一行的前三个元素分别依次等于fus、s和m,则返回步骤2-3);否则,如果完成遍历时,接收记录表中不存在任何一行的前三个元素分别依次等于fus、s和m,则将接收记录表中空行(若无空行则使用时间最早的一行)中的元素分别依次赋值为fus、s、m、tc;
然后根据np更新路由表;依次遍历np的第i个bit位;若该bit位为0,则跳过该bit位继续遍历;若该bit位不为0,则遍历路由表第i行的各列;如果路由表该行中存在某一列元素的取值等于u,则跳过该bit位继续遍历;如果路由表该行中不存在任何一列的元素等于u,同时i不等于t、s也不等于t时,则将路由表该行中除第0列外时间最早一列的元素赋值为u;否则跳过该bit位继续遍历np;当遍历完np的所有bit位时,返回步骤2-3)。
步骤3)根据应用业务需要进行信息交互或共享,具体包括:
步骤3-1)节点根据应用业务需要,发送brd数据包或者prt数据包进行正常通信,同时等待中断并响应;
如果是lat定时器中断,则进入步骤3-2);如果是应用业务产生的brd数据包则进入步骤3-3);如果是应用业务产生的prt数据包则进入步骤3-4);如果是act定时器中断,则进入步骤3-5);如果是接收数据中断,则进入步骤3-6);
步骤3-2)更新链路存活表和路由表;
遍历链路存活表的t行,若其中第i行的元素不大于0,则跳过该行继续遍历;否则,将该元素减去lat定时器的时长;如果减后该元素取值仍然大于0,则跳过该行继续遍历;否则,开始遍历路由表;若路由表中某行某列的元素取值等于i,则将该元素赋值为t;否则该元素取值不变继续遍历路由表;
完成遍历链路存活表后,开启链路存活表更新定时器lat,返回步骤3-1);
步骤3-3)生成brd数据包并发送;
根据附图2所示brd数据包格式生成空数据包,其中帧同步交由物理层赋值,数据、数据长度由应用业务赋值,数据类型赋值为brd,信源地址赋值为t,当前地址赋值为t,帧序号赋值为帧序号计数器当前值,帧序号计数器加1;遍历链路存活表,若第i行的元素大于0,则将通行记录的第i个bit位置为1,否则保持0不变;校验赋值为上述变量校验和;发送该数据包后,返回步骤3-1);
步骤3-4)生成prt数据包并发送;
根据附图2所示prt数据包格式生成空数据包,其中帧同步交由物理层赋值,数据、数据长度和目的地址(记为d,d为整数,d∈[0,t))由应用业务赋值,数据类型赋值为prt,信源地址赋值为t,当前地址赋值为t,通行记录的第t个bit位置为1,帧序号赋值为帧序号计数器当前值,帧序号计数器加1;如果路由表第d行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的元素中随机选取一个赋值给下跳地址;校验赋值为上述变量校验和;发送该数据包后,记录下数据、数据长度、d和帧序号,开启等待ack定时器act,建议设定其时长不小于2×t×(l4 r/c);prt重发计数器赋值为0,返回步骤3-1);
步骤3-5)重新发送prt数据包;
prt重发计数器加1,如果超过prt重发限制c,则放弃发送该prt数据包,清空记录的数据、数据长度、d和帧序号,返回步骤3-1);否则根据附图2所示prt数据包格式生成空数据包,其中帧同步交由物理层赋值,将记录的数据、数据长度、d和帧序号分别赋值给对应变量,数据类型赋值为prt,信源地址赋值为t,当前地址赋值为t,通行记录的第t个bit位置为1;如果路由表第d行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的元素中随机选取一个赋值给下跳地址;校验赋值为上述变量校验和;发送该数据包后,记录下数据、数据长度、d和帧序号,开启等待ack定时器act,建议设定其定时时长不小于2×t×(l4 r/c),返回步骤3-1);
步骤3-6)根据接收数据的类型分别处理;处理完毕后返回步骤3-1)。
步骤3-6-1)读取接收数据包的所有参数并进行校验,如果校验错误,则不做任何处理,返回步骤3-1);如果校验正确,则查看接收数据包类型:如果是brd类型数据,则进入步骤3-6-2);如果是prt类型数据,则进入步骤3-6-3);如果是ack类型数据,则进入步骤3-6-4);其他类型的数据处理方法请参考步骤2-7);
步骤3-6-2)查看是否需要广播该brd数据包,如果需要则广播;
设接收数据包的信源地址为s、当前地址为u、目的地址为d、通行记录为np、帧序号为n(n为整数,n≥f k);将brd、s、n、tc和数据、数据长度变量复制并传递给应用业务处理;将np复制一份,记为np’,将需要广播标志置为“否”,遍历链路存活表;如果np’的第i个bit位为0,同时链路存活表的第i行的元素大于0,则将np’的第i个bit位置为1,同时将需要广播标志置为“是”;否则,则继续遍历;如果完成遍历时,需要广播标志为“否”,则直接进入步骤3-6-7);否则,将接收brd数据包的当前地址赋值为t,通行记录赋值为np’,其余变量不变,校验赋值为上述变量校验和;延迟((t–s 1 t)%t)×(l3 r/c)s后,发送该数据包后,进入步骤3-6-7);
步骤3-6-3)查看是否需要回执ack数据包,如果需要则回复;
如果d不等于t,则进入步骤3-6-5);否则,将prt、s、n、tc和数据、数据长度变量复制并传递给应用业务处理;将需要回执标志置为“是”,遍历接收记录表;如果接收记录表中存在某一行(记为j,j为整数,j∈[0,接收记录表行数上限))的前三个元素分别依次等于prt、s、n,且其第4列元素取值与tc差的绝对值不大于h,则将需要回执标志置为“否”;
完成遍历时,如果需要回执标志为“否”,则进入步骤3-6-7);否则,根据附图2所示ack数据包格式生成空数据包,其中帧同步交由物理层赋值,数据类型赋值为ack,信源地址赋值为t,当前地址赋值为t,目的地址赋值为s,通行记录的第t个bit位置为1,帧序号赋值为n;如果路由表第s行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的元素中随机选取一个赋值给下跳地址;校验赋值为上述变量校验和;发送该数据包后,清空接收记录表中第j行,进入步骤3-6-7);
步骤3-6-4)查看是否是所等待的ack,如果是则清除等待状态;
如果d不等于t,则进入步骤3-6-5);否则,如果s等于已记录的目的地址且n等于已记录的帧序号,则关闭等待ack定时器act,清除已记录的数据、数据长度、目的地址和帧序号;进入步骤3-6-7);
步骤3-6-5)查看是否需要中继;
设接收数据包的下跳地址为x,通行记录为np;将np复制一份,记为np’,将需要广播标志置为“否”,遍历链路存活表;如果np’的第i个bit位为0,同时链路存活表的第i行的元素大于0,则将np’的第i个bit位置为1,同时将需要广播标志置为“是”;否则,则继续遍历;
完成遍历后,如果x等于t且np的第t个bit位为0,或者x等于t且需要广播标志为“是”,则进入步骤3-6-6);否则,进入步骤3-6-7);
步骤3-6-6)中继该数据包;
无论接收的数据包是prt还是ack,将其当前地址赋值为t;如果路由表第d行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的列元素中随机选取一个赋值给下跳地址;如果x等于t,则将通行记录赋值为np’;否则将np的第t个bit位置为1;校验赋值为上述变量校验和;发送该数据包后,进入步骤3-6-7);
步骤3-6-7)更新路由表和链路存活表;
无论接收的数据包是prt还是ack,记接收数据包的类型为y;将路由表第u行第0列的元素赋值为u;将链路存活表中第u行和第t行的元素赋值为a;
遍历接收记录表,如果接收记录表中存在某一行的前三个元素分别依次等于y、s和n,则返回步骤3-1);否则,如果完成遍历时,接收记录表中不存在任何一行的前三个元素分别依次等于y、s和n,则将接收记录表中空行(若无空行则使用时间最早的一行)中的元素分别依次赋值为y、s、n、tc;
然后根据np更新路由表;依次遍历np的第i个bit位;若该bit位为0,则跳过该bit位继续遍历;若该bit位不为0,则遍历路由表第i行的各列;如果路由表该行中存在某一列元素的取值等于u,则跳过该bit位继续遍历;如果路由表该行中不存在任何一列的元素等于u,同时i不等于t、s也不等于t时,则将路由表该行中除第0列外时间最早一列的元素赋值为u;否则跳过该bit位继续遍历np;当遍历完np的所有bit位时,返回步骤3-1)。
本移动节点自组网方法利用opnet软件,针对比较恶劣的水声环境进行仿真,并设计半双工的水声通信方式。在图3、图4所示移动节点布放、运动轨迹及拓扑结构下进行软件仿真,并对仿真结果进行分析。
一、半双工水声通信设计
opnet中,将无线链路分为14个管道模型阶段进行建模。需要在节点模型中设定发送机与接收机的中心频率、带宽、调制方式、传输速率、纠错编码。opnet中默认无线链路采用全双工方式,而目前大多数水声通信只能采用半双工方式。
1、管道模型阶段
仿真中,将水声通信参数设置为:bpsk调制、半双工方式、中心频率6khz、带宽4khz、通信速率1kbps、有效距离5km。具体到水声通信中,还需要注意的管道模型阶段有如下几点:
(1)第6阶段中,水下声波传播速度为1500m/s,与默认电磁波传播速度不同,需要修改。
(2)第8阶段需要根据水声传播衰减模型重新编写代码计算接收功率。本方法的仿真中采用了经典的marsh-schulkin模型。
(3)实际水声通信中,一旦多个接收信号之间发生碰撞,这些接收信号都无法正确接收。因此在第9阶段的噪声串扰时,放大了信号间噪声串扰的影响。
(4)第00阶段中应计算海洋背景噪声级,仿真中采用经典的经验公式将其分为四类进行计算。
(5)通过调整发送功率等参数,使得第01阶段在没有碰撞时的误码率在10-3左右,而发生碰撞时误码率在10-1量级。
2、半双工设计
前已叙及,opnet中使用的无线链路均为全双工通信方式,不论同一节点的发送机与接收机是否设置为相同中心频率以及带宽。因此,需要自行设定半双工通信方式。
opnet仿真中设计的节点模型如图5所示。图中source为数据来源,可以视为传感器。router为自组网方法模块。transmitter为发送换能器。receiver为接收水听器。实线表示数据包流向。虚线为统计中断线,一根为接收信号上升沿触发中断,标志接收信号起始,另一根为接收信号下降沿触发中断,标志接收信号结束。当发送换能器处于发送状态时,忽略接收信号的上升沿及下降沿触发中断,并丢弃所有接收到的数据包。反之,设置水听器接收状态标志,将待发送信号延迟到下降沿触发中断之后再发送。
需要补充的是:在无误码的情况下,数据包成功接收时的流中断(由receiver指向router的数据包流向线产生)与接收信号下降沿中断是同时产生的,取其一即可。但在因为误码而丢弃数据包的情况下,不会产生流中断,但还是会产生下降沿中断。因此必须使用两条统计中短线来设置和清空接收水听器的接收状态标志位。
二、仿真结果分析
在图3所示移动节点布放及运动轨迹下进行软件仿真。图3中共6个节点,节点通信半径为6km,最大移动速度20km/h。起始时呈直线型布放,布放间隔5km。布放完毕后,所有节点以最大移动速度沿设定轨迹运动,至轨迹终点时停止运动。由0号节点发起网络自组织,所有节点依次进行1次klv和1次fus后完成自组织阶段。根据运动轨迹可知,起始时6个节点呈线性拓扑,约2h后呈2×3双排拓扑,约2.5h后呈环形拓扑,后面两种拓扑如图4所示。根据仿真结果:约20s时,各节点均完成发送klv数据包;约51s时,各节点开始发送fus数据包,所有节点约在420s完成自组织;约从630s起,开始随机发送brd或者prt、ack数据包,仿真时间共3h。设定各节点发送数据包的时间间隔服从泊松分布,均值为60s和120s。
以6500s左右,节点2发送的brd数据包为例,对比说明一下如何利用通行记录变量控制广播范围达到节省能量的目的。图6(b)为未利用通行记录变量控制广播范围的情况,节点2发送brd数据包后,在其通信半径以内的节点1和节点3相继广播该brd数据包,进而节点0、节点4、节点5也广播了该brd数据包,整个网络内,共进行了6次广播。图6(a)为利用通行记录变量控制广播范围的情况,节点2发送brd数据包后,在其通信半径以内的节点1和节点3相继广播该brd数据包,进而节点4广播了该brd数据包。而节点0和节点5通过通行记录发现自己是末梢节点,无法传递给未接收到该brd数据包的其他节点,便停止广播,整个网络内,仅进行了4次广播。因此,节省了能量。
按照发射功率10w,接收功率0.05w,待机功率0.05w计算,两种方法消耗的能量如图7(a)和(b)所示。图7(a)为泊松分布均值为60s时是否控制广播范围时的节点平均能耗对比,图7(b)为泊松分布均值为120s时是否控制广播范围时的节点平均能耗对比。由图可见在仿真结束时,与未控制广播范围的能耗相比,左侧节省了约20%的平均能耗;右侧节省了约25%的平均能耗。
除节省能量外,控制广播范围时并不影响移动节点自组网的稳健性。由于prt数据包存在重发机制,因此仿真期间未出现丢包,这恰恰说明了本自组网方法能够跟踪链路和路由变化。因此,对比分析分为以下两个方面:
一方面比较一下是否控制广播范围时prt数据包的端到端延时,如图8(a)和(b)所示。图8(a)为泊松分布均值为60s时是否控制广播范围时的节点平均能耗对比,图8(b)为泊松分布均值为120s时是否控制广播范围时的节点平均能耗对比,图例注释末尾的数字为平均值。由图可见是否控制广播范围并未增加prt数据包端到端延时。另一方面比较一下是否控制广播范围时brd数据包的丢包情况,如图9(a)和(b)所示。图9(a)为泊松分布均值为60s时是否控制广播范围时的brd数据包丢包情况,图8(b)为泊松分布均值为120s时是否控制广播范围时的brd数据包丢包情况,图例注释末尾的数字为总丢包数量。由图可见,虽然控制广播范围时部分节点丢包数量增加,但是整个网络的总丢包数量仍然相对较少。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。
1.一种不需要时钟同步的水下移动节点网络自组织方法,所述方法包括:在布放水下移动节点时,由最后布放的节点发起网络自组织,在没有时钟同步的条件下形成路由表,并在通信过程中跟踪通信链路及路由变化。
2.根据权利要求1所述的不需要时钟同步的水下移动节点网络自组织方法,其特征在于,所述方法具体包括:
步骤1)布放水下移动节点,布放前对各个节点进行初始化,并为各个节点设定唯一的节点编号及总节点数量;
步骤2)为最后布放的节点设定“存活klv”数据包和“融合fus”数据包的发送次数及时间,其余节点通过接收这两种数据包设定自身发送这两种数据包的次数及时间;所有节点通过收发上述两种数据包形成路由表;
步骤3)每个节点按照路由表收发“全体brd”数据包或者“单体prt”数据包、“回执ack”数据包进行正常通信,并通过数据包中的通行记录跟踪节点间的通信链路及路由变化。
3.根据权利要求2所述的不需要时钟同步的水下移动节点网络自组织方法,其特征在于,所述步骤1)具体包括:
步骤1-1)设定y种数据包的时间长度ly,ly为正实数,单位为秒;
其中,y为正整数,数据包类型至少有5种:存活数据包klv、融合数据包fus、全体数据包brd、单体数据包prt和回执数据包ack;其中融合数据包fus和全体数据包brd属于广播类数据包,单体数据包prt和回执数据包ack属于点对点类数据包;除存活数据包klv外,其余4种数据包均包含变量通行记录;时间长度ly按下式设定:
ly=by/rate(1)
其中,by为第y种数据包所占用的bit位数,by为正整数,单位bit,rate为移动节点通信速率,rate为正实数,单位bit/s;
步骤1-2)为各个节点设定水声网络包含的总移动节点数量t及当前节点地址t;
总节点数量t为正整数,且不大于通行记录所占用的bit位数;当前节点地址t为整数且t∈[0,t),且应保证不同节点的t在网络中是唯一的;
步骤1-3)设定klv发送次数的上限k,k为正整数,fus发送次数的上限f,f为正整数,prt重发计数器的上限c,c为正整数,prt回复时间限制h,h为正实数,单位为s,链路最大存活时间a,a为正实数,单位为s;
将a按照下式设定:
a=r/v(2)
其中,r为移动节点的通信半径,r为正实数,单位为m,v为移动节点最大移动速度,v为正实数,单位m/s;
步骤1-4)为各个节点建立空白路由表、空白接收记录表和空白链路存活表;
路由表是一个2维整型数组,行数为t,建议列数至少为2,行列序号均从0开始;该数组的行序号即对应各个节点地址;每一行各列元素取值为可以到达该行序号所对应节点的不同下一跳节点地址;初始化时均赋值为t,表示暂时无法通过网络中已有的节点路由访问到该行序号所对应节点;另外,第t行第0列赋值为t;
接收记录表是一个1维结构体数组,建议行数至少为2,行序号从0开始;每个结构体中包含接收包类型、接收包信源、接收包序号、接收时间共四个元素,前三个元素为整型,接收时间为实型;初始化时全部赋值为-1以清空,表示暂时没有接收到数据包;
链路存活表是一个1维实型数组,行数为t,行序号从0开始;每一行元素取值即为当前节点与该行序号所对应节点的链路存活时间倒计时,单位为s;链路存活表仅记录当前节点与1跳可以直接到达的其他节点间的链路存活时间倒计时;初始化时全部赋值为-1以清空,表示暂时没有可以到达其他节点的链路;将第t行的元素赋值为a;
步骤1-5)清零所有定时器、计数器,所有计数器从0开始计数;所有标志置为“否”;开启链路存活表更新定时器lat,该定时器时长不大于1s。
4.根据权利要求3所述的不需要时钟同步的水下移动节点网络自组织方法,其特征在于,所述步骤2)具体包括:
步骤2-1)判断当前节点是否为最后布放的节点,如果“是”,转入步骤2-2)至步骤2-3),否则,转入步骤2-4);
步骤2-2)为最后布放的节点设定k次klv的时间和f次fus的时间,已设定标志置为“是”;最后布放的节点第0次发送klv的时间应设定在其布放完毕之后,记为t0;第k次发送klv的时间tk按照下式设定:
tk=t0 k×(2×t-1)×(l1 r/c)(3)
其中,k为整数,k∈[0,k);c为实数,表示布放海域的水中声速,单位为m/s;
第f次发送fus的时间t’f按照下式设定:
t’f=t’0 f×(2×t-1)×(l2 r/c)(4)
其中,f为整数,f∈[0,f);t’0为第0次发送fus的时间:
t’0=t0 k×(2×t-1)×(l1 r/c);
步骤2-3)最后布放的节点开启klv发送定时器klt,定时到第0次发送klv的时间,进入步骤2-4);
步骤2-4)当前节点等待中断并响应;如果是lat定时器中断,则进入步骤2-5);如果是klt定时器中断,则进入步骤2-6);如果是fut定时器中断,则进入步骤2-7);如果是接收数据中断,则进入步骤2-9);
步骤2-5)更新链路存活表和路由表;
遍历链路存活表的t行,若其中第i行的元素不大于0,则跳过该行继续遍历;否则,将该元素减去lat定时器的时长;如果减后该元素取值仍然大于0,则跳过该行继续遍历;否则,开始遍历路由表;若路由表中某行某列的元素取值等于i,则将该元素赋值为t;否则该元素取值不变继续遍历路由表;完成遍历链路存活表后,开启链路存活表更新定时器lat,返回步骤2-4);
步骤2-6)生成klv数据包并发送;
根据klv数据包格式生成空数据包,其中帧同步交由物理层赋值,数据类型赋值为klv,信源地址赋值为t,帧序号赋值为帧序号计数器当前值,帧序号计数器加1,校验赋值为上述变量校验和;发送该数据包后,klv计数器加1,进入步骤2-8);
步骤2-7)生成fus数据包并发送;
根据fus数据包格式生成空数据包,其中帧同步交由物理层赋值,数据类型赋值为fus,信源地址赋值为t,当前地址赋值为t,帧序号赋值为帧序号计数器当前值,帧序号计数器加1;遍历链路存活表,若其第i行的元素大于0,则将通行记录的第i个bit位置为1,否则保持0不变;校验赋值为上述变量校验和;发送该数据包后,fus计数器加1,进入步骤2-8);
步骤2-8)如果当前节点此时klv计数器小于k,则开启klv发送定时器klt,定时到下次发送klv的时间,进入步骤2-4);否则,如果当前节点此时fus计数器小于f,则开启fus发送定时器fut,定时到下次发送fus的时间,进入步骤2-4);否则,进入步骤3);
步骤2-9)当前节点根据接收数据的类型分别进行处理;处理完毕后返回步骤2-4)。
5.根据权利要求4所述的不需要时钟同步的水下移动节点网络自组织方法,其特征在于,所述步骤2-9)具体包括:
步骤2-9-1)当前节点读取接收数据包的所有参数并进行校验,如果校验错误,则不做任何处理,返回步骤2-4);如果校验正确,则查看接收数据包类型:如果是klv类型数据,则进入步骤2-9-2);如果是fus类型数据,则进入步骤2-9-4);
步骤2-9-2)查看已设定标志,如果为“是”,则进入步骤2-9-3);否则,设定当前节点发送klv和fus的次数和时间;然后进入步骤2-9-3);
设接收数据包的信源地址为s,s为整数,s∈[0,t)、帧序号为l,l为整数,l∈[0,k),将当前节点帧序号计数器赋值为l,klv发送计数器也赋值为l,设定当前节点剩余k-l次发送klv的时间和f次发送fus的时间;
先按照下式设定当前节点其余k-l次发送klv的时间tk’,k’为整数,k’∈[l,k):
tk’=tl (k’-l)×(2×t-1)×(l1 r/c)(5)
其中,tl为当前节点第l次发送klv的时间,按照下式设定:
tl=tc ((t–s 1 t)%t)×(l1 r/c)(6)
其中,tc为当前节点的当前时间,%表示取余运算;
第f次发送fus的时间t’f按照下式设定:
t’f=t’0 f×(2×t-1)×(l2 r/c)(7)
其中,t’0为第0次发送fus的时间,t’0=tl (k-l)×(2×t-1)×(l1 r/c);
将已设定标志置为“是”;
步骤2-9-3)更新路由表和链路存活表;
将路由表第s行第0列的元素赋值为s;将链路存活表中第s行和第t行的元素赋值为a;返回步骤2-4);
步骤2-9-4)查看已设定标志,如果为“是”,则进入步骤2-9-5);否则,设定当前节点发送fus的次数和时间;然后进入步骤2-9-5);
设接收数据包的当前地址为u,u为整数,u∈[0,t)、帧序号为m,m为整数,m∈[k,f k),则将当前节点帧序号计数器赋值为m,klv发送计数器赋值为k,fus发送计数器赋值为m-k,设定当前节点剩余f k-m次发送fus的时间;
先按照下式设定当前节点其余f k-m次发送fus的时间t’f’,f’为整数,f’∈[m-k,f):
t’f’=t’m–k (f’–k m)×(t 1)×(2×t–1)×(l2 r/c)(8)
其中,t’m–k为当前节点第m-k次发送fus的时间,按下式设定:
t’m–k=tc ((t–u t)%t)×(2×t–1)×(l2 r/c)(9)
将已设定标志置为“是”;
步骤2-9-5)查看是否需要广播该fus数据包,如需要则广播;
设接收数据包的通行记录为np,np为整数,np∈[0,2t);将np复制一份,记为np’,将需要广播标志置为“否”,遍历链路存活表;如果np’的第i个bit位为0,同时链路存活表的第i行的元素大于0,则将np’的第i个bit位置为1,同时将需要广播标志置为“是”;否则,则继续遍历;
如果完成遍历时,需要广播标志为“否”,则进入步骤2-9-6);否则,将接收fus数据包的当前地址赋值为t,通行记录赋值为np’,其余变量不变,校验赋值为上述变量校验和;发送该数据包后进入步骤2-9-6);
步骤2-9-6)更新路由表和链路存活表;
将路由表第u行第0列的元素赋值为u;将链路存活表中第u行和第t行的元素赋值为a;
遍历接收记录表,如果接收记录表中存在某一行的前三个元素分别依次等于fus、s和m,则返回步骤2-4);否则,如果完成遍历时,接收记录表中不存在任何一行的前三个元素分别依次等于fus、s和m,则将接收记录表中空行或使用时间最早的一行中的元素分别依次赋值为fus、s、m、tc;
然后根据np更新路由表;依次遍历np的第i个bit位;若该bit位为0,则跳过该bit位继续遍历;若该bit位不为0,则遍历路由表第i行的各列;如果路由表该行中存在某一列元素的取值等于u,则跳过该bit位继续遍历;如果路由表该行中不存在任何一列的元素等于u,同时i不等于t、s也不等于t时,则将路由表该行中除第0列外时间最早一列的元素赋值为u;否则跳过该bit位继续遍历np;当遍历完np的所有bit位时,返回步骤2-4)。
6.根据权利要求5所述的不需要时钟同步的水下移动节点网络自组织方法,其特征在于,所述步骤3)具体包括:
步骤3-1)当前节点发送brd数据包或者prt数据包进行正常通信,同时等待中断并响应;
如果是lat定时器中断,则进入步骤3-2);如果是应用业务产生的brd数据包则进入步骤3-3);如果是应用业务产生的prt数据包则进入步骤3-4);如果是act定时器中断,则进入步骤3-5);如果是接收数据中断,则进入步骤3-6);
步骤3-2)更新链路存活表和路由表;
遍历链路存活表的t行,若其中第i行的元素不大于0,则跳过该行继续遍历;否则,将该元素减去lat定时器的时长;如果减后该元素取值仍然大于0,则跳过该行继续遍历;否则,开始遍历路由表;若路由表中某行某列的元素取值等于i,则将该元素赋值为t;否则该元素取值不变继续遍历路由表;
完成遍历链路存活表后,开启链路存活表更新定时器lat,返回步骤3-1);
步骤3-3)生成brd数据包并发送;
根据brd数据包格式生成空数据包,其中帧同步交由物理层赋值,数据、数据长度由应用业务赋值,数据类型赋值为brd,信源地址赋值为t,当前地址赋值为t,帧序号赋值为帧序号计数器当前值,帧序号计数器加1;遍历链路存活表,若第i行的元素大于0,则将通行记录的第i个bit位置为1,否则保持0不变;校验赋值为上述变量校验和;发送该数据包后,返回步骤3-1);
步骤3-4)生成prt数据包并发送;
根据prt数据包格式生成空数据包,其中帧同步交由物理层赋值,数据、数据长度和目的地址d由应用业务赋值,d为整数,d∈[0,t);数据类型赋值为prt,信源地址赋值为t,当前地址赋值为t,通行记录的第t个bit位置为1,帧序号赋值为帧序号计数器当前值,帧序号计数器加1;如果路由表第d行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的元素中随机选取一个赋值给下跳地址;校验赋值为上述变量校验和;发送该数据包后,记录下数据、数据长度、d和帧序号,开启等待ack定时器act,建议设定其时长不小于2×t×(l4 r/c);prt重发计数器赋值为0,返回步骤3-1);
步骤3-5)重新发送prt数据包;
prt重发计数器加1,如果超过prt重发限制c,则放弃发送该prt数据包,清空记录的数据、数据长度、d和帧序号,返回步骤3-1);否则根据prt数据包格式生成空数据包,其中帧同步交由物理层赋值,将记录的数据、数据长度、d和帧序号分别赋值给对应变量,数据类型赋值为prt,信源地址赋值为t,当前地址赋值为t,通行记录的第t个bit位置为1;如果路由表第d行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的元素中随机选取一个赋值给下跳地址;校验赋值为上述变量校验和;发送该数据包后,记录下数据、数据长度、d和帧序号,开启等待ack定时器act,建议设定其定时时长不小于2×t×(l4 r/c),返回步骤3-1);
步骤3-6)根据接收数据的类型分别处理;处理完毕后返回步骤3-1)。
7.根据权利要求6所述的不需要时钟同步的水下移动节点网络自组织方法,其特征在于,所述步骤3-6)具体包括:
步骤3-6-1)读取接收数据包的所有参数并进行校验,如果校验错误,则不做任何处理,返回步骤3-1);如果校验正确,则查看接收数据包类型:如果是brd类型数据,则进入步骤3-6-2);如果是prt类型数据,则进入步骤3-6-3);如果是ack类型数据,则进入步骤3-6-4);
步骤3-6-2)查看是否需要广播该brd数据包,如果需要则广播;
设接收数据包的信源地址为s、当前地址为u、目的地址为d、通行记录为np、帧序号为n,n为整数,n≥f k;将brd、s、n、tc和数据、数据长度变量复制并传递给应用业务处理;将np复制一份,记为np’,将需要广播标志置为“否”,遍历链路存活表;如果np’的第i个bit位为0,同时链路存活表的第i行的元素大于0,则将np’的第i个bit位置为1,同时将需要广播标志置为“是”;否则,则继续遍历;如果完成遍历时,需要广播标志为“否”,则直接进入步骤3-6-7);否则,将接收brd数据包的当前地址赋值为t,通行记录赋值为np’,其余变量不变,校验赋值为上述变量校验和;延迟((t–s 1 t)%t)×(l3 r/c)s后,发送该数据包后,进入步骤3-6-7);
步骤3-6-3)查看是否需要回执ack数据包,如果需要则回复;
如果d不等于t,则进入步骤3-6-5);否则,将prt、s、n、tc和数据、数据长度变量复制并传递给应用业务处理;将需要回执标志置为“是”,遍历接收记录表;如果接收记录表中存在某一行的前三个元素分别依次等于prt、s、n,且其第4列元素取值与tc差的绝对值不大于h,则将需要回执标志置为否;
完成遍历时,如果需要回执标志为“否”,则进入步骤3-6-7);否则,根据ack数据包格式生成空数据包,其中帧同步交由物理层赋值,数据类型赋值为ack,信源地址赋值为t,当前地址赋值为t,目的地址赋值为s,通行记录的第t个bit位置为1,帧序号赋值为n;如果路由表第s行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的元素中随机选取一个赋值给下跳地址;校验赋值为上述变量校验和;发送该数据包后,清空接收记录表中第j行,进入步骤3-6-7);
步骤3-6-4)查看是否是所等待的ack,如果是则清除等待状态;
如果d不等于t,则进入步骤3-6-5);否则,如果s等于已记录的目的地址且n等于已记录的帧序号,则关闭等待ack定时器act,清除已记录的数据、数据长度、目的地址和帧序号;进入步骤3-6-7);
步骤3-6-5)查看是否需要中继;
设接收数据包的下跳地址为x,通行记录为np;将np复制一份,记为np’,将需要广播标志置为“否”,遍历链路存活表;如果np’的第i个bit位为0,同时链路存活表的第i行的元素大于0,则将np’的第i个bit位置为1,同时将需要广播标志置为“是”;否则,则继续遍历;
完成遍历后,如果x等于t且np的第t个bit位为0,或者x等于t且需要广播标志为“是”,则进入步骤3-6-6);否则,进入步骤3-6-7);
步骤3-6-6)中继该数据包;
无论接收的数据包是prt还是ack,将其当前地址赋值为t;如果路由表第d行的所有列的元素取值都为t,则将下跳地址赋值为t;否则,从所有取值不为t的列元素中随机选取一个赋值给下跳地址;如果x等于t,则将通行记录赋值为np’;否则将np的第t个bit位置为1;校验赋值为上述变量校验和;发送该数据包后,进入步骤3-6-7);
步骤3-6-7)更新路由表和链路存活表;
无论接收的数据包是prt还是ack,记接收数据包的类型为y;将路由表第u行第0列的元素赋值为u;将链路存活表中第u行和第t行的元素赋值为a;
遍历接收记录表,如果接收记录表中存在某一行的前三个元素分别依次等于y、s和n,则返回步骤3-1);否则,如果完成遍历时,接收记录表中不存在任何一行的前三个元素分别依次等于y、s和n,则将接收记录表中空行,或者最早的一行;中的元素分别依次赋值为y、s、n、tc;
然后根据np更新路由表;依次遍历np的第i个bit位;若该bit位为0,则跳过该bit位继续遍历;若该bit位不为0,则遍历路由表第i行的各列;如果路由表该行中存在某一列元素的取值等于u,则跳过该bit位继续遍历;如果路由表该行中不存在任何一列的元素等于u,同时i不等于t、s也不等于t时,则将路由表该行中除第0列外时间最早一列的元素赋值为u;否则跳过该bit位继续遍历np;当遍历完np的所有bit位时,返回步骤3-1)。
技术总结