ZigBee路由协议分析及仿真实现-毕业论文_第1页
ZigBee路由协议分析及仿真实现-毕业论文_第2页
ZigBee路由协议分析及仿真实现-毕业论文_第3页
ZigBee路由协议分析及仿真实现-毕业论文_第4页
ZigBee路由协议分析及仿真实现-毕业论文_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ZigBee路由协议分析及仿真实现-毕业论文河南城建学院本科毕业设计(论文) STYLEREF"标题1"错误!文档中没有指定样式的文字。摘要作为无线传感器网络(WSNWirelessSensorNetworks)的一项新型技术,ZigBee技术具有低功耗、低速率、低延时、低成本等特性,具有强大的组网能力和超大的网络容量,可以广泛应用在消费电子产品、家居与楼宇自动化、工业控制、医疗设备等领域。由于其独有的特性,ZigBee无线技术也是无线传感器网络的首先技术,具有广阔的发展前景。ZigBee协议标准采用开放系统接口(0SI)分层结构,其中物理层和媒体接入层由IEEE802.15.4工作小组制定,而网络层,安全层和应用框架层由ZigBee联盟制定。本文根据IEEE802.15.4标准规范与ZigBee标准规范,简单扼要地阐述了ZigBee协议栈的协议栈架构,重点讲解了ZigBee网络层树路由和网状网路由。然后讲解了NS2网络仿真软件的工作原理,详细介绍了仿真环境的搭建和仿真分析的过程。通过对CLUSTER-TREE路由算法和AODVjr路由算法在不同发包间隔下的平均延时、丢包率和控制包数量模拟,获得仿真结果。AbstractAsaWSN(WirelessSensornetwork),anewtechnology,ZigBeetechnologywithlowpowerconsumption,lowspeed,lowlatency,lowcostfeatures,isapowerfulnetworkingcapabilitiesandlargenetworkcapacity,andcanbewidelyusedinconsumerelectronics,homeandbuildingautomation,industrialcontrol,medicalequipmentandotherfields.Becauseofitsuniqueproperties,ZigBeewirelesstechnologyisthefirsttechnologyofwirelesssensornetwork,hasabroaddevelopmentprospects.ZigBeeprotocolstandardusingopensysteminterface(OSI)hierarchicalstructure,includingthephysicallayerandthemediaaccesslayershallbeformulatedbytheIEEE802.15.4workinggroup,andthenetworklayer,securityandapplicationframeworklayershallbeformulatedbytheZigBeealliance.Inthispaper,basedonIEEE802.15.4standardspecificationandZigBeestandards,brieflyexpoundsthesimpleZigBeeprotocolstackprotocolstackarchitecture,focusingontheZigBeenetworklayerroutingandmeshnetworksbythetree.ThenexplainedtheworkingprincipleofNS2networksimulationsoftware,introducesindetailtheprocessoftheconstructionofthesimulationenvironmentandsimulationanalysis.RoutingalgorithmbasedonCLUSTER-TREEandAODVjrroutingalgorithmunderdifferentcontractawardingintervalaveragedelay,packetlossrateandthecontrolpacketnumbersimulation,thesimulationresults.KEYWORDS:NS2,ZigBee,CLUSTER-TREE,AODVjr目录摘要 请求请求高协议层低协议层确认指示相应图2.2SAP和原语示意图2.3ZigBee网络层路由协议2.3.1ZigBee支持的网络拓扑ZigBee网络支持3种网络拓扑——星型拓扑、树形拓扑和网状拓扑,如图2.3所示。星型拓扑中间为ZigBee协调器,它负责网络的建立服务维护,其他节点是ZigBee的末端节点,直接与协调器进行通信。树形拓扑中有协调器、路由器、末端设备,树形拓扑中协调器负责网络的建立和维护,同时需要确定一些参数,网络中的节点并不一定直接与协调器通信,可能要通过若干个路由器后才能与协调器通信。网状拓扑中通树形拖扑一样也具有协调器、路由器、末端设备,但是它拓扑建立灵活,不需要再建立网络的时候限制网络的形状,并且节点之间通信可以通过最优路径进行。((a)星型拓扑(a)树形拓扑(a)网状拓扑末端节点路由器协调器图2.3ZigBee支持网络拓扑2.3.2ZigBee网络编址方式ZigBee网络的编址方式主要有以下两种,一是树形编址,二是随机编址。ZigBee网络中默认的地址分配机制是树形编址。在使用这种编址机制时,首先要确定部分网络参数,包括网络最大深度Lm,子节点最大数目Cm,子节点当中路由器的数量Rm。协调器节点的深度为0,其他节点的深度为其父节点的深度加1。树形节点的地址可以由父节点计算得到。节点地址计算公式如式(2.1)An=Ap+CSkip(d)×Rm+n式(2.1)其中,An代表节点的地址,Ap代表父节点的地址,n是1~(Cm-Rm)的值,CSkip(d)是计算预留地址块大小的函数,其计算公式如式(2.2)CSkip(d)=1+Cm(Lm-d-1),Rm=1式(2.2)CSkip(d)=(1+Cm-Rm-Cm×Rm^(Lm-d-1))/(1-Rm),Rm≠1在这种编址方式中,每个路由器节点都可以给自己的子节点分配地址,并不需要专门的节点分配地址,因此又有分布式地址分配方式之称。这种地址分配方式的缺点是网络拓扑受到很大的限制,同时造成地址浪费。这种编址的好处是路由算法简单。随机编址机制相对于树形编址更加简单。节点加入网络时,它的父节点随机给它分配一个地址,为了尽量避免地址冲突,父节点为其分配地址之前首先检查已知的地址,包括路由表、网络管理器地址、邻居表、路由记录表等中存储的地址信息。即使这样也难免出现地址冲突的情况,这是就需要引入地址冲突检测和解决机制。2.3.3ZigBee网络路由算法介绍ZigBee的路由包括单播路由、广播路由、组播路由,这里只介绍与本论文相关的单播路由。单播路由包括树路由、网状网路由。树路由使用CLUSTER-TREE算法,它依赖于前面讲到的树形编址。树路由过程除了几个必须的网络拓扑参数外,不需要存储其他的信息,计算也很简单,但是由于只能沿着树路径传递数据,路径单一,效率一般情况下比较低,而且可靠性不强,如出现单点故障。网状网路由是ZigBee中一个高效的路由方案,它采用简化后的AODV算法,称之为AODVjr。AODVjr对路由请求,路由应答等命令进行了适当的修改,将标志位、源和目的序号等去掉了,把条数域改为了路径代价域。这种路由算法适合于拓扑和通信环境承载数据量不是很重,而且有时会发生变化的网络。使用AODVjr算法节点之间通信会寻找一条最佳路径。通过“路由代价”来判断最佳路径。2.4NS2网络仿真软件介绍2.4.1NS2软件概述人们提出了很多方法来验证网络协议的正确性和相关性能的测试,目前使用最为广泛的就是通过使用模拟仿真器的虚拟环境来进行测试。而流行的网络模拟仿真软件使用最多的就是NS2和OPNET了,NS2是开源的免费的,而OPNET是商业软件,并不开源,所以现在NS2已经被广大高校用于网络分析、研究和教学。NS2支持大量的协议,并提供了丰富的测试脚本。NS(NetworkSimulator)是网络模拟器的意思,NS2是其第二版。NS是由伯克利大学开发的一款开源的网络模拟软件,它是一个面向对象的网络模拟器,使用C++和OTcl(OrientedToolCommandLanguage)作为开发语言,因此又被称为分裂对象模型开发机制。NS2的系统结构图如图2.4所示。图2.4NS2系统结构图NS2本质上是一个离散事件模拟器,其本身有一个虚拟时钟,所有的模拟都由离散事件驱动。模拟器所做的就是不停的处理一个个事件,直到所有的时间都被处理完或者某一特定的事件发生为止。NS2拥有大量的构件库,例如链路的队列、节点、分组、链路等,并通过对象实现这些实体的特性和功能,这些对象易于组合、易于扩展。用户可以充分利用这些已有的对象,进行少量的扩展,组合出所需要研究的网络系统的模型。图2.5给出了NS构件库的部分类层次结构。图2.5部分网络构建层次结构2.4.2trace文件格式介绍Trace文件是在模拟过程中是生成的记录模拟每一个分组调度事件的文件,一次模拟生成的信息基本上全体现在Trace文件中。Trace文件包含很多有用的可供参考的数据,我们需要从中筛选出我们关注的数据进行分析。NS发展过程中对无线Trace的格式进行过修订,目前NS兼容修订前的无线Trace格式,称修订前的格式为无线网络Trace旧格式。这次论文自使用到Trace旧格式,所以只讲解旧格式。下面是无线网络Trace旧格式。Event/Time/Node/Layer/Flags/Pktid/Pkttype/Pktsize/[MACLayerInfo]//[IPInfo]动作/时间/节点/层次//分组UID/分组类型/分组大小/[MAC层信息]//[IP层信息]s7.200665000_1_MAC0undefined75[0ffffffff1800][1:255-1:255300][zbr102]s7.200665000_6_MAC0undefined75[0ffffffff6800][6:255-1:255300][zbr102]D7.202937033_2_MACLQI0undefined75[0ffffffff3800][3:255-1:255300][zbr102]D7.202937033_0_MACLQI0undefined75[0ffffffff3800][3:255-1:255300][zbr102]r7.203577033_4_MAC0undefined68[0ffffffff3800][3:255-1:255300][zbr102]r7.203602033_4_RTR0undefined68[0ffffffff3800][3:255-1:255300][zbr102]无线网络的Trace旧格式的记录的每项信息:Event:事件的类型,有4种类型s、r、d和f,分别表示分组的发送、接收、丢弃、和转发事件。2.Time:时间的发生时间。3.Node:事件发生的节点ID。4.Layer:发生事件所在的层。5.Flags:标志项。6.Pktid:分组的id。7.Pkttype:分组的类型。8.Pktsize:分组的类型。9.[MACLayerInfo]:MAC层的信息。包含四项内容:第一项是发送节点在无线信道上发送该分组所期望的时间,其值为十六进制表示,单位为妙;第二项是接收节点的MAC地址;第三项内容是发送节点的MAC地址;第四项表示MAC层封装的分组类型,例如0X800表示IP分组,0X0806表示ARP分组。10.:分隔符。11.[IPInfo]:IP层的信息。包含四项内容:第一项是发送分组的源节点地址,格式为“节点号:端口号”;第二项是接收分组的目的节点地址,格式为“节点号:端口号”;第三项是分组的TTL值;第四项是源节点到目的节点的条数。3仿真环境搭建过程3.1Fedora21安装过程首先在Fedora官方网站下载Fedora21Workstation。网址:/zh_CN/workstation/download/,有32位和64位Workstation可选,我选用的是32位Workstation。1.下载之后打开VMWareWorkstation,点击新建虚拟机。,如图3.1所示:图3.1创建虚拟机2.选择典型(推荐)(T)安装,单击下一步。如图3.2所示:图3.2选择典型安装3.点击安装光盘映像文件(iso)前的小圆点,然后点击浏览,找到自己刚才下载的Fedora-Live-Workstation-i686-21-5.iso文件。然后单击下一步。如图3.3所示:图3.3选择安装源文件镜像4.客户机操作系统选择Linux(L),版本选择Fedora,然后单击下一步。(注:如果你下载的是64位的Workstation,请选择Fedora64位。)如图3.4所示:图3.4选择客户机操作系统5.为自己的虚拟机起一个名字,这个可以随意,最好是一眼就能看出是什么系统,什么版本,我这里取名为Fedora。位置(L)是你想要将Fedora虚拟机安装的位置,最好选用一个剩余空间大于20G的磁盘,我选用的位置为:G:\VirtualMachine\fedora。如图3.5所示:图3.5命名虚拟机6.默认配置给Fedora的容量为20G,将虚拟磁盘拆分成多个文件。这里保持默认就好,然后单击下一步。如图3.6所示:图3.6指定磁盘容量7.单击完成结束配置。如图3.7所示:图3.7已准备好创建虚拟机8.单击打开此虚拟机,开始正式安装Fedora21(注:安装前可以设置一下内存了处理器,默认为1GB,1处理器,如果你的电脑是2GB,4处理器,就可以设置为2GB,4处理器,只需要单击【编辑虚拟机设置】设置就好。增加内存和处理器可以使虚拟器安装更快。如果不设置,等安装完成后下次开机前在设置也可以。)如图3.8所示:图3.8开启虚拟机9.然后出现如下图的界面,选择StartFedoraLive,开始进行安装。如图3.9所示:图3.9开始安装Fedora10.选择InstalltoHardDrive,如果选择TryFedora只是试用Fedora而真正的安装到硬盘。如图3.10所示:图3.10安装到硬盘11.选择安装的语言,我选择的中文,然后单击【继续】。如图3.11所示;图3.11选择语言12.接下来设置日期和时间、键盘、安装位置、网络和主机名。只要设置安装位置就好,其他的保持默认。单击带有感叹号的【安装位置】,设置虚拟机的安装位置。如图3.12所示:图3.12安装信息摘要13.安装位置是使我们前面第6步设置的20G硬盘,然后单击【完成】。如图3.13所示:图3.13安装目标位置14.完成以上配置,然后单击【开始安装】,这个过程要进行大概十分钟。如图3.14所示:图3.14开始安装15.在系统安装过程中设置一下root密码,和创建用户。单击【ROOT密码】设置root密码;单击【创建用户】创建普通用户。如图3.15所示:图3.15设置用户密码16.root密码最好是复杂度高的密码,这样有助于保护系统的安全性,root密码一定要记好,如果忘记,要想修改root密码是很麻烦的。如果你设置了一个简单的密码,如123,系统会提示你密码太简单,如果你向继续使用这个密码,单击两次【完成】按钮就可以了。如图3.16所示:图3.16设置root用户密码17.为普通用户设置用户名和密码,也可以不设置密码。如图3.17所示图3.17设置普通用户18.等待安装进度条完成安装,然后单击【完成配置】。如图3.18所示:图3.18完成配置19.接下来,系统自动进行一些配置,重新启动就可以开始使用Fedora21了。如图3.19所示:图3.19Fedora21界面20.在Fedora的terminal中输入ifconfg,发现Fedora并没有获取到IP地址,说明Fedora没有连上Internet。现在关闭Fedora,做一些配置使其能够连上Internet,因为后续步骤安装软件需要使用网络。如图3.20所示:图3.20查看网络21.网络适配器设置为NAT。如图3.21所示:图3.21网络适配器配置22.接下来单击菜单栏【编辑】,选择【虚拟网络编辑器】,对虚拟网络进行设置。如图3.22所示:图3.22虚拟网络编辑器23.单击左下角的【恢复默认设置】,然后单击确定,就会出现中间的小界面,需要等待大概1分钟。如图3.23所示:图3.23恢复默认设置24.接下来重新启动Fedora21,就会在右上角显示一个小方块,提示有限链接,在terminal中输入ifconfig可以看到获取到了IP地址。这是Fedora就可以正常使用了。如图3.24所示:图3.24查看网址3.2NS2的安装过程要安装NS2网络模拟器,首先要下载ns-allinone-2.35.tar.gz安装包,直接在网上搜索ns-allinone-2.35.tar.gz就可以找到很多,我是通过Fedora下自带的火狐浏览器下载的,默认保存在~/下载文件夹下。如图3.25所示:图3.25下载NS2软件包然后打开终端先进行NS2安装前的其他必须软件的安装,否则NS2安装的时候会报错,如checkingforgcc…no等等。打开终端(terminal)依次在终端下输入命令yuminstallgcc。YUM会自动下载rpm包和具有依赖关系的rpm包,进行自动安装。如图3.26所示:图3.26安装gcc当出现Isthisok[y/d/N]:,键入y,按enter键。如图3.27所示:图3.27安装gcc安装完成会出现如下提示。如图3.28所示:图3.28安装gcc接下来还有很多类似的操作,命令分别是:yuminstallgcc-c++ 安装gcc-c++;yuminstalllibX11-devel安装libX11-devel;yuminstallxorg-x11-proto-devel安装xorg-x11-proto-devel;yuminstalllibXt-devel安装libXt-devel;yuminstalllibXmu-devel安装libXmu-devel。接下来就可以安装NS-allinone-2.35了,首先将解压到自己想要安装的文件夹下面,我是先解压到当前文件夹下,命令:tar–zxvfns-allinone-2.35.tar.gz然后再将解压后的文件移动到/usr/local/文件夹下,命令:mvns-allinone-2.35/usr/local/。接下来进入解压后的文件夹,命令:cd/usr/local/ns-allinone-2.35。如图3.29所示:图3.29安装NS2接下来要修改一个文件linkstate中ls.h文件。命令:vi./ns-2.35/linkstate/ls.h在第137行添加高亮的符号。如果没有修改待会安装的时候就会出现make…[linkstate/ls.o]错误。(注:vi中常用命令:1.显示行号,:setnu2.编辑i3.退出esc4.保存退出:x)。如图3.30所示:图3.30安装NS2安装NS2,执行一个安装文件系统会自动安装所有内容。首先进入/usr/local/ns-allinone-2.35/文件夹下。然后输入命令./install,安装完成会出现安装成功的提示。这个过程比较慢,大概需要十几分钟。如图3.31所示:图3.31安装NS2接下来要配置环境变量,命令vi/root/.bash_profile在其最后一行添加下列环境变量参数。exportPATH="$PATH:/usr/local/ns-allinone-2.35/bin:/usr/local/ns-allinone-2.35/tcl8.5.10/unix:/usr/local/ns-allinone-2.35/tk8.5.10/unix"exportPATH="$PATH:/usr/local/ns-allinone-2.35/otcl-1.14:/usr/local/ns-allinone-2.35/lib"exportLD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/ns-allinone-2.35/tcl8.5.10/librarary"接下来关闭终端,重新打开,然后测试环境变量是否设置成功,在终端下输入ns,如果出现%说明环境变量配置成功。如图3.32所示:图3.32测试NS2运行测试用例,测试是否安装成功。命令:ns/usr/local/ns-allinone-2.35/ns-2.35/tcl/ex/simple.tcl,运行成功出现如下图所示的界面。如图3.33所示:图3.33测试NS23.3NS2中添加ZBR路由协议的过程3.3.1协议底层文件新建的协议名字就叫做zbr,在/usr/local/ns-allinone-2.35/ns-2.35/文件夹下新建zbr目录,在zbr目录下包含zbr.h,zbr.cc,zbr_packet.h,zbr_rtable.h,zbr_rtable.cc,zbr_link.cc,zbr_link.h,zbr_rqueue.cc,zbr_rqueue.h九个文件,这9个文件包含在毕业设计的光盘中。3.3.2需要修改的文件需要对ns2中的一些文件进行修改,来使这个协议在tcl中被调用,需要修改的文件有以下几个:common/packet.h;trace/cmu-trace.h;trace/cmu-trace.cc;tcl/lib/ns-packet.tcl;tcl/lib/ns-default.tcl;tcl/lib/ns-lib.tcl;queue/priqueue.cc;Makefile3.3.3需要修改的具体内容common/packet.h(两个需要修改的地方,添加代码)第一个大约在202行:staticconstpacket_tPT_MDART=72;staticconstpacket_tPT_ZBR=73; //新添加staticpacket_tPT_NTYPE=74;//这一行必须为最后一行第二个大约在421行:name_[PT_DCCP_RESET]="DCCP_Reset";name_[PT_ZBR]="zbr";//新添加name_[PT_NTYPE]="undefined";trace/cmu-trace.h(一个需要修改的地方:添加代码)大约在165行: voidformat_mdart(Packet*p,intoffset); voidformat_zbr(Packet*p,intoffset);//新添加 //Thisholdsallthetracersaddedatrun-time staticPacketTracer*pktTrc_;trace/cmu-trace.cc(需要修改三个地方)第一个:在大约55行添加头文件:#include<zbr/zbr_packet.h>第二个:找个合适的地方加上下面的函数:可以在大约864行添加voidCMUTrace::format_zbr(Packet*p,intoffset){structhdr_zbr*zh=HDR_ZBR(p);structhdr_zbr_request*rq=HDR_ZBR_REQUEST(p);structhdr_zbr_reply*rp=HDR_ZBR_REPLY(p);switch(zh->ah_type){caseZBRTYPE_RREQ: if(pt_->tagged()){ sprintf(pt_->buffer()+offset, "-zbr:t%x-zbr:h%d-zbr:b%d-zbr:d%d" "-zbr:ds%d-zbr:s%d-zbr:ss%d" "-zbr:cREQUEST", rq->rq_type,rq->rq_hop_count,rq->rq_bcast_id,rq->rq_dst,rq->rq_dst_seqno,rq->rq_src,rq->rq_src_seqno); }elseif(newtrace_){ sprintf(pt_->buffer()+offset, "-Pzbr-Pt0x%x-Ph%d-Pb%d-Pd%d-Pds%d-Ps%d-Pss%d-PcREQUEST", rq->rq_type,rq->rq_hop_count,rq->rq_bcast_id,rq->rq_dst,rq->rq_dst_seqno,rq->rq_src,rq->rq_src_seqno); }else{ sprintf(pt_->buffer()+offset, "[0x%x%d%d[%d%d][%d%d]](REQUEST)", rq->rq_type,rq->rq_hop_count,rq->rq_bcast_id,rq->rq_dst,rq->rq_dst_seqno,rq->rq_src,rq->rq_src_seqno); }break;caseZBRTYPE_RREP:caseZBRTYPE_HELLO: caseZBRTYPE_RERR: if(pt_->tagged()){ sprintf(pt_->buffer()+offset, "-zbr:t%x-zbr:h%d-zbr:d%d-zbr:ds%d" "-zbr:l%f-zbr:c%s", rp->rp_type, rp->rp_hop_count, rp->rp_dst, rp->rp_dst_seqno, rp->rp_lifetime, rp->rp_type==AODVTYPE_RREP?"REPLY": (rp->rp_type==AODVTYPE_RERR?"ERROR": "HELLO")); }elseif(newtrace_){ sprintf(pt_->buffer()+offset, "-Pzbr-Pt0x%x-Ph%d-Pd%d-Pds%d-Pl%f-Pc%s", rp->rp_type, rp->rp_hop_count, rp->rp_dst, rp->rp_dst_seqno, rp->rp_lifetime, rp->rp_type==ZBRTYPE_RREP?"REPLY": (rp->rp_type==ZBRTYPE_RERR?"ERROR": "HELLO")); }else{ sprintf(pt_->buffer()+offset, "[0x%x%d[%d%d]%f](%s)", rp->rp_type, rp->rp_hop_count, rp->rp_dst, rp->rp_dst_seqno, rp->rp_lifetime, rp->rp_type==ZBRTYPE_RREP?"REPLY": (rp->rp_type==ZBRTYPE_RERR?"ERROR": "HELLO")); }break;default:#ifdefWIN32fprintf(stderr, "CMUTrace::format_zbr:invalidZBRpackettype\n");#else fprintf(stderr, "%s:invalidZBRpackettype\n",__FUNCTION__);#endifabort();}}第三个:在大约1529行添加casePT_PING: break;casePT_ZBR://新添加 format_zbr(p,offset);//新添加 break;//新添加casePT_ARP: format_arp(p,offset); break;tcl/lib/ns-packet.tcl(需要修改一个:添加)大约172行:添加:#Wireless: ARP #AddressResolutionProtocol,networkwirelessstack GAF #GeographicAdaptiveDelity,forad-hocnetworks LL #networkwirelessstackLRWPAN#zheng,wpan/p802_15_4mac.cc Mac #networkwirelessstack ZBR#ZigBee新添加tcl/lib/ns-default.tcl(需要修改一个)最后一行添加:#DefaultsdefinedforzbrAgent/ZBRsetaccessible_var_truetcl/lib/ns-lib.tcl(需要修改两个)第一个:大约672行添加ZBR{setragent[$selfcreate-zbr-agent$node]}第二个:大约891行添加Simulatorinstproccreate-zbr-agent{node}{ #Createzbrroutingagent setragent[newAgent/ZBR[$nodenode-addr]] $selfat0.0"$ragentstart" $nodesetragent_$ragent return$ragent}queue/priqueue.cc(需要修改一个)大约93行:casePT_AODV:casePT_ZBR://新添加casePT_AOMDV:wpan/p802_15_4sscs.h(需要修改一个)在大约57行,打开ZigBeeIF:#defineZigBeeIFwpan/p802_15_4sscs.cc(需要修改一个)大约在179行添加#ifdefZigBeeIF boolnoCapacity; intchild_num; intlogAddr;#endif //weassigntheclustertreeaddressastheMACshortaddressMakefile(需要修改一个)修改OBJ_CC=\大约在335行:zbr/zbr.ozbr/zbr_link.ozbr/zbr_rtable.ozbr/zbr_rqueue.o\3.3.4编译进入ns-2.35目录下输入下名命令进行编译:$makeclean$make$sudomakeinstall以后若修改了程序,需要先make再执行sudomakeinstall(这一步必须执行)3.3.5测试脚本参考ns-allinone-2.35/ns-2.35/tcl/ex/wpan下面的脚本。3.4gnuplot的安装gnuplot是一个使用命令进行科学绘制图形的工具,它能够把数据函数或数据资料转换成直观的二维或三维图形,方便进行数据分析。这次设计要使用到这个工具,用它将测试出来的数据绘制成为图形,方便对比和分析。gnuplot的安装过程十分简单,在终端下输入命令:yuminstallgnuplot进行安装就可以了。安装完成后在Fedora终端运行命令gnuplot,就会进入gnuplot的绘图环境,再输入plotsin(x)就会自动绘制出sin(x)的曲线图。如图3.34所示:图3.34测试gnuplot3.5本章小结俗话说:工欲善其事必先利其器。本章节基于windows7操作系统,在其上安装VMWareWorkstation,然后在VM中安装Linux工作环境,如RedHat、CentOS、Ubuntu、Fedora等,这里选择了Fedora21作为Linux工作环境,然后在Fedora上安装了NS2网络模拟软件,在NS2网络模拟软件中添加了这次设计需要的ZBR路由协议,而后有安装了gnuplot绘图软件。Linux工作环境、NS2软件、ZBR协议、gnuplot绘图软件都是进行协议仿真和分析必不可少的工具,只有做好了前面的铺垫工作,才能做接下来要做的仿真工作。上面的工作还有一个替代方案。就是在windows工作环境下安装cygwin+ns2进行仿真实验。4仿真过程与仿真结果分析4.1使用NS2进行模拟的基本流程使用NS2进行网络模拟基本操作流程如图4.1所示,用户首先进行问题定义,考虑自己要模拟什么内容,大概的拓扑应该怎样,是否需要对源代码进行修改或添加功能等。如果需要添加或修改代码,如图中右边方框中所示,有一个对NS2源码进行修改、重新编译和调试的过程;如果不需要修改代码,即采用NS2已有构件即可完成模拟工作,那么用户的主要任务就是编写Tcl/OTcl模拟代码,生成一个.tcl脚本文件,并在NS2环境下执行该脚本进行模拟,模拟程序结束后会生成相应的Trace文件,即模拟结果文件,用户使用不同的工具对脚本中的内容进行分析得到想要的结果图表。如果使我们所预期的,那么整个模拟过程即可顺利结束,否则,应该分析问题所在,并重新考虑问题定义、源码及Tcl脚本的修改。需要需要修改源代码时额外工作量满意不满意未通过通过需要结束分析任务需要修改源代码?编写Tcl脚本执行模拟分析结果结果满意?开始分析问题所在修改源代码重新编译NS编译通过?调试NS不需要图4.1NS2进行图4.1NS2进行网络模拟基本流程图4.2星型拓扑环境搭建和模拟4.2.1任务分析拓扑共设置7个节点,其中中心节点作为PAN协调器,其余6个节点为设备节点。节点0、节点1、节点3、节点4、节点5、节点6分别向节点2发送CBR(ConstantBitRate)恒定速率数据流,分别使用cluster-tree路由协议和zbr路由协议对其做Trace记录,然后分析对比两种算法的平均延迟、丢包率、控制包数量。4.2.2编写Tcl脚本设置各个节点的位置,保存在topo.scn中,这个文件供tcl脚本使用。以节点0为例,node_(0)为节点的名字,setX_25是设置x坐标为25,setY_25是设置y坐标为25,setZ_0是设置Z坐标为0,因为设计中选用的是TwoRayGround,既二径传输信道,没有使用到三维,所以Z坐标设置为0,这样0节点正好位于拓扑图的中心。其他六个节点按照同样的方法进行设置。下面是节点0的位置代码。$node_(0)setX_25$node_(0)setY_25$node_(0)setZ_0拓扑的结构图如图4.2所示:图4.2星型拓扑下面编写模拟仿真的tcl脚本,使用tcl来描述模拟环境中网络的环境和参数设置,脚本文件保存在star.tcl中。下面是一些重要代码描述:设置无线节点参数,包括无线节点使用的物理信道、无线电波传播模型、物理层使用标准、MAC使用标准、接口队列类型、链路层类型、天线模型、使用的路由协议等,这里面由于是做ZigBee的协议仿真,所以在物理层和MAC层标准使用802.15.4,路由协议使用ZBR(ZigBeeRouting)。setval(chan)Channel/WirelessChannel;#物理信道类型setval(prop)Propagation/TwoRayGround;#无线电波传播模型setval(netif)Phy/WirelessPhy/802_15_4 ;#物理层使用802.15.4标准setval(mac)Mac/802_15_4;#媒体接入层使用802.15.4标准setval(ifq)Queue/DropTail/PriQueue;#接口队列类型setval(ll)LL;#链路层类型setval(ant)Antenna/OmniAntenna;#天线模型setval(ifqlen)150;#最大包队列setval(nn)7;#移动节点数量setval(rp)ZBR;#路由协议为ZigBee协议setval(x) 50 ;#设定拓扑范围——长度50msetval(y) 50 ;#设定拓扑范围——宽度50m开启Trace跟踪文件和NAM显示文件,在运行完tcl脚本后运用star.tr进行结果分析,运用star.nam进行模拟演示。setns_ [newSimulator];#初始化一个仿真对象ns_settracefd[open./star.trw];#trace跟踪文件保存在star.tr中$ns_trace-all$tracefd;#开启trace跟踪文件if{"$val(nam)"=="star.nam"}{;#namtrace显示文件,保存在star.nam中setnamtrace[open./$val(nam)w]$ns_namtrace-all-wireless$namtrace$val(x)$val(y)}设置每个节点的通信半径为15m。CSThresh_信号感应门限,当两个信号发生碰撞,被某几个节点同时接收时,若其中一个信号的强度是另一个的CSThresh_倍以上时,虽然受到另一信号的干扰,它仍能被解调,假若不满足这一条件,两个信号都不能直接被接收端感应。RXThresh_信号接收门限,当信号强度大于信号接收门限才能被接受。#Formodel'TwoRayGround'setdist(5m)7.69113e-06;#距离为5m时信号接收或发送门限值setdist(9m)2.37381e-06;#距离为9m时信号接收或发送门限值setdist(10m)1.92278e-06;#距离为10m时信号接收或发送门限值setdist(11m)1.58908e-06;#距离为11m时信号接收或发送门限值setdist(12m)1.33527e-06;#距离为12m时信号接收或发送门限值setdist(13m)1.13774e-06;#距离为13m时信号接收或发送门限值setdist(14m)9.81011e-07;#距离为14m时信号接收或发送门限值setdist(15m)8.54570e-07;#距离为15m时信号接收或发送门限值setdist(16m)7.51087e-07;#距离为16m时信号接收或发送门限值setdist(20m)4.80696e-07;#距离为20m时信号接收或发送门限值setdist(25m)3.07645e-07;#距离为25m时信号接收或发送门限值setdist(30m)2.13643e-07;#距离为30m时信号接收或发送门限值setdist(35m)1.56962e-07;#距离为35m时信号接收或发送门限值setdist(40m)1.20174e-07;#距离为40m时信号接收或发送门限值Phy/WirelessPhysetCSThresh_$dist(15m);#设置CSThresh为15mPhy/WirelessPhysetRXThresh_$dist(15m);#设置RXThresh为15m配置节点的属性,默认为RN+,使用AODVjr路由算法,将RNType设置为1就是使用CLUSTER-TREE路由算法。#defaultisRN+,soonlysetRN-$node_(0)RNType0$node_(1)RNType0$node_(2)RNType0$node_(3)RNType0$node_(4)RNType0$node_(5)RNType0调用节点的位置信息。source./topo.scn开启PAN协调器、协调器和设备。$nodesscsstartPANCoord<txBeacon=1><beaconOrder=3><SuperframeOrder=3>这条命令用来开启一个新的PAN,并且节点会被作为PAN协调器,使用时可以省略一下参数,省略的参数就是用默认配置。$nodesscsstartDevice<isFFD=1><assoPermit=1><txBeacon=0><beaconOrder=3><SuperframeOrder=3>这条命令用于开启一个设备或协调器,可以省略一些参数,如:$node_(0)sscsstartDevice0表示开启一个没有协调器能力的设备;如:$node_(0)sscsstartDevice表示开启一个非信标模式的协调器;如:$node_(0)sscsstartDevice111表示开启一个信标模式的协调器。$nodesscsstartCTPANCoord<txBeacon=1><beaconOrder=3><SuperframeOrder=3>这条命令用于开启一个基于clustertree的PAN协调器。$nodesscsstartCTDevice<isFFD=1><assoPermit=1><txBeacon=0><beaconOrder=3><SuperframeOrder=3>这条命令用于开启一个基于clustertree的设备,其用法与命令(b)相似。$ns_at0.0 "$node_(0)NodeLabelPANCoor"$ns_at0.0 "$node_(0)sscsstartCTPANCoord";#在0.0秒开启PAN节点0$ns_at0.5 "$node_(1)sscsstartCTDevice10" ;#在0.5秒开启设备节点1$ns_at1.5 "$node_(2)sscsstartCTDevice10"$ns_at2.5 "$node_(3)sscsstartCTDevice10"$ns_at3.5 "$node_(4)sscsstartCTDevice10"$ns_at4.5 "$node_(5)sscsstartCTDevice10"$ns_at5.5 "$node_(6)sscsstartCTDevice10"控制节点间流量,控制节点间流量源节点,目的节点,发送间隔,开始时间。if{("$val(traffic)"=="cbr")||("$val(traffic)"=="poisson")}{puts"\nTraffic:$val(traffic)"#Mac/802_15_4wpanCmdack4dataonputs[format"Acknowledgementfordata:%s"[Mac/802_15_4wpanCmdack4data]]#修改nam演示速度$ns_at$appTime1"Mac/802_15_4wpanNamPlaybackRate0.3ms"$ns_at[expr$appTime1+0.5]"Mac/802_15_4wpanNamPlaybackRate1.5ms"#设置节点流量的源、目的、发送间隔、开始时间$val(traffic)traffic021.4$appTime1$val(traffic)traffic121.4$appTime2$val(traffic)traffic321.4$appTime3$val(traffic)traffic421.4$appTime4$val(traffic)traffic521.4$appTime5$val(traffic)traffic621.4$appTime6#设置提示信息$ns_at$appTime1"$ns_trace-annotate\"(at$appTime1)$val(traffic)trafficfromnode0tonode2\""$ns_at$appTime3"$ns_trace-annotate\"(at$appTime2)$val(traffic)trafficfromnode1tonode2\""$ns_at$appTime5"$ns_trace-annotate\"(at$appTime3)$val(traffic)trafficfromnode3tonode2\""$ns_at$appTime1"$ns_trace-annotate\"(at$appTime4)$val(traffic)trafficfromnode4tonode2\""$ns_at$appTime3"$ns_trace-annotate\"(at$appTime5)$val(traffic)trafficfromnode5tonode2\""$ns_at$appTime5"$ns_trace-annotate\"(at$appTime6)$val(traffic)trafficfromnode6tonode2\""#设置不同类型流量的显示颜色Mac/802_15_4wpanNamFlowClr-pAODV-ctomatoMac/802_15_4wpanNamFlowClr-pARP-cgreenMac/802_15_4wpanNamFlowClr-pMAC-s0-d-1-cnavyif{"$val(traffic)"=="cbr"}{ setpktTypecbr}else{ setpktTypeexp}#设置点到点流量的显示颜色Mac/802_15_4wpanNamFlowClr-p$pktType-s0-d2-cblueMac/802_15_4wpanNamFlowClr-p$pktType-s1-d2-cgreen4Mac/802_15_4wpanNamFlowClr-p$pktType-s3-d2-ccyan4Mac/802_15_4wpanNamFlowClr-p$pktType-s4-d2-credMac/802_15_4wpanNamFlowClr-p$pktType-s5-d2-cyellowMac/802_15_4wpanNamFlowClr-p$pktType-s6-d2-cblack}结束进程,相当于程序中的析构函数,将开始创建的trace进程,如果要演示nam动画,就执行namcstop{}{globalns_tracefdappTime1valenv$ns_flush-traceclose$tracefd;#关闭trace进程sethasDISPLAY0foreachindex[arraynamesenv]{#puts"$index:$env($index)"if{("$index"=="DISPLAY")&&("$env($index)"!="")}{sethasDISPLAY1}}if{("$val(nam)"=="test1.nam")&&("$hasDISPLAY"=="1")}{ execnamstar.nam&;#执行nam演示仿真过程}}开始执行仿真模拟。puts"\nStartingSimulation..."$ns_run;#开始执行仿真模拟4.2.3执行模拟执行star.tcl脚本,在Fedora终端中的star.tcl存放的文件夹下输入命令nsstar.tcl,运行完成后使用ls命令查看当前文件夹中的所有文件,会发现产生了star.tr和star.nam两个文件,其中star.tr是trace跟踪文件,star.nam是NAM显示文件。其中star.tr文件用于后续做数据分析使用,star.nam文件用来简单的动画演示整个模拟过程。4.2.4修改路由算法复制star.tcl更名为star2.tcl,命令:cpstar.tclstar2.tcl。然后打开start2.tcl将tcl脚本中的star.tr改为star2.tr,将star.nam改为star2.nam,然后修改节点的属性RNType=1,修改节点的开启命令。#defaultisRN+,soonlysetRN-$node_(0)RNType1;#使用AODVjr算法$node_(1)RNType1$node_(2)RNType1$node_(3)RNType1$node_(4)RNType1$node_(5)RNType1$node_(6)RNType1#开启设备和协调器$ns_at0.0 "$node_(0)NodeLabelPANCoor"#startPANCoord<txBeacon=1><BO=3><SO=3>$ns_at0.0 "$node_(0)sscsstartPANCoord" #startDevice<isFFD=1><assoPermit=1><txBeacon=0><BO=3><SO=3>#$ns_at0.5 "$node_(1)sscsstartDevice10" #$ns_at1.5 "$node_(2)sscsstartDevice10"#$ns_at2.5 "$node_(3)sscsstartDevice10"#$ns_at3.5 "$node_(4)sscsstartDevice10"#$ns_at4.5 "$node_(5)sscsstartDevice10"#$ns_at5.5 "$node_(6)sscsstartDevice10"4.2.5再次执行模拟执行star2.tcl脚本,在Fedora终端中的star2.tcl存放的文件夹下输入命令nsstar2.tcl,运行完成后使用ls命令查看当前文件夹中的所有文件,会发现产生了star2.tr和star2.nam两个文件,其中star2.tr是trace跟踪文件,star2.nam是NAM显示文件。4.3星型拓扑仿真结果分析利用仿真模拟后产生的star.tr文件,对Trace结果进行分析,比较使用AODVjr和CLUSTER-TREE路由算法端到端的平均延时、控制包的个数、数据包的丢失率。4.3.1gawk工具介绍在进行分析Trace结果的过程中会使用到Linux中的gawk工具,gawk每次从Trace文件中读取一行,将读取的数据行分割成n个字段,一般来说是以空格符来分割相邻的字段。表4.1以start.tr中的一行数据为例进行说明。表4.1字段分割表$1$2$3$4$5$6$7$8$9$10$11$12$13$14S7.200000000_2_AGT1cbr70[0000][2:12:2320][0]00当gawk把一行数据读入之后,会把每一个字段存放在字段变量内,如表4.2所示:表4.2字段变量说明字段变量意义$0为一字符串,其内容为目前awk所读入的数据行$1代表$0上第一个字段的数据$2代表$0上第二个字段的数据……编写awk文件result.awk计算平均时延、丢包率、控制包数量。result.awk文件代码与注释如下:BEGIN\{highest_packet_id=0;#初始化最高分组IDrecv_packets=0;#初始化接收包数量send_packets=0; #初始化发送包数量ctrl_packets=0;#初始化控制包数量}{action=$1;#第1个字段$1标识事件的类型time=$2; #第2个字段$2标识事件发送时间node=$3; #第3个字段$3标识事件发生所在的节点agent=$4; #第4个字段$4标识事件所发生的代理packet_id=$6; #第6个字段$6标识事件的分组IDtype=$7; #第7个字段$7标识事件的分组类型#更新最高分组IDif(action=="s"&&packet_id>=highest_packet_id)highest_packet_id=packet_id;#记录发包时间和发包数量if(action=="s"&&agent=="AGT"&&type=="cbr")\{send_time[packet_id]=time; ++send_packets;}#记录发包时间和和控制包数量if(action=="s"&&agent=="RTR")\{send_time[packet_id]=time; ++ctrl_packets;}#记录接收包时间和控制包数量if(action=="r"&&agent=="AGT"&&type!="cbr")\{recv_time[packet_id]=time;++recv_packets;}}END\{lost_ratio=(send_packets-recv_packets)/(send_packets+1);#+1是因为有0号分组的原因printf("Sendpackets=%d\n",send_packets);#输出发送包数量printf("Recvpackets=%d\n",recv_packets);#输出接收包数量printf("Lostratio=%.9f\n",lost_ratio);#输出丢包率average_delay=sum/(recv_packets);printf("Theaveragedelaytime=%.9f\n",average_delay);#输出平均延时printf("TheCtrlpacket=%d\n",ctrl_packets);#控制包数量}4.3.2传输延时网络的传输时延D(end-to-endDelay)定义为源节点发送出一个分组到目的节点接收到该分组之间的时间差,它包括电(或光)信号在物理介质中的传播延时和数据在网络中的处理延时,也即指网络中数据流量传输所用的时间。在分析网络的传输时延时,一般都统计平均传输时延D,平均传输时延D的计算如式(4.1)。平均延时=所有延时之和÷传输数据包数量式(4.1)打开star.tcl脚本,设置数据流的发送包间隔为0.1秒,执行nsstar.tcl,产生star.tr文件,然后执行awk–fresult.awkstar.tcl计算出传输延时,然后平均延迟数据记录到rt_delay.data,如图4.3所示。图4.3result.awk运行结果然后再分别修改数据流的发送包间隔为0.2秒、0.3秒、0.4秒……1.0秒,重复上述步骤,将平均延迟保存到rt_delay.data中。打开star2.tcl文件,按照star.tcl的步骤,将计算出来的数据保存在zbr_delay.data中。在终端输入gnuplot进入gnuplot绘图进程,然后输入下面命令:gnuplot>setxlabel"发包间隔"gnuplot>setylabel"平均延迟"gnuplot>plot"rt_delay.data"withlinespoints,"zbr_delay.data"withlinespoints绘制出cluster-tree路由协议与ZBR路由协议在不同发包间隔下的平均延迟对比图样,如图4.4所示。图4.4平均延迟图样从图中可以看出cluster-tree的平均延迟在发包间隔高于0.2秒时都高于AODVjr路由协议,这主要是因为使用AODVjr路由算法的发送报文可以选用最佳路径,在物理介质间的传输时间会更短,但二者相差不多,主要是拓扑太小,最佳路径和树形路径的距离相差无几。4.3.3丢包率丢包率L(PacketLossRatio)定义了传输期间网络丢失分组的数量,通常指的是在特定时间段内丢失的分组占传输的数据总量的比例。发生丢包的原因很多,例如网络拥塞、接收分组的缓冲区太小、TTL值超过规定值以及无线信号的同频干扰等。丢包率也是反应网络质量的一个重要参数,丢包率的计算公式如式(4.2)。丢包率=(发送包数量-接收包数量)/发送包数量式(4.2)打开star.tcl脚本,设置数据流的发送包间隔为0.1秒,执行nsstar.tcl,产生star.tr文件,然后执行awk–fresult.awkstar.tcl计算出传输延时,然后平均延迟数据记录到rt_ratio.data,然后再分别修改数据流的发送包间隔为0.2秒、0.3秒、0.4秒……1.0秒,重复上述步骤,将平均延迟保存到rt_ratio.data中。打开star2.tcl文件,按照star.tcl的步骤,将计算出来的数据保存在zbr_ratio.data中。在终端输入gnuplot进入gnuplot绘图进程,然后输入下面命令:gnuplot>setxlabel"发包间隔"gnuplot>setylabel"丢包率"gnuplot>plot"rt_ratio.data"withlinespoints,"zbr_ratio.data"withlinespoints绘制出cluster-tree路由协议与ZBR路由协议在不同发包间隔下的丢包率对比图样,如图4.5所示。图4.5丢包率图样从丢包率来看,ZBR协议丢包率要小于CLUSTER-TREE,由于相对于CLUSTER-TREE而言,ZBR使用了AODVjr算法,路径更短,丢包率相对较小。4.3.4控制包数量控制包的数量定义了在发送数据包的数量一样时,控制包的数量越少,数据传输效率就越高。打开star.tcl脚本,设置数据流的发送包间隔为0.1秒,执行nsstar.tcl,产生star.tr文件,然后执行awk–fresult.awkstar.tcl计算出传输延时,然后平均延迟数据记录到rt_control.data,然后再分别修改数据流的发送包间隔为0.2秒、0.3秒、0.4秒……1.0秒,重复上述步骤,将平均延迟保存到rt_control.data中。打开star2.tcl文件,按照sta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论