文章目录

  • omnet
    • 1 网络仿真软件综述
      • 01 wsn仿真软件
      • 02 为什么使用omnet
      • 03 学习资料
      • 04 目标
    • 2 omnet介绍
      • 1 omnet安装与启动
      • 2 使用omnet仿真的一般步骤
      • 3 新建项目
    • 3 定义仿真网络的拓扑结构
      • 01 新建一个空的 network
      • 02 Module的概念
        • 01-Module的概念
        • 02-Module Type的定义步骤
          • 1. ned文件中定义
          • 2. C++文件定义
          • 3. 将C++文件与ned文件联系起来
        • 03-元数据注释 (属性)
        • 04-Channel(信道)
        • 05-配置文件
      • 03 几个例子
        • 01 AHOLA
        • 02 tictoc
        • 03 SimpleNode 和 Sink
    • 4 控制网络仿真时的行为
      • 01 omnet仿真原理
        • 01-离散事件模拟
        • 02-omnet事件循环
      • 02 网络的初始化和结束原理
        • 01-模块的初始化
        • 02-模块的多阶段初始化
        • 03-模块的结束
      • 03 消息的发送与接收
        • 1. 默认的消息cMessage类
        • 1. sendXXX(-)
        • 2. handleMessage(Msg *)
        • 3. ScheduelAt() 自消息的发送
    • 例子阅读
      • 官方 19 个 tictoc
    • 仿真主要参考的资料
    • 5 状态的定义(如果有时间的话)
      • 01 睡眠实现

omnet

具体实现官方有很多, 主要是一些概念比较不太好懂

1 网络仿真软件综述

01 wsn仿真软件

看博客: wsn simulator

02 为什么使用omnet

  1. 简单易用
  2. 提供强大的GUI
  3. 有支持团队不断在更新维护

03 学习资料

omnet++:https://omnetpp.org/documentation/
C++: CPrimer 中文版

04 目标

  1. 讲omnet的基本使用

    1. 使用ned进行仿真网络结构的定义
    2. omnet中模块的概念
  2. 从头带大家实现一个有线的tictoc 和 一个无线的tictoc

2 omnet介绍

1 omnet安装与启动

  1. 安装必须进行的步骤

    1. 下载OMNeT : 下载地址
    2. 将存档解压缩到新文件夹中。
    3. 打开mingw.cmd 键入./configure和后make (这步可能要30分钟左右)
    4. 将path/to/OMNeT/build添加path/to/OMNeT/build目录到PATH环境变量中。
    5. 输入omnetpp确保安装正常。预计OMNeT ++开发环境将启动。

注: (原则上不需要下载任何东西, 都是包括在安装包中的, 包括Qt环境,编译器mingw等)
有关更多安装说明, 请访问omnet installGuide。

  1. 安装完成后, 打开mingwenv.cmd, 输出omnetpp, 即可打开omnetIDE
  2. 选择工作目录, 打开后界面如下所示

2 使用omnet仿真的一般步骤

使用omnet仿真

主要有三步:

  1. 使用ned(network description)定义网络拓扑结构
  2. 利用C++编写实现网络的各种行为
  3. 编写配置文件指定网络参数, 利用配置文件启动项目

3 新建项目

File->New-Project->Omnet++Project 来新建项目, 项目新建后, 我们可以看到src, simulation文件夹

  • simulation: 存放项目配置文件

    我们在配置文件中指定想模拟的网络, 网络中节点的位置等

  • src: 存放所有源代码, 包括ned文件, C++源文件等

关于所有文件夹的作用看: https://doc.omnetpp.org/omnetpp/manual/#cha:ned-lang

3 定义仿真网络的拓扑结构

使用omnet进行仿真, 我们首先需要去定义网络的拓扑结构

01 新建一个空的 network

src目录下, 我们新建一个network , 选择one item , 此时我们就有了一个网络,当然现在里面什么也没有, 点击Design标签, 可以以GUI的形式查看ned文件当前的内容

02 Module的概念

01-Module的概念

逻辑上, omnet++中的module就相当于C++中的类,并且在模块中可以定义属性,我们用module实例化出来的模块对象, 又可以放到其他的模块中

代码上, omnet++中的module最终就是一个C++中的类,在定义网络的行为时, 我们需要用到他的属性,参数等等

  1. 在omnet中, 网络中的所有东西(如一个节点, 服务器等)都以module形式定义
  • 最低层的模块称为 简单模块(simple Module)
  • 模块可以添加到复合模块(compound module)
  • 模块之间可以相互嵌套, 嵌套的层级没有限制
  • 模块之间可以定义继承关系

一个节点, 很多个节点, 一块网络, 都可以是一个模块
network本质上就是一个复合模块

