OmNeT++手册带有列表的标题和内容版式•在此处添加第一个要点•在此处添加第二个要点•在此处添加第三个要点什么是OMNeT++??•OMNeT++是面向对象的模块化离散事件网络仿真框架。•不是:不是仿真器•是:一个写仿真模型的基础架构和工具,提供组件和模块,像LEGO积木块一样OMNeT++应用领域•有通用架构,应用各种领域:•有线和无线通信网络的建模•协议建模•排队网建模•多处理器和其他分布式硬件系统的建模•硬件架构的验证•复杂软件系统各方面性能评价•采用离散事件方法的任何系统•通过交换消息映射为实体通信的任何系统OMNeT++模型•OMNeT++模型是由模块组成的,模块之间通过消息传递方式进行通信。•OMNeT++的整个模型称为network•模型结构通过NED语言描述•Messages代表网络中的帧或者包、排队网络中的工作或者客户•Gates是模块的输入输出接口•Connection(link)用于对物理链路建模,•channel具有参数:数据率(datarate)、传播延时(propagationdelay)、误码率(biterrorrate)、误包率(packeterrorrate),connection支持这些参数•Module也有参数,在NED文件中指定,或者在配置文件omnetpp.ini中指定OMNeT++模型•参数的类型:string、numeric、boolean、XML数据树•网络模型拓扑结构使用NED语言描述算法编程•模型模块中包含算法;•仿真对象由C++类描述•OMNeT++模型包含如下几个部分:(1)NED语言拓扑描述,.ned文件;(2)消息定义,.msg文件;(3)简单模块源代码,.h/.cc文件。•仿真系统包含的组建:•(1)仿真内核:管理仿真和仿真类库•(2)用户接口:用于仿真执行,用于调试、显示、批处理仿真执行NED语言•NED代表网络描述,是用户描述仿真结构的语言。•OMNeT++中,NED可以声明简单模块、连接以及它们组合的复合模块等等。•NED语言的特征:继承性、基于组件、接口、层级、包结构、内部类型、元数据注解(属性)•NED语言有树形代表的等价形式,可以序列化为XMLNED语言表示真实的通信网•通信网描述:包含很多节点;每个节点有一个运行的应用程序,应用程序随机发送数据包;节点也是路由;假设应用程序时数据包基础的通信,所以传输层细节可以不用考虑。•建模方法:•首先,建立一个network;•然后,定义一个网络•引入信道Channel•建立App、Rounting、Queue等模块•建立节点复合模块•所有对象组合在一起定义一个网络•networkNetwork•{•submodules:•node1:Node;•node2:Node;•node3:Node;•...•connections•node1.port++--{datarate=100Mbps;}--node2.port++;•node2.port++--{datarate=100Mbps;}--node4.port++;•node4.port++--{datarate=100Mbps;}--node6.port++;•...•}•Network的类型是network,node1、node2...的类型为Node,Node在下面定义。然后定义节点之间的连接,连接点称为gate,port++的意思是将一个gate加入到port[]中,{datarate=100Mbps;}代表数据率为100Mbps定义信道•每个连接重复写数据率是很麻烦的,所以,创建一个新的信道类型封装数据率设置•networkNetwork•{•types:•channelcextendsned.DatarateChannel{•datarate=100Mbps;•}•submodules:•node1:Node;•node2:Node;•node3:Node;•...•connections:•node1.port++--C--node2.port++•...•}简单模块定义•定义流量生成器、路由、队列包等类型•simpleApp•{•parameters:•intdestAddress;•...•@display(“i=block/browser”);•gates:•inputin;•outputout;•}•simpleRouting{...}•simpleQueue{...}•模块App、Routing、Queue名以大写开头•以@开头的单词称为“属性”定义Node复合模块•将App、Routing和Queue组成Node模块•moduleNode•{•parameters:•intaddress;•@display(“i=misc/node_vs,gold”);•gates:•inoutport[];•submodules:•app:App;•routing:Routing;•queue[sizeof(port)]:Queue;•connections:•routing.localOut--app.in;•routing.localIn--app.out;•fori=0..sizeof(port)-1{•routing.out[i]--queue[i].in;•routing.in[i]--queue[i].out;•queue[i].line--port[i];•}•}简单模块的定义•使用simple关键字复合模块的定义•复合模块将其他模块组成一个单元•moduleHost•{•types:•..•parameters:•..•gates:•...•submodules:•..•connections:•..•}组装复合模块的例子•moduleWirelessHostBase•{•gates:•inputradioIn;•submodules:•tcp:TCP;•ip:IP;•wlan:Ieee80211;•connections:•tcp.ipOut--ip.tcpIn;•tcp.ipIn--ip.tcpOut;•ip.nicOut++--wlan.ipIn;•ip.nicIn++--wlan.ipOut;•wlan.radioIn--radioIn;•}ip:IPnicOutnicIntcpIntcpOuttcp:TCPipOutipInwlan:ieee80211ipInipOutRadioInWirelessHostBaseRadioIn组装复合模块的例子•moduleWirelessHostextendsWirelessHostBase•{•submodules:•webAgent:WebAgent;•connections:•webAgent.tcpOut--tcp.appIn++;•webAgent.tcpIn--tcp.appOut++;•}webAgent:WebAgenttcpOuttcpInWirelessHosttcpAppIntcpAppOut组装复合模块的例子•moduleDesktopHostextendsWirelessHost•{•gates:•inoutethg;•submodules:•eth:EthernetNic;•connections:•ip.nicOut++--eth.ipIn;•ip.nicIn++--eth.ipOut;•eth.phy--ethg;•}信道channels•信道封装与连接有关的参数和行为•信道后边有C++类定义•默认的类名是NED中的类型名;如果有@class和@namespace属性,默认的类名可以不是NED中的类型名•系统内置预定义的信道:ned.IdealChannel,ned.DelayChannel,ned.DatarateChannel。如果引入ned包importned.*,则不需要写前面的ned.。•IdealChannel没有任何参数•DelayChannel有2个参数:delay、disabled•DatarateChannel的参数datarate、ber、per创建一个新的信道•channelEthernet100extendsned.DatarateChannel•{•datarate=100Mbps;•delay=100us;•ber=1e-10;•}•通过子类化来添加参数和属性,也可以修改已有的属性•channelDatarateChannel2extendsned.DatarateChannel•{•doubledistance@unit(m);•delay=this.distance/200000km*1s;•}•添加cost属性•channelBackboneextendsned.DatarateChannel•{•@backbone;•doublecost=default(1);•}参数•参数是模块的变量,用于构建拓扑结构,作为C++代码的输入•参数的类型有:doubel,int,bool,string,xml。也可以声明为volatile•单位可以使用@unit属性来指定•参数可以从NED文件或者配置文件omnetpp.ini中读取值参数•simpleApp•{•parameters:•stringprotocol;//protocoltouse:UDP/IP/ICMP/...•intdestAddress;//destinationaddress•volatiledoublesendInterval@unit(s)=default(exponential(1s));//timebetweengeneratingpackets•volatileintpacketLength@unit(byte)=default(100B);//lengthofonepacket•volatileinttimeToLive=default(32);//maximumnumberofnetworkhopstosurvive•gates:•inputin;•outputout;•}•上面的模块有5个参数,其中三个有默认值,参数赋值•参数赋值有几个途径:从NED代码赋值、从配置文件omnetpp.ini、从用户交互赋值•NED赋值的几个位置:在继承的子类中、NED类型实例化的子模块和连接定义中、包含子模块或者连接的网络和复合模块中。•(1)继承的子类中•simplePingAppextendsApp•{•parameters:•protocol=ICMP/ECHO•sendInterval=default(1s);•packetLength=default(64byte);•}参数赋值•(2)在复合模块中的子模块中•moduleHost•{•submodules:•ping:PingApp{•packetLength=128B;//alwayspingwith128-bytepackets•}•...•}•(3)在网络的子模块中•networkNetwork•{•submodules:•host[100]:Host{•ping.timeToLive=default(3);•ping.destAddress=default(0);•}•...•}参数赋值•(4)在网络或复合模块的参数快中•networkNetwork•{•parameters:•host[*].ping.timeToLive=default(3);•host[0..49].ping.destAddress=default(50);•host[50..].ping.destAddress=default(0);•submodules:•host[100]:Host;•...•}•*-任何索引下标•..是索引下标范围•*.、{0..49}.称为模式赋值或者深度赋值•**.用于匹配多路元素networkNetwork