omnet
具体实现官方有很多, 主要是一些概念比较不太好懂
1 网络仿真软件综述
01 wsn仿真软件
看博客: wsn simulator
02 为什么使用omnet
- 简单易用
- 提供强大的GUI
- 有支持团队不断在更新维护
03 学习资料
omnet++:https://omnetpp.org/documentation/
C++: CPrimer 中文版
04 目标
- 讲omnet的基本使用
- 使用ned进行仿真网络结构的定义
- omnet中模块的概念
- 从头带大家实现一个有线的tictoc 和 一个无线的tictoc
2 omnet介绍
1 omnet安装与启动
- 安装必须进行的步骤
- 下载OMNeT : 下载地址
- 将存档解压缩到新文件夹中。
- 打开mingw.cmd 键入./configure和后make (这步可能要30分钟左右)
- 将path/to/OMNeT/build添加path/to/OMNeT/build目录到PATH环境变量中。
- 输入omnetpp确保安装正常。预计OMNeT ++开发环境将启动。
注: (原则上不需要下载任何东西, 都是包括在安装包中的, 包括Qt环境,编译器mingw等)
有关更多安装说明, 请访问omnet installGuide。
- 安装完成后, 打开
mingwenv.cmd
, 输出omnetpp, 即可打开omnetIDE
- 选择工作目录, 打开后界面如下所示
2 使用omnet仿真的一般步骤
主要有三步:
- 使用ned(network description)定义网络拓扑结构
- 利用C++编写实现网络的各种行为
- 编写配置文件指定网络参数, 利用配置文件启动项目
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++中的类,在定义网络的行为时, 我们需要用到他的属性,参数等等
- 在omnet中, 网络中的所有东西(如一个节点, 服务器等)都以module形式定义
- 最低层的模块称为
简单模块(simple Module)
- 模块可以添加到
复合模块(compound module)
中 - 模块之间可以相互嵌套, 嵌套的层级没有限制
- 模块之间可以定义继承关系
一个节点, 很多个节点, 一块网络, 都可以是一个模块
network本质上就是一个复合模块
02-Module Type的定义步骤
一个模块的定义分为3个步骤
- 在ned文件中定义
- 使用C++继承omnet的
cModule类
或cSimpleModule
类, 定义一个Module类 - 将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 ~