OMnet++ 初学者教程 第一节 入门
第1部分-入门
1.1模型
首先,让我们从一个包含两个节点的“network”开始。节点将做一些简单的事情:一个是节点将创建一个数据包,而两个节点将继续来回传递相同的数据包。我们将节点称为tic
和toc
。稍后,我们将逐步改进此模型,并在每个步骤中引入OMNeT ++功能。
这是您从头开始实施首次仿真所采取的步骤。
1.2设置项目
通过输入omnetpp
终端来启动OMNeT ++ IDE 。(我们假设您已经安装了有效的OMNeT ++。如果没有,请安装最新版本,并根据需要咨询_安装指南_。)进入IDE后,从菜单中选择“新建”->“ OMNeT ++项目”。
将出现一个向导对话框。输入tictoc
作为项目名称,在询问有关_项目_的初始内容时选择“_Empty _Project”,然后单击“完成”。你将在_Project Explorer中_看到一个空项目。(注意:某些OMNeT ++版本会package.ned
在项目中生成文件。我们现在不需要它:通过选择文件并单击Delete删除文件。)
该项目将保存属于我们模拟的所有文件。在我们的示例中,项目由一个目录组成。对于较大的模拟,通常将项目的内容分类到src/
和simulations/
文件夹中,并一般将其放在这两个子文件夹下。
Note 注意!
使用IDE完全是可选的。命令行也上可以使用OMNeT ++的几乎所有功能(某些图形密集型和交互式功能(如序列图浏览和结果绘图)除外)。可以使用任何文本编辑器来编辑模型源文件,并且OMNeT ++提供了用于特殊任务的命令行工具,例如生成文件,将消息文件转换为C ++,结果文件查询和数据导出等。要在没有IDE的情况下继续操作,只需创建一个目录,然后使用您喜欢的文本编辑器在其中创建以下NED,C ++和ini文件。
1.3添加NED文件¶
OMNeT ++使用NED文件来定义组件并将它们组装成更大的单元,例如网络。我们开始通过添加NED文件来实现我们的模型。要将文件添加到项目中,请在左侧的_项目资源管理器_面板中右键单击项目目录 ,然后 从菜单中选择_NEW->网络描述文件Network Description File(NED 网络描述文件)_。提示您输入文件名时输入tictoc1.ned
。
创建文件后,可以在OMNeT ++ IDE的“_编辑器”区域_中编辑该文件。OMNeT ++ IDE的NED编辑器有两种模式:“_Design”_和“Source”。您可以使用编辑器底部的标签在它们之间切换。在Design 模式下,可以使用鼠标和右侧的调色板以图形方式编辑拓扑。在_Source模式(源代码模式)_下,可以直接编辑NED源代码文本。在其中一种模式下所做的更改将立即反映在另一种模式下,因此您可以在编辑期间自由地在两种模式之间切换,并选择在更方便的任何一种模式下进行更改。(NED文件是纯文本文件,因此您甚至可以使用外部文本编辑器来编辑它们,尽管您会错过语法高亮显示,内容辅助,交叉引用和其他IDE功能。(那就不用外部编辑器呗!))
切换到“_Source”_模式,然后输入以下内容
simple Txc1
{// 定义一个简单模块
gates:
input in;
output out;
}
//
// Txc1的两个实例(tic和toc)双向连接
// Tic 和 toc 会互相发送信息
//
network Tictoc1
{//定义一个网络模块
submodules:
//网络模块由两个子模块组成吗,子模块的两个组成部分tic,toc
tic: Txc1;
toc: Txc1;
connections:
// 子模块之间的连接,但相箭头表示单向链接,{}中间定义连接的传输延时是100ms
tic.out --> { delay = 100ms; } --> toc.in;
tic.in <-- { delay = 100ms; } <-- toc.out;
}
完成后,切换回_Design_模式。您应该会看到类似以下内容的内容:
文件中的第一个块声明Txc1
为简单模块类型。简单模块在NED级别上是原子的(最小模块,不可被拆分了)。它们也是活动组件(意思是组成其他大模块的组件),其行为是用C++实现的。该声明还说 Txc1
有一个名为输入的门in
和一个名为的输出门out
。
第二个块声明Tictoc1
作为network(网络)。Tictoc1
是由两个子模块组装而成的,并且这两个子模块tic,``toc
都是Txc1
的实例, tic
的输出门(gate)连接到toc
的输入门(gate),反之亦然。两种方式都有100ms的传播延迟。
笔记
您可以在《OMNeT ++仿真手册》中找到有关NED语言的详细说明 。(也可以在doc
OMNeT ++安装目录中找到该手册。)
1.4添加C ++文件
现在,我们需要在C ++中实现Txc1简单模块的功能。txc1.cc
通过从项目的上下文菜单中选择“新建”->“源文件”(或从IDE主菜单中选择“_File”->“New”->“File ”)_来创建一个文件名(指定文件夹创建文件,注意填写后缀,不然默认创建.h文件),然后输入以下内容:
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;
/**
* 类Txc1继承cSimpleModule,在Tictoc1 网络结构中,tic和toc斗士Txc1类的实例,
* 他们在仿真程序开始运行的时候就会被创建
*/
class Txc1 : public cSimpleModule
{
protected:
// The following redefined virtual function holds the algorithm.
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
// The module class needs to be registered with OMNeT++
// 定义的类Txc1都需要在OMNET++注册后才可以被使用
Define_Module(Txc1);
void Txc1::initialize()
{
// 仿真开始最初运行的程序.
// 引导运行tic-toc-tic-toc进程,
// 其中一个模块需要发送第一条信息,我们让tic先发送。
// 首先判断是tic还是toc
if (strcmp("tic", getName()) == 0) {
// 在out门(gate) 发送第一条信息,我们在message对象中随意发了一个 "tictocMsg"
cMessage *msg = new cMessage("tictocMsg");
send(msg, "out");
}
}
void Txc1::handleMessage(cMessage *msg)
{
// handleMessage()函数:当信息传输到当前module时被唤醒
// 这这个module中的这个函数,我们仅仅从out gate 中发送msg。
// 因为tic和toc都做同样的事情,所以他们会来来回回的互发信息
send(msg, "out"); // 发送 message
}
的Txc
简单module,由C ++类表示Txc1
。的Txc1
类需要继承的OMNeT ++的cSimpleModule
类,并需要在OMNeT ++注册Define_Module()
宏。
笔记!
忘记Define_Module()
定义宏一个常见的错误。如果缺少该内容,则会收到与以下内容类似的错误消息:。"Error: Class 'Txc1' not found -- perhapsits code was not linked in, or the class wasn't registered with Register_Class(), or inthe case of modules and channels, with Define_Module()/Define_Channel()"
我们从重新定义两种方法cSimpleModule
:initialize()
和handleMessage()
。它们是从仿真内核调用的:initialize()
仅调用一次,handleMessage()
在消息到达模块时调用。
在其中,initialize()
我们创建一个消息对象(cMessage
),然后将其从out
gate发送出去。由于此门连接到另一个模块的in
门,因此在handleMessage()
分配给NED文件中的链接的传播延迟为100ms之后,仿真内核将在以下参数中将此消息传递给另一个模块。另一个模块只是将其发送回去(另一个100毫秒的延迟),因此它将导致来来回回的互相发送一样的信息。
Messages(数据包,帧,作业等)和events(计时器,超时)均由OMNeT ++中的cMessage对象(或其子类)表示。在发送或安排它们之后,它们将由仿真内核保存在“预定事件”或“未来事件”列表中,直到时间到了,并通过handleMessage()
传递给modules.
请注意,此模拟中没有内置停止条件:它将永远持续下去。你可以从从GUI手动停止它。(您也可以在配置文件中指定模拟时间限制或CPU时间限制,但在本教程中我们不这样做。)
1.5添加omnetpp.ini
为了能够运行仿真,我们需要创建一个omnetpp.ini
文件。 omnetpp.ini
告诉仿真程序您要仿真哪个网络(因为NED文件可能包含多个网络),您可以将参数传递给模型,为随机数生成器显式指定种子,等等。
omnetpp.ini
使用_File->New->Initialization file (INI)_ 菜单项创建文件。新文件将在_Inifile编辑器中_打开。作为NED编辑器,Inifile编辑器还具有两种模式,即_Form(表单模式)和_Source(代码模式),它们可以编辑相同的内容。前者更适合配置仿真内核,后者更适合输入模块参数。
现在,只需切换到“_Source”_模式并输入以下内容:
[General]
network = Tictoc1
您可以在“_Form”_模式下验证结果:
tictoc2
所有后续步骤将共享一个通用的omnetpp.ini文件。
现在,我们已经完成了创建第一个模型的准备,并可以编译和运行它了。
Omnet++学习资源太少,个人翻译不易。您的每一分钱都会给后来的开发者提供帮助!感谢支持。
OMnet++ 初学者教程 第一节 入门的更多相关文章
- Android精通教程-第一节Android入门简介
前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be ...
- 2014年度辛星html教程夏季版第一节
从今天起开始在博客园开启自己的html教程啦,先从第一节开始把,首先推荐一个网站,就是http:/www.w3cschool.cc,这是一个公开的教学网站,但是它有一个问题,那就是虽然很全面,但是不是 ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件
MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件 前言 万事开头难,有了<MapSer ...
- Ionic 入门与实战之第二章第一节:Ionic 环境搭建之开发环境配置
原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第一节,主要对 Ionic 的开发环境配置做了简要的介绍,本文介绍的开发环境为 Mac 系统,Windows 系统基本类似,少许 ...
- 《进击吧!Blazor!》系列入门教程 第一章 8.部署
<进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...
- 基本教程篇--第一节:InitialSampleDemo.cs介绍
第一节:InitialSampleDemo.cs介绍 为了讲解方便,我先附上源代码和效果图. 代码如下: using System; using System.Drawing; ...
- android内部培训视频_第一节
声明:本视频为公司内部做android培训时录制的,无任何商业目的.同时鉴于水平有限,可能不符合您的需求,放在这里的目的是提供给公司同事下载,作为培训的一个记录,也作为一个系列教程的自我督促完成的理由 ...
- Spring_MVC_教程_快速入门_深入分析
Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...
- 辛星跟您玩转vim第一节之vim的下载与三种模式
首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...
随机推荐
- HTML5 drag & drop & H5 DnD
HTML5 drag & drop H5 DnD https://html5demos.com/ demos https://html5demos.com/dnd-upload https:/ ...
- how to using js to realize notes feature on the website
how to using js to realize notes feature on the website js & notes demos https://medium.com/brow ...
- 移动端 CSS 1px 问题及解决方案
移动端 CSS 1px 问题及解决方案 viewport & transfrom: scale viewport 的 initial-scale 设为 1 UI 设计稿用rem 和 trans ...
- Top 10 JavaScript errors
Top 10 JavaScript errors javascript errors https://rollbar.com/blog/tags/top-errors https://rollbar. ...
- Flutter App 真机调试
Flutter App 真机调试 Deploy to iOS devices https://flutter.dev/docs/get-started/install/macos#deploy-to- ...
- eyes protect app
eyes protect app https://awaremac.com/
- echarts手机端,数据多时可以滚动
<div id="container" style="height: 400px"></div> <script type=&qu ...
- Python算法_盛最多水的容器(04)
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
- lombok插件@Slf4j注解不生效问题解决办法
最近在尝试使用日志工具Sfl4j,当时使用log时报错,找了好久才解决这个问题. 1.首先需要下载Lombok插件 File->settings->Plugins 搜索Lombok,点击安 ...
- 阻塞队列——四组API
方式 抛出异常 有返回值,不抛出异常 阻塞等待 超时等待 添加 add() offer() put() offer(...) 移除 remove() poll() take() poll(...) 检 ...