02-Module Type的定义步骤

一个模块的定义分为3个步骤

  1. 在ned文件中定义
  2. 使用C++继承omnet的cModule类cSimpleModule类, 定义一个Module类
  3. 将ned文件中定义的Module与C++中定义的Module联系起来
1. ned文件中定义

定义一个复合模块的一般语法如下, 所有的sections都为可选的

module Host
{types:  //定义模块类型(在submodules中使用),信道类型(在connections中使用)等...parameters:  //定义该模块的参数, 如传输速率,节点个数等...gates:   // 定义该模块的输入和输出口及个数...submodules: // 定义子模块实例...connections: // 定义子模块间的链接方式...
}

定义一个简单模块的语法如下:

simple Host
{...parameters:  //定义该模块的参数, 如传输速率等...gates:   // 定义该模块的输入和输出口及个数...}
2. C++文件定义

对于简单模块我们继承cSimpleModule
对于复合模块我们继承cModule类, 来定义一个C++ Module类

#include <omnetpp/csimplemodule.h>class ExampleModule: public omnetpp::cSimpleModule {public:ExampleModule();virtual ~ExampleModule();
};Define_Module(ExampleModule);
3. 将C++文件与ned文件联系起来

在类定义的后面, 添加Define_Module(模块名);, 将模块与指定的C++类联系起来

#include <omnetpp/csimplemodule.h>class ExampleModule: public omnetpp::cSimpleModule {
public:ExampleModule();virtual ~ExampleModule();
};Define_Module(ExampleModule);

03-元数据注释 (属性)

NED properties are metadata annotations that can be added to modules, parameters, gates, connections, NED files, packages, and virtually anything in NED. @display, @class, @namespace, @unit, @prompt, @loose, @directIn are all properties that have been mentioned in previous sections, but those examples only scratch the surface of what properties are used for.

Using properties, one can attach extra information to NED elements. Some properties are interpreted by NED, by the simulation kernel; other properties may be read and used from within the simulation model, or provide hints for NED editing tools.

Properties are attached to the type, so one cannot have different properties defined per-instance. All instances of modules, connections, parameters, etc. created from any particular location in the NED files have identical properties.

下面是一个使用元数据注解的例子

@namespace(foo);  // file propertymodule Example
{parameters:@node;   // module property@display("i=device/pc");   // module propertyint a @unit(s) = default(1); // parameter propertygates:output out @loose @labels(pk);  // gate propertiessubmodules:src: Source {parameters:@display("p=150,100");  // submodule propertycount @prompt("Enter count:"); // adding a property to a parametergates:out[] @loose;  // adding a property to a gate}...connections:src.out++ --> { @display("ls=green,2"); } --> sink1.in; // connection prop.src.out++ --> Channel { @display("ls=green,2"); } --> sink2.in;
}

04-Channel(信道)

在ned文件中, 我们可以定义信道, 定义的一般语法如下

channel 信道名 extends 要继承的信道   // requires a CustomChannel C++ class
{...信道属性...
}

大多数情况下我们不用去定义信道, omnet++自带了三个信道ned.IdealChannel, ned.DelayChannelned.DatarateChannel
详细请看:https://doc.omnetpp.org/omnetpp/manual/#sec:ned-lang:channels

我们也可以直接在connections中直接写出信道的属性, 省去了定义信道的步骤
在定义不同

05-配置文件

定义在parameters 中的属性, 在配置文件.ini中指定

03 几个例子

omnet++根目录的sample目录下官方提供了许多例子供我们参考, 这里挑选几个较为典型的例子

01 AHOLA

02 tictoc

03 SimpleNode 和 Sink

我们先来看一个模块, 这是我做RIMAC时定义的一个节点, SimpleNode

//Simple Node 模块
//定义普通节点拥有的参数
package RIMAC.simplenode;simple SimpleNode
{parameters:double x @unit(m);  double y @unit(m);double txRange @unit(m);    //数据传输距离double senRange @unit(m);   //数据感知距离 double Twait @unit(s);    //事件等待时间
//      double bitRate; //传输速率double animationHoldTimeOnCollision @unit(s);  //碰撞时动画持续时间volatile double frameTime = uniform(0.5s, 1.5s) @unit(s); //一帧的时间double sleepTime @unit(s);  //睡眠时间double sendConsumption   @unit(W);   //发送能耗double recvConsumption  @unit(W);  //接受能耗double sleepConsumption  @unit(W);  //睡眠能耗double idleConsumption   @unit(W);  //空闲能耗double energy @unit(J);  //初始能量int packetSize @unit(B);@display("p=$x,$y");@class(RIMAC::simpleNode);@signal[energyLeft](type="double");@statistic[energyLeftStat](title="energyLeft"; source="energyLeft"; record=vector,stats);gates:input in @directIn;
}

