从零开始学习OMNeT++系列第二弹——新建一个OMNeT++的工程

上一篇第一弹介绍了OMNeT++是什么以及如何安装OMNeT++,现在来说一下如何新建一个自己的OMNeT++的工程。

在 Omnet++安装完成后,samples/tictoc 中有该例子的完整文件,你可以立刻运行该文件看他是怎么工作的,不过更推荐按接下来的步骤一步步完成该项目的构建。

图片1

开始

模型介绍

创建一个有两个节点的网络,其中一个节点会创建一个数据包,两个节点会来回传递相同的数据包,这两个节点分别叫做 tic和toc ,接着我们会逐渐拓展这个模型,在这个过程中介绍Omnet++的特征。

构建项目

在omnetpp-6.0.3中新建一个文件夹来存储自己的工程。选择File---->New---->OMNeT++ Project…
然后选择路径到自己创建的新的文件夹

图片2
点击Next之后选择创建一个空项目

图片3

添加NED文件

选择右击Learn_1---->New---->Network Description File(NED)

图片4
然后为新建的NED文件命名,点击Next,然后选择Empty NED file

创建后,可以在 OMNeT++ IDE 的 “Editor”(编辑器)区域中编辑该文件。

OMNeT++ IDE 的 NED 编辑器有两种模式:Design 和 Source,在它们之间使用编辑器底部的选项卡可以进行切换。

  • 在“设计”模式下, 可以使用鼠标和右侧的调色板以图形方式编辑拓扑。
  • 在源模式下,NED源码可以直接编辑为文本。

在一种模式下完成的更改将立即反映在另一种模式中,因此您可以 在编辑过程中自由切换模式,并在任何模式下进行更改。

图片5
上图是已经编辑好的拓扑结构,是我搭建的一个网络模型,其源码如下:

simple Txc1
{
    gates:
        input in;
        output out;
}

//
// Two instances (tic and toc) of Txc1 connected both ways.
// Tic and toc will pass messages to one another.
//
network Tictoc1
{
    @display("bgb=162,204");
    submodules:
        tic: Txc1 {
            @display("p=32,163");
        }
        toc: Txc1 {
            @display("p=126,31");
        }
    connections:
        tic.out --> {  delay = 100ms; } --> toc.in;
        tic.in <-- {  delay = 100ms; } <-- toc.out;
}
  • 文件中的第一个块声明 Txc1作为简单的模块类型。 简单模块在NED级别上是原子的。它们也是有源成分, 他们的行为是在 C++ 中实现的。该声明还说,Txc1有一个名为 in 的输入门和一个名为 out 的输出门。

  • 第二个块 Tictoc1 声明为网络。 Tictoc1由两个子模块 tic和 toc 组装而成 ,两者都是模块 Txc1的实例。tic的输出门连接到toc的输入门,反之亦然。 双向传播延迟为 100 毫秒。

注:ned语言更详细的介绍见ned语言 ,在安装完Omnet++后再 doc文件夹下也可以找到这些文档

添加C++文件

图片6
图片7
上图中命名为Txc2.cc,是因为已经创建了Txc1.cc的文件,所以这里通过重新命名来进行演示,实际上大家在新建工程时,应该命名为Txc1.cc,因为这个.cc文件是针对简单模块Txc1的功能定义。

在新建的C++文件中输入以下代码:

#include <string.h>
#include <omnetpp.h>

using namespace omnetpp;

/**
 * Derive the Txc1 class from cSimpleModule. In the Tictoc1 network,
 * both the `tic' and `toc' modules are Txc1 objects, created by OMNeT++
 * at the beginning of the simulation.
 */
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++
Define_Module(Txc1);

void Txc1::initialize()
{
    // Initialize is called at the beginning of the simulation.
    // To bootstrap the tic-toc-tic-toc process, one of the modules needs
    // to send the first message. Let this be `tic'.

    // Am I Tic or Toc?
    if (strcmp("tic", getName()) == 0) {
        // create and send first message on gate "out". "tictocMsg" is an
        // arbitrary string which will be the name of the message object.
        cMessage *msg = new cMessage("tictocMsg");
        send(msg, "out");
    }
}

void Txc1::handleMessage(cMessage *msg)
{
    // The handleMessage() method is called whenever a message arrives
    // at the module. Here, we just send it to the other module, through
    // gate `out'. Because both `tic' and `toc' does the same, the message
    // will bounce between the two.
    send(msg, "out"); // send out the message
}

