我是靠谱客的博主 真实大树,最近开发中收集的这篇文章主要介绍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)建立一个网络network
(2)定义一个网络
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++;
...
}
(3)定义信道channel
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属性来指定#
(4)建立App、Routing、Queue等模块(流量生成器、路由、队列包等)
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类型实例化的子模块和连接定义中,包含子模块或者连接的网络和复合模块中。#
(5)建立节点复合模块
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];
}
}
(6)所有对象组合在一起
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. 构建网络(系统module和它的submodule)
2. 插入starter message给所有的submodule(使用activity()函数)
3. 调用系统module callInitialize()
4. 进入时间循环中(在之前定义的)
5. 如果循环正常结束,不出现error:调用 callFinish()
6. clean up
callInitialize(){
调用之前用户定义的initialize()函数
if(module是复合的){
for(each submodule){
调用子模块的callInitialize()
}
}
}
callFinish(){
if(module是复合的){
for(each submodule){
调用子模块的callFinish()
}
}
调用用户定义的finish()函数
}
  1. 仿真时间
    当前的仿真时间:simTime()
    仿真时间:simtime_t(c++类型)

最后

以上就是真实大树为你收集整理的OMNet++学习笔记2的全部内容,希望文章能够帮你解决OMNet++学习笔记2所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部