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++学习资源太少,个人翻译不易。您的每一分钱都会给后来的开发者提供帮助!感谢支持。