Sink定义

package RIMAC;
import RIMAC.simplenode.SimpleNode;
simple Sink extends SimpleNode
{parameters:@class(RIMAC::Sink);@display("p=$x,$y;i=device/terminal;r=$txRange");@signal[e2etd](type="double");@statistic[e2etdStat](title="e2etd"; source="e2etd"; record=vector,stats);@signal[ae2etd](type="double");@statistic[ae2etdStat](title="ae2etd"; source="ae2etd"; record=vector,stats);}

4 控制网络仿真时的行为

01 omnet仿真原理

01-离散事件模拟

  1. 离散事件系统(Discrete Event System)是指事件发生在时间线中离散的部分, 对于计算机网络而言正像是如此

  2. 离散事件模拟系统通过在称为FES (Future Event Set) or FEL (Future Event List) 的 数据结构中保存未来事件的集合来实现

  3. omnet++底层使用了 二叉堆实现的优先级队列事件循环(Eventloop) 来实现了这一套模拟机制

02-omnet事件循环

启动仿真后, 事件执行的伪代码如下

初始化(initialize) -- 包括构建模型,添加初始化事件到FES中while (FES不为空 && 仿真未结束)
{从FES中取出事件t := 该事件发生时间执行事件(事件执行过程中,可能往FES中添加事件, 也可能往FES中删除事件)
}
结束仿真 (写入统计数据, etc.)

02 网络的初始化和结束原理

omnet网络的整个过程如下

perform simulation run:build network(i.e. the system module and its submodules recursively)insert starter messages for all submodules using activity()do callInitialize() on system moduleenter event loop // (described earlier)if (event loop terminated normally) // i.e. no errorsdo callFinish() on system moduleclean up

callInitialize和callFinish的伪代码如下


callInitialize()
{call to user-defined initialize() functionif (module is compound)for (each submodule)do callInitialize() on submodule
}callFinish()
{if (module is compound)for (each submodule)do callFinish() on submodulecall to user-defined finish() function
}

01-模块的初始化

从上面的执行过程可知, 模块是有初始化事件的, 我们通过父类cSimpleModuleinitialize()方法来进行初始化,

1.window–>
2.preferrence–>
3.general–>
4.keys–>
来添加重载快捷键

模块调试:
EV<<“initialize!!!”<<"("<<x<<","<<y<<")"<<endl;

02-模块的多阶段初始化

可以重写两个方法来进行多阶段的初始化,在numInitStages 中返回阶段的个数
一般来说,我们在第一个初始化阶段进行变量赋值等操作, 后面的阶段可以进行周期计算等

virtual void initialize(int stage);
virtual int numInitStages() const;

03-模块的结束

模块通过调用finish()来进行仿真结束的工作

03 消息的发送与接收

消息的发送由 sendXXX 系列函数完成, 消息的接收基本都由handleMessage完成

1. 默认的消息cMessage类

cMessage类是所有消息类的父类, 我们可以自定义一个消息类(当然必须继承cMessage类), 也可以直接使用这个类

  1. 构造函数:

    1.  cMessage (const char *name=nullptr, short kind=0)
      

cMessage API reference

1. sendXXX(-)

Message sending.
virtual void send (cMessage *msg, int gateid)
virtual void send (cMessage *msg, const char *gatename, int gateindex=-1)
virtual void send (cMessage *msg, cGate *outputgate)
virtual void sendDelayed (cMessage *msg, simtime_t delay, int gateid)
virtual void sendDelayed (cMessage *msg, simtime_t delay, const char *gatename, int gateindex=-1)
virtual void sendDelayed (cMessage *msg, simtime_t delay, cGate *outputgate)
virtual void sendDirect (cMessage *msg, cModule *mod, const char *inputGateName, int gateIndex=-1)
virtual void sendDirect (cMessage *msg, cModule *mod, int inputGateId)
virtual void sendDirect (cMessage *msg, cGate *inputGate)
virtual void sendDirect (cMessage *msg, simtime_t propagationDelay, simtime_t duration, cModule *mod, const char *inputGateName, int gateIndex=-1)
virtual void sendDirect (cMessage *msg, simtime_t propagationDelay, simtime_t duration, cModule *mod, int inputGateId)
virtual void sendDirect (cMessage *msg, simtime_t propagationDelay, simtime_t duration, cGate *inputGate)

2. handleMessage(Msg *)

handleMessage()

3. ScheduelAt() 自消息的发送

scheduelAt()

例子阅读

官方 19 个 tictoc

仿真主要参考的资料

  1. 我们不知道一个函数的作用的时候, 绝大多数情况下, 都是去查cSimpleModulle
    cSimpleModule

  2. 其次会去 SimulationManual 中查, 里面会有一些实际应用的例子