代码解读

  • 类Txc1 代表了基础模块 Txc1 ,Txc1是 Omnet++中 cSimpleModule 的子类,并且使用Define_Module() 函数宏注册到 Omnet++中 。
  • 如果忘记使用 Define_Module() 将自己新构建的模块宏注册到 Omnet++中,将会得到如下类似的报错: “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()”
  • 在Txc1中重定义了函数 initialize() 和handleMessage() ,他们从仿真内核调用 ,第一个函数仅仿真开始时调用一次,第二个函数当有一个消息到达该模块时就会进行调用。
  • 在 initialize() 函数中,创建了一个消息对象 cMessage ,并通过门 out 发送出去. 如果这个门连接到其他模块的 input门 ,仿真内核将传输这个消息到另一个模块的 handleMessage() ,根据 NED文件中的链接有100ms的传播时延。另一个模块将会将其传回,构成一个乒乓一般的传播。
  • 消息(数据包、帧、作业等)和事件(计时器、超时)都是由 OMNeT++ 中的 cMessage 对象(或其子类)表示。 发送或调度它们后,它们将保持在仿真内核的“计划事件”或“未来事件”列表中,直到时间到了,他们才会通过 handleMessage()传输到模块。
  • 注意:这个仿真没有内置停止条件,但可以在那个GUI中停止。

添加omnetpp.ini

为了运行这个仿真,我们要创建一个 omnetpp.ini文件,该文件告诉仿真程序想要仿真的网络是哪一个(NED文件可能包括多个网络),通过该文件还可以传递参数到模型中,显式的为随机数生成器指明seeds等。
图片8
该文件命名为omnetpp.ini

注:与 NED的编辑器类似,ini文件的编辑器也有两个模式,Form和Source ,前者适合配置仿真内核,后者适合输入仿真参数。

现在选择Source,输入如下代码:

[General]
network = Tictoc1

现在已经完成了第一个模型的创建,接下来准备编译和运行该模型,如下图所示:
图片9
至此,第一个工程创建成功!!!

总结

  • 通过该流程的学习,我们了解到一个模型的创建包含了三类主要文件ned 、cpp和ini

    • ned文件构建模块和网络,可以通过图形化界面或文本输入构建
    • cpp文件编程各个模块的具体功能
    • ini文件确定运行那个网络或传递参数等。
  • 除了学习到创建各个文件的用途、创建方式、命名规则等。还学习到cMessage 、initialize()函数、handleMessage()函数相关的知识。

  • 进一步学习ned语言可以通过官方文档。在cpp文件中使用 omnetpp.h头文件和 omnetpp命名空间,可以进一步学习。

下一篇将开始进行INET框架的安装以及无线网络模型的搭建!

### 回答1: OMNeT++是一种强大的网络仿真工具,可以帮助研究人员和工程师对网络系统进行建模、仿真和分析。最新版本OMNeT++ 5.6.1提供了许多新功能和改进,包括增强的GUI、更好的性能和更多的网络模型。 使用OMNeT++ 5.6.1进行网络仿真,需要先安装OMNet++环境。安装完成后,可以创建一个新的工程,选择所需的几个模型库并导入仿真模型。然后,可以编写模型代码和仿真脚本,设置仿真参数并运行仿真OMNeT++ 5.6.1还提供了一些实用工具,例如opp_makemake用于生成Makefile文件,opp_run用于运行仿真进程,opp_scavetool用于数据分析和可视化等。 在使用OMNeT++ 5.6.1进行网络仿真时,需要注意以下要点: 1. 理解网络模型的基本结构和各组件的作用 2. 编写正确的模型代码和仿真脚本 3. 设置合适的仿真参数,例如仿真时间、消息大小、发射速率等 4. 合理分析仿真结果,从各种指标上评估网络性能 总之,OMNeT++ 5.6.1是一种非常强大和灵活的网络仿真工具,可以帮助人们更好地理解和优化网络系统。同时,使用OMNeT++ 5.6.1也需要一定的技能和经验,需要掌握其基本操作和功能,才能更好地应用于实际的网络仿真和分析。 ### 回答2: Omnet++一个广泛使用的网络模拟器,Omnet 5.6.1则是它最新的版本。下面是一个简单的使用教程: 1. 安装 Omnet++:从其官方网站下载 Omnet++ 并安装。 2. 配置系统:为正确执行 Omnet++,需要在操作系统中设置环境变量。在 Windows 操作系统中,可以右键点击此电脑并选择属性,然后在左边的窗格中选择"高级系统设置"选项卡。接着点击"环境变量"按钮,找到用户变量中的 PATH 并添加 Omnet++ 的路径。 3. 创建工程:在 Omnet++ IDE 中,选择"Create new project"并按提示设置工程名称和目录路径。 4. 创建网络拓扑:使用 NED (Network Description) 文件创建网络拓扑。在项目资源中,选择新建 NED 文件并写入所需拓扑。 5. 实现应用程序:在 Omnet++ 中,可以使用 C++ 编写应用程序。新建文件并写入所需代码,然后将文件添加到项目中。 6. 运行模拟器:在 Omnet++ IDE 中,选择"Run as Omnet++ simulation"并等待模拟器执行,可以查看输出窗口中产生的实验信息。 7. 分析实验结果:使用 Omnet++ IDE 的各种分析工具对实验结果进行分析,比如生成图表、显示数据等。 总结:使用 Omnet++ 5.6.1 进行网络模拟需要做的步骤相对简单,只要熟悉其使用方法,就可以进行各种复杂模拟实验了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loveCC_orange

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值