OMNet++学习笔记2
- OMNet++ 模型
由模块组成,模块之间通过消息传递方式进行通信。模块结构通过NED语言描述。
- Messages 可以代表网络数据包、数据帧、排队网络中的客户
- gates 模块输入输出接口
- connection(link) 建模物理链路
- channel 支持参数数据率(data rate)、误码率(bit error rate)、误包率(packet error rate)、传播时延(propagation delay)
网络拓扑结构描述:NED
参数数据类型:numeric,boolean,string,XML数据数
- 文件结构
- 拓扑描述:.ned
- 消息定义:.msg
- 简单模块:.h/.cc
- 建模方法:
(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;
}
- 解释组件含义
– #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++表示使用第一个没有连接的门连接; - 事件和事件的执行顺序
- 事件:使用消息
- 表示事件:使用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()函数
}
- 仿真时间
当前的仿真时间:simTime()
仿真时间:simtime_t(c++类型)
OMNet++学习笔记2相关推荐
- 2022-04-21 Omnet学习笔记(一)
Omnet学习笔记(一) 前言 1.本机为Inspiron 5005,为64位,所用操作系统为Windos 10.所使用软件为Omnet-5.2.1. 2.推荐Omnet入门教程系列 实验现象 在网络 ...
- OMNet++学习笔记1
主要应用领域 无线传感器网络(数据压缩.路由协议.能耗问题) 移动自组网(组网算法) OSI模型(eg. MAC,TCPIP等协议仿真) 网络通信协议 网络安全 光通信(光网络频谱分布) 水声通信 车 ...
- 无线传感器网络 与 OMNET++学习笔记(一)
无线传感器网络的仿真,研究人员设计开发了许多的仿真平台(或在现有平台建立无线传感器网络模型),包括NS-2, OPNET, SensorSim, EmStar, OMNet++, G1oMoSim, ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
- 知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...
最新文章
- Angular多个页面引入同一个组件报错The Component ‘MyComponentComponent‘ is declared by more than one NgModule怎么办?
- matlab doc函数,matlab常用函数.doc
- PowerPoint动画制作时的需要注意的N个事项
- Zend Framework数据库操作(1)
- 批量处理Excel文件的模块----xlwings
- ImportError: No module named Cython.Build
- P3317-[SDOI2014]重建【矩阵树定理,数学期望】
- 线程安全和线程不安全的简述及辅助记忆
- time和datatime模块
- 订阅发布系统得解耦与冗余
- jasper 常用知识点总结
- Qt4_子类化QTableWidget
- https://leetcode.com/problems/palindromic-substrings/description/
- bzoj3944 Sum
- python 写excel 保留空格_通过自动填充列中的空格来操作excel表的Python脚本
- AB-PLC之间通讯
- 聊聊傅里叶变换的意义和定义
- postgresql主从复制、主从切换
- 数据湖:数据同步工具NiFi
- Android app和系统应用实现截屏功能
热门文章
- (9)全民小视频引流脚本模块化开发03-发送私信By飞云脚本学院
- 华为Atlas200DK开发从零开始1.番外篇——Win10开发环境搭建,直连Atlas200DK开发板
- Linux下python如何解压rar文件,RAR解压文件
- C++ -- TranslateMessage函数
- 电脑开不开机怎么回事?
- angular 行内引入背景图片
- 关于广东省高考移民, 求助数据高手伸出援手
- JavaScript 将字符串转换为数字 – JS 字符串转 Int 示例
- html table专业样式,html 简单的table样式
- 城市规划行业的城市内部不透水地表空间信息提取与应用