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个子模块的门可以连接,子模块门和父模块的内部门可以连接;
    input\output门使用箭头连接;
    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++类型)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值