5 状态的定义(如果有时间的话)

01 睡眠实现

omnet++ 快速入门 | 计算机网络仿真 | omnet++ 入门教程相关推荐

  1. sumo的简单应用_sumo快速运行简单仿真实例详细教程

    本文旨在让大家快速的了解sumo,并给出运行一个简单的sumo的例子的教程,进而了解基本sumo工程的架构,使大家对该软件产生兴趣并持续学习下去,刚开始学习仿真的确枯燥,项目"跑起来&quo ...

  2. sumo快速运行简单仿真实例详细教程

    本文旨在让大家快速的了解sumo,并给出运行一个简单的sumo的例子的教程,进而了解基本sumo工程的架构,使大家对该软件产生兴趣并持续学习下去,刚开始学习仿真的确枯燥,项目"跑起来&quo ...

  3. TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅

    TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅读 ...

  4. simulink仿真及代码生成技术入门到精通_Simulink仿真零基础入门到精通实用教学教程 自学全套...

    Simulink仿真零基础入门到精通实用教学教程 自学全套,以教程文字为主,毕业论文和报告均可以借鉴. Simulink是电气工程必学的模型仿真专业工具软件,非常的实用.小编在全网中搜索都没有找到非常 ...

  5. 第1讲 快速入门 《Kotlin 极简教程 》

    第1讲 快速入门 <Kotlin 极简教程 > 投影片01.jpg 投影片02.jpg 投影片03.jpg 投影片04.jpg 投影片05.jpg 投影片06.jpg 投影片07.jpg ...

  6. JSP WEB开发入门基础到高手进阶教程002

    JSP WEB开发入门基础到高手进阶教程 -------开发入门 JSP与微软的Active Server Pages 兼容,但它是使用类似HTML的卷标以及Java程序代码段而不是VBScript. ...

  7. ROS入门(八)——仿真机器人四(Gazebo+Rviz+雷达、摄像头、kinet仿真显示)

    所用的学习链接: [奥特学园]ROS机器人入门课程<ROS理论与实践>零基础教程P278-288 [以上视频笔记见http://www.autolabor.com.cn/book/ROST ...

  8. WordPress从入门到精通建站教程

    wordpress作为一款经典的博客,被很多做seo的人士使用.尤其是近期很多卖产品的人,利用wordpress优化产品单页,是自己的关键词排名提升到很好的高度,实现自己的利润最大化.当然也有人用wo ...

  9. Electron 快速开始(一)-入门基础、使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序

    文章目录 Electron 快速开始(一)-入门基础.使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序 Electron简介 多进程模型​ Electron 快速开始 管理窗 ...

最新文章

  1. TCP Cluster for mqtt 技术实施方案
  2. Google Maps Android API v2官网例子使用说明
  3. Adaboost from Baidu
  4. linux用户ftp失败,vsftpd本地用户登录密码错误的解决方法
  5. boost::fusion::replace_if用法的测试程序
  6. is 与 as 数据类型的操作 0108
  7. 基于 Android 6.0 的 小米 MIUI 8 已开源
  8. 大数据之-Hadoop伪分布式_启动YARN并运行MR程序---大数据之hadoop工作笔记0026
  9. 热流体动压润滑matlab_仿真加快摩擦润滑研究进程
  10. 中科大图形学暑期课程资料
  11. python视频教程推荐it教程网_Python系列视频教程集合【共119套】
  12. Android程序员学WEB前端(12)-JavaScript(3)-正则表达式-Sublime
  13. 众包专访:快得难以想象!开源中国众包解决了团队开发的燃眉之急
  14. uc浏览器linux系统下载文件夹,UC浏览器开发者工具Linux版
  15. USB CCID理解
  16. c++生成随机数详解(包含可执行代码)
  17. 色彩敏感度测试 l 据说只有1%的设计师能全对,不服来战!
  18. 三星s10更新Android10,经历了三星s10的最近一次升级,我对安卓对三星有了新的认知...
  19. 揭开自然拼读法(Phonics)的神秘面纱
  20. Android性能调优:App启动速度优化

热门文章

  1. 客运公司运输管理系统(简易版)
  2. Abaqus流固耦合仿真方法
  3. 你对未来计算机的展望,从计算机的进化引发对未来的展望
  4. Xml外部实体注入漏洞(XXE)与防护
  5. 北大青鸟课程适合高中生学习吗?
  6. DR5白金版 (PS一键磨皮插件)支持mac/win版
  7. 2014年9月4日新GRE真题回忆
  8. jqweui引入的标签
  9. 我的.Subtext二次开发之路系列:兵马未动,粮草先行
  10. python打开mat文件