OMNet++ 学习:10 分钟教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

OMNet++10分钟教程本文适合对网络模拟器有一定了解的读者,阅读本文时,最好同时打开用户手册和API文档以便随时查阅。1.在omnetpp.org中提到的仿真模型和框架与OMNet++是什么关系?OMNet++提供了基本的工具和机制来编写仿真代码,但它本身并不提供任何特定用于计算机网络仿真,系统架构仿真和任意其它领域的组件;具体的仿真是由一些仿真模型和框架如MobilityFramework或INETFramework来支持,这些模型独立于OMNet++开发,并有自己的发布周期。2.OMNet++提供了什么?一个C++库,它由仿真内核及一些用来创建仿真组件(简单模块和信息)的工具类(如随机数生成,统计收集,拓扑发现等);组装和配置这些组件的基础设施(NED语言,ini文件);运行时用户接口或仿真环境(TKenv,Cmdenv);一个用来设计,运行和评估仿真的IDE环境;实时仿真的扩展接口;MRIP,并行的分布式仿真,数据库连接等等这些组成。3.OMNet++的仿真模型是什么样的?OMNet++提供了一个基于组件的架构,模型是由可重用的组件或模块组成的。模块之间可以通过gates(在其它系统中称为ports,即端口)进行连接,以构成复合模块。每个仿真模型是一个复合模块类型的实例。这一层次(组件和拓扑)由NED文件来处理。例如,一个名为EtherMAC的组件可以用NED来描述:////EthernetCSMA/CDMAC//simpleEtherMAC{parameters:stringaddress;//othersomittedforbrevitygates:inputphyIn;//tophysicallayerorthenetworkoutputphyOut;//tophysicallayerorthenetworkinputllcIn;//toEtherLLCorhigherlayeroutputllcOut;//toEtherLLCorhigherlayer}它可以使用在下面的Ethernetstation的模型中:////HostwithanEthernetinterface//moduleEtherStation{parameters:...gates:...inputin;//forconnectingtoswitch/hub,etcoutputout;submodules:app:EtherTrafficGen;llc:EtherLLC;mac:EtherMAC;connections:app.out--llc.hlIn;app.in--llc.hlOut;llc.macIn--mac.llcOut;llc.macOout--mac.llcIn;mac.phyIn--in;mac.phyOut--out;}其中,注释能用来生成文档。简单模块,例如上面的EtherMAC,会与一个C++文件关联以提供行为,它是以simple关键字来声明的。复合模块则是用module关键字来声明的,为了仿真一个EthernetLAN,应该创建一个复合模块EtherLAN并用network关键字来表示它可以通过自身运行。networkEtherLAN{...(submodulesoftypeEtherStation,etc)...}NED文件可以在IDE中以图形化方式或文件模式编辑。NED文件只定义了模型的结构(拓扑),其行为和模块参数的某个子集则是开放的,如前面所提到的,行为是通过在简单模块相关联的C++代码来定义的,而在NED文件中没有赋值的模块参数则从ini文件中获取它们的值。4.如何运行仿真?如果EtherMAC,EtherLLC和EtherTrafficGen相应的代码已经编写好,就可以编译成可执行文件,并在omnetpp.ini中定义运行的参数,然后就可以作为一个单独的仿真程序来运行。在最简单的情况下,即当所有东西都在一个目录中的时候,只需要输入:opp_makemake--deepmakeopp_makemake创建了一个拥有恰当设置的makefile,所以你不用做任何其它事情。但是如果源文件在几个不同的目录中,例如要使用INET框架的时候,则需要传递额外的参数,如给opp_makemake传递-I参数,这种情况下最好查阅这些框架的文档或从已有的makefile系统中得到一些提示。为了运行仿真,需要一个omnetpp.ini文件,否则会得到下面的错误:$./etherlanOMNeT++/OMNESTDiscreteEventSimulation(C)1992-2005AndrasVarga[....]Errorduringstartup:Cannotopeninifile`omnetpp.ini'ini文件的其中一个功能是定义仿真某个特定的网络(因为可以在NED文件中定义一个或多个network.endnetwork定义。同时,也可以动态地指定载入的NED文件(即默认不载入),为模块参数赋值,指定仿真的运行时间和用于生成随机数的种子,以及需要收集的统计量,或者用不同的参数设置来建立几个实验。一个omnetpp.ini的样例如下:[General]network=etherLAN*.numStations=20**.frameLength=normal(200,1400)**.station[0].numFramesToSend=5000**.station[1-5].numFramesToSend=1000**.station[*].numFramesToSend=0由上可以看到,可以在为模块参数赋值时使用通配符。在NED文件中的参数赋值首先进行,而那些没有赋值的的参数则可以在ini文件中赋值(也就是说,在NED中的参数值不能被ini文件中的值覆盖)。如果最后仍然有一些参数没有被赋值,则会在运行时以交互的方式取得。如果需要使用不同名字的ini文件,可以传递–f参数,这样就可以同时传递多个文件:$./etherlan-fcommon-settings.ini-fparams15.ini-fseeds3.ini在默认情况下,会以图形用户接口TKenv来运行。如果想要转到命令行接口(为了进行批处理执行),则将可执行文件链接到不同的库即可:通过编辑makefile的下列几行:#Userinterface(uncommentone)(-uoption)#USERIF_LIBS=$(CMDENV_LIBS)USERIF_LIBS=$(TKENV_LIBS)注释掉Tkenv那一行,指定为cmdenv,然后输入make进行重新链接。另一种可选的方法是在创建makefile的时候,使用opp_makemake的–uCmdenv选项。注意到,也可以创建自已的GUI。通过阅读src/cmdenv/cmdenv.cc文件会对你有所帮助。将OMNet++嵌入到其它的应用程序(例如需要进行仿真的一些分析和设计工具)也是相似的,这已经被一些商业公司所实践。5.仿真的输出是什么?仿真过程中会有向量输出和标题输出,默认文件名为omnetpp.vec和omnetpp.sca,尽管omnetpp.ini可以指定输出为不同的文件名,仍需要在简单模块中进行编码以让其拥有记录仿真结果的能力,所以在他人编写的仿真中可能并不创建这些文件。一个输出向量文件包含若干输出向量,每一个向量都是一个(timestamp,value)对。输出向量可以存储例如关于时间的队列长度,接收数据包时端到端的延迟,丢弃的数据包或者信道吞吐量—任意在简单模块中的编程所定义的统计量都可以。并且,可以在omnetpp.ini中配置输出向量:即可以启用或者关闭记录某个输出向量,或者用一定的仿真时间间隔来进行限制。可以通过查看cOutVector对象的C++的源代码来查看一个简单模块可以获取的输出向量。输出向量根据时间来捕获行为,而输出标量文件则包含总的统计量:发送包的数目,丢弃包的数目,平均的端到端延迟,吞吐量的峰值等。可以在recodScala()方法的调用,特别是在一个简单模块类中的finish()方法中查看输出标量。输出向量可以用Plove程序来绘图,而输出标量则可以使用Scalars程序来绘图。6.关于随机数OMNeT++默认的随机数生成器是MersenneTwister,种子可以自动获取,或者在omnetpp.ini中定义。OMNeT++支持很多种概率分布,并且在NED和C++中都是可用的(在3.2版本中有14个连续的分布和6个离散的分布,具体可以查看APIdoc)。非常量的模块参数可以用随机变量来赋值,如exponential(0.2),它表示C++代码会在每次读取参数时获得一个不同的数字;这是指定随机流量源的一种很方便的方法。(常量参数也能用表达式如exponential(0.2)来赋值,但它只会被计算一次并且不再改变)。7.是否可以在OMNeT++中进行MRIP,分布式并行仿真,网络模拟,或featureX?可以。OMNet++具有很强的可扩展性并且开放源代码,一些特性是可以开箱即用的:MRIP是指multiplereplicationsinparallel,而Akaroa是一个很出色的工具。你可以单独地下载并安装它,然后启用OMNet++的Akaroa支持进行重新编译,但AFAIKAkaroa仅可以在Linux(*nix)中使用,在OMNeT++的手册中可以找到更多信息。如果仿真需要大量的内存,则可以在集群中运行仿真。分块和其它配置可以在omnetpp.ini中定义,但仿真模型本身却不用进行改变(除非模型包含全局变量可能导致不能分布地运行)。通信层使用的是MPI,但事实上这是可配置的,所以如果你没有MPI的话也仍然可以通过命名管道,或者基于文件的信息交换来进行一些基本的测试。当然如果需要,你也可以通过实现abstractcParsimCommunications接口来添加一个新的方案。网络模拟,实时仿真和类似于hardware-in-the-loop的功能是可用的,这是因为在仿真内核中的事件调度器是可插拔的。OMNet++的一个Demo展示了如何进行实时仿真和一个简单的网络模拟的样例,足以让你进入这个领域。RealnetworkemulationwiththeINETFrameworkisinthequeue.可以用一个数据库来代替omnetpp.ini文件作为配置数据的源,也能将仿真结果重定向到数据库中,OMNeT++中包含这样一个Demo,可以作为参考。由于你拥有全部的源代码和良好的文档,所以你能根据自己的想法来实现很多事情。8.如何在C++代码中编写模型?简单模块其实是C++类,你从cSimpleModule继承子类,重定义一个虚成员函数,并通过Define_Module()宏来将新的类注册到OMNeT++中。模块间主要使用消息传递进行通讯,而timers(timeouts)也处理模块发送给自身的消息。消息应当是cMessage类或者是其子类,消息将被传递到模块的handleMessage(cMessage*msg)方法,在这里应当添加你的代码。几乎你想定义的模块行为都在handleMessage()之中定义,因此这段代码块可能会很长,所以将其重构为其它成员函数例如命名为processTimer(),processPacket()是一个好主意(可以将activity()方法视为handleMessage()的一个替换,但是在实践中最好不要这么做。)。你可以使用send(cMessage*msg,constchar*outGateName)方法来向其它模块传递消息,对于无线仿真和一些情况下,则可以更方便地直接传递消息到其它模块而不用在NED文件中建立连接。这可以由sendDirect(cMessage*msg,doubledelay,cModule*targetModule,constchar*inGateName)方法来完成。Self-me

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功