我是靠谱客的博主 真实大树,这篇文章主要介绍OMNet++学习笔记2,现在分享给大家,希望可以做个参考。

  1. OMNet++ 模型
    由模块组成,模块之间通过消息传递方式进行通信。模块结构通过NED语言描述。
  • Messages 可以代表网络数据包、数据帧、排队网络中的客户
  • gates 模块输入输出接口
  • connection(link) 建模物理链路
  • channel 支持参数数据率(data rate)、误码率(bit error rate)、误包率(packet error rate)、传播时延(propagation delay)
    网络拓扑结构描述:NED
    参数数据类型:numeric,boolean,string,XML数据数
  1. 文件结构
  • 拓扑描述:.ned
  • 消息定义:.msg
  • 简单模块:.h/.cc
  1. 建模方法:
复制代码
1
2
(1)建立一个网络network
复制代码
1
2
(2)定义一个网络
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
network Network{ submodules: node1:Node; node2:Node; node3:Node; ... #在网络的子模块中可参数赋值位置 host[100]:Host{ ping.timeToLive=default(3); ping.destAddress=default(0); } connections: node1.port++<-->{datarate=100Mbps;}<-->node2.port++; node2.port++<-->{datarate=50Mbps;}<-->node3.port++; ... }
复制代码
1
2
(3)定义信道channel
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
network Network{ types: channel c extends ned.DatarateChannel{ datarate=100Mbps; ber=1e-10; double distance @unit(m); delay=this.distance/100000km*1s; double cost = default(1); } submodules: node1:Node; node2:Node; node3:Node; ... connections" node1.port++<-->C<-->node2.port++; ... } #信道中封装与连接有关的参数和行为,系统内置预定义信道有: ned.IdealChannel:无参数 ned.DelayChannel:delay,disabled ned.DatarateChannel:datarate,ber,per# #通过子类化来添加参数和属性,也可以修改固有属性,单位可以使用@unit属性来指定#
复制代码
1
2
(4)建立App、Routing、Queue等模块(流量生成器、路由、队列包等)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
simple App{ parameters: int destAddress; @display("i=block/browser"); string protocol; volatile double sendInterval @unit(s)=default(exponential(1s); volatile int packetLength @unit(byte)=default(100B); volatile int timeToLive = default(32); gate: input in; output out; } simple Routing{ ... } simple Queue{ ... } #模块名需要以大写开头,以@开头的单词成为属性# #参数赋值的三种方法:从NED文件或者配置文件omnetpp.ini中读取值,从用户交互赋值# #NED赋值的几个位置:在继承子类中,NED类型实例化的子模块和连接定义中,包含子模块或者连接的网络和复合模块中。#
复制代码
1
2
(5)建立节点复合模块
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module Node{ types: ... parameters: int address; @display("i=imsc/node_vs,gold"); gates: inout port[]; submodules: #在复合模块中的子模块中可赋值位置 app:App; routing:Routing; queue[sizeof(port)]:Queue; connections: routing.localOut-->app.in; routing.localIn-->aoo.out; for i=0,,sizeof(port)-1{ routing.out[i]-->queue[i].in; routing.in[i]<--queue[i].out; queue[i].line<-->port[i]; } }
复制代码
1
2
(6)所有对象组合在一起
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module WirelessHostBase{ gates: inout radioIn; 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; }
  1. 解释组件含义
    – #gates门# –
    gates是模块的连接点,有三种类型(input,output,inout);
    NED要求所有门都有连接,为了放松这一条件,可以使用@loose来注解
    – #submodule子模块# –
    复合模块包含的模块,称为子模块;
    子模块有类型、有名字,可以静态指定,也可以通过字符串表达式来指定(这种特性称为参数化子模块类型);
    NED支持子模块数组、条件子模块(if关键字和条件放在子模块类型的后面)。子模块数组的大小必须明确;
    复合模块子类化:添加子模块
    – #connections连接# –
    在复合模块中的connections节中定义;
    连接不可以跨层级:2个子模块的门可以连接,子模块门和父模块的内部门可以连接;
    inputoutput门使用箭头连接;
    inout使用双箭头连接<–>;
    两个门连接如果有信道,使用2个箭头,并将信道放在箭头之间,@display属性也相同;
    inout门是input和output两个门胶合在一起,如果需要的时候,可以分开,分别为port$i和port$o;
    门的引用形式:modulespec.gatespec;
    gatename++表示使用第一个没有连接的门连接;
  2. 事件和事件的执行顺序
  • 事件:使用消息
  • 表示事件:使用cMessage类或者其子类代表
  • 消息从一个模块发到另一个模块,事件按照到达时间的顺序从FES中取
  • 消息目的模块:消息发生地
  • 消息到达时间:消息发生的时间
  • 超时失效的实现:模块发送消息给自己
  • 两个消息规则:如果到达时间相同,早到达早执行;如果优先级相同,更小调度优先级值的先执行;调度的或者早发送的先执行。
  • 调用顺序:最初的事件(starter messages)放入FES–> 所有模块的initialize函数–>进入事件循环–>第一个事件被处理–>第二个事件被处理–>…—>结束时间循环—>所有模块的finish函数;复合模块的initialize–>子模块的initialize;子模块finish–>复合模块finish;如果仿真器因为运行时错误而终止,finish函数不会被调用。
复制代码
1
2
3
4
5
6
7
8
//仿真运行开始: 1. 构建网络(系统module和它的submodule) 2. 插入starter message给所有的submodule(使用activity()函数) 3. 调用系统module callInitialize() 4. 进入时间循环中(在之前定义的) 5. 如果循环正常结束,不出现error:调用 callFinish() 6. clean up
复制代码
1
2
3
4
5
6
7
8
9
callInitialize(){ 调用之前用户定义的initialize()函数 if(module是复合的){ for(each submodule){ 调用子模块的callInitialize() } } }
复制代码
1
2
3
4
5
6
7
8
9
callFinish(){ if(module是复合的){ for(each submodule){ 调用子模块的callFinish() } } 调用用户定义的finish()函数 }
  1. 仿真时间
    当前的仿真时间:simTime()
    仿真时间:simtime_t(c++类型)

最后

以上就是真实大树最近收集整理的关于OMNet++学习笔记2的全部内容,更多相关OMNet++学习笔记2内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(96)

评论列表共有 0 条评论

立即
投稿
返回
顶部