您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > WSN中LEACH协议源码分析
WSN中LEACH协议源码分析分析(一)首先对wireless.tcl进行分析,先对默认的脚本选项进行初始化:setopt(chan)Channel/WirelessChannelsetopt(prop)Propagation/TwoRayGroundsetopt(netif)Phy/WirelessPhysetopt(mac)Mac/802_11setopt(ifq)Queue/DropTail/PriQueuesetopt(ll)LLsetopt(ant)Antenna/OmniAntennasetopt(x)0;#Xdimensionofthetopographysetopt(y)0;#Ydimensionofthetopographysetopt(cp)setopt(sc)../mobility/scene/scen-670x670-50-600-20-2;#scenariofilesetopt(ifqlen)50;#maxpacketinifsetopt(nn)51;#numberofnodessetopt(seed)0.0setopt(stop)10.0;#simulationtimesetopt(tr)out.tr;#tracefilesetopt(rp)dsdv;#routingprotocolscriptsetopt(lm)on;#logmovement在这个wireless.tcl中设置了一些全局变量:##InitializeGlobalVariables#setns_[newSimulator]setchan[new$opt(chan)]setprop[new$opt(prop)]settopo[newTopography]settracefd[open$opt(tr)w]$topoload_flatgrid$opt(x)$opt(y)$proptopography$topo这些初始化将在后面的使用中用到,该文件最重要的是创建leach节点:创建方法如下:}elseif{[stringcompare$opt(rp)leach]==0}{for{seti0}{$i$opt(nn)}{incri}{leach-create-mobile-node$i}如果路由协议是leach协议,则在Uamps.tcl中调用leach-create-mobile-node方法创建leach节点。将在第二小节讲如何创建leach节点。for{seti0}{$i$opt(nn)}{incri}{$ns_at$opt(stop).000000001$node_($i)reset;//完成后,重置节点的应用}$ns_at$opt(stop).00000001puts\NSEXITING...\;$ns_haltif{$opt(sc)==}{puts***NOTE:noscenariofilespecified.setopt(sc)none}else{putsLoadingscenariofile...source$opt(sc)putsLoadcomplete...}ns在什么时候结束simulation,并告诉ns加载sc场景文件。最后$ns_run则ns就开始运行了。分析(二)上节对wireless.tcl进行了简要的分析,接下来对Uamps.tcl脚本进行分析。setopt(Efriss_amp)[expr[expr1.1*$opt(RXThresh)*16*$PI*$PI]/\[expr$opt(bw)*$opt(Gt)*$opt(Gr)*$l*$l]]#Etwo_ray_amp=RXThresh/(RbGtGrht^2hr^2)setopt(Etwo_ray_amp)[expr1.1*$opt(RXThresh)/\[expr$opt(bw)*$opt(Gt)*$opt(Gr)*\$opt(ht)*$opt(ht)*$opt(ht)*$opt(ht)]]setopt(EXcvr)50e-9;#Energyforradiocircuitrysetopt(e_bf)5e-9;#Beamformingenergy(J/bit)setopt(Esense)0;#Sensingenergy(J/bit)setopt(thresh_energy)0.00;#Thresholdforpoweradaptationsetopt(Pidle)0;#Idlepower(W)setopt(Psleep)0;#Sleeppower(W)setinitialized0setrng_[newRNG]#用于产生随机数首先往opt数组里面添加一些变量,并对这些变量进行初化。opt(Psleep),opt(Pidle),opt(thresh_energy)在ns-leach.tcl中使用到,这个是计算单位时间空闲所消耗的能量和休眠所消耗的能量。这个脚本主要是创建leach节点:if{$initialized==0}{#removeoldtracesens_initsetinitialized1}#Removeoldtracefiles.catchevalexecrm[glob-nocomplain$opt(dirname)/TDMAschedule.*.txt]catchexecrm$opt(dirname)/$opt(filename).energycatchexecrm$opt(dirname)/$opt(filename).datacatchexecrm$opt(dirname)/$opt(filename).alivecatchexecrm$opt(dirname)/startup.energycatchexecrm$opt(dirname)/init.energy如果没有初始化过,则将以前的跟踪文件删除,接着回到创建leach的函数中,创建节点:if{$id!=$opt(nn_)}{puts-nonewline$id#importantsetnode_($id)[newMobileNode/ResourceAwareNode]}else{puts($opt(nn_)==BS)setnode_($id)[newMobileNode/ResourceAwareNode$BS_NODE]}如果不是簇头节点则将$opt(nn_)-1个节点设置为一般节点,将$opt(nn_)设置为BS节点。newMobileNode/ResourceAwareNode函数是在ns-ranode.tcl中。分析完这个我们接下来分析newMobileNode/ResourceAwareNode这个函数。setnode$node_($id)if{$id!=$opt(nn_)}{#Setinitialnodeenergy.if{$opt(eq_energy)==1}{$nodeset-energy$opt(init_energy)$opt(thresh_energy)}else{由于eq-energy在leach-test中给定,将eq-energy=1;则每个节点都会对能量进行初始化,设置节点的初始能量和门槛能量(个人理解,死亡能量)。sethigh_e_nodes[list9719128782283553472]if{[lsearch$high_e_nodes$id]==-1}{setE2}else{setE200}$nodeset-energy$E$opt(thresh_energy)setinitf[open$opt(dirname)/init.energya]puts$initf$id\t$Eclose$initf将不属于list中的能量初始化能量设置为2,将属于list中的能量设置为200.并将初始化能量写到init.energy中,将节点id和节点初始能量写进去。else{#Basestationhasaninfiniteamountofenergy.$nodeset-energy50000$opt(thresh_energy)}节点为簇头节点,则将节点的初始化能量设置为50000,能量无限。到此为止,创建节点完成并将每个节点的能量初始化完成。下一节将分析ns-ranode.tcl脚本。区分普通节点和簇头节点的不同。接下来是配置节点信道和跟踪文件:$ns_at0.0$node_($id)start-appns在0的时候启动应用,应用在ns-ranode.tcl中分析。分析(三)对前面两个脚本进行分析后,已经创建好节点和设置好节点的初始能量,将opt(nn_)-1个节点设置为普通节点,而将opt(nn_)设置为bs。现在对ns-ranode.tcl进行分析。好了我们现在就开始分析这个脚本。ClassMobileNode/ResourceAwareNode-superclassNode/MobileNodeMobileNode/ResourceAwareNodeinstprocinitargssetbs_node[lindex$args0]eval$selfnext[lreplace$args00]args由参数传递进来,若节点为簇头节点则bs_node=1,调用父类初始化函数。setResourceManager_[newResourceManager]$ResourceManager_Register[newResource/NeighborResource]setenergy[newResource/Energy]$ResourceManager_Register$energyResourceManager在ns-resouce-manager.tcl中定义的。Resource/NeighborResource在ns-neighbor-resource中对能量进行管理。#Createanewagentandattachittothenodeif{$bs_node==1}{setagent[newAgent/BSAgent]}else{setagent[newAgent/RCAgent]}setrca_agent_$agent普通节点的应用为RCAgent,BS的应用为BSAGgent。并将应用attch到node上。下面两段看不明白,但是这两段不影响看程序。sethaslist[find_haslist[$selfid]]if{$bs_node==1}{setrca[new$opt(bsapp)]}else{setrca[new$opt(rcapp)$opt(mtype)$wantslist$haslist]}$ns_attach-agent$self$agent$rcaattach-agent$agentsetrca_app_$rca将bs节点的应用设置为bsapp,普通节点的应用设置为rcaapp,并将节点的服务设置为不同的服务。bsapp在ns-app.tcl中。$opt(rcapp)定义在leach.tcl中,opt(mtype)定义在leach.tcl中。setopt(rcapp)Application/LEACH;#Applicationtypesetopt(ra_adv)[TxTime[expr$opt(hdr_size)+4]];#Totaltime(s)forCHADVs;#Assumemax4(nn*%)CHssetopt(ra_adv_total)[expr$opt(ra_adv)*($opt(num_clusters)*4+1)];#RATime(s)fornodes'joinreqssetopt(ra_join)[expr0.01*$opt(nn_)];#Buffertimeforjoinreqxmittalsetopt(ra_delay)[TxTime[expr$opt(hdr_size)+4]];#Maximumtimerequiredtotransmit;#aschedule(nnodesin1cluster)
本文标题:WSN中LEACH协议源码分析
链接地址:https://www.777doc.com/doc-2857191 .html