OMnet++ 初学者教程 第一节 入门

第1部分-入门

1.1模型

首先,让咱们从一个包含两个节点的“network”开始。节点将作一些简单的事情:一个是节点将建立一个数据包,而两个节点将继续来回传递相同的数据包。咱们将节点称为tictoc。稍后,咱们将逐步改进此模型,并在每一个步骤中引入OMNeT ++功能。
这是您从头开始实施首次仿真所采起的步骤。html

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 ++安装目录中找到该手册。)ide

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()"
咱们从从新定义两种方法cSimpleModuleinitialize()handleMessage()。它们是从仿真内核调用的:initialize()仅调用一次,handleMessage()在消息到达模块时调用。
在其中,initialize()咱们建立一个消息对象(cMessage),而后将其从outgate发送出去。因为此门链接到另外一个模块的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文件。
如今,咱们已经完成了建立第一个模型的准备,并能够编译和运行它了。url

Omnet++学习资源太少,我的翻译不易。您的每一分钱都会给后来的开发者提供帮助!感谢支持。spa

相关文章
相关标签/搜索