第1部分-入门

1.1模型

首先,让我们从一个包含两个节点的“network”开始。节点将做一些简单的事情:一个是节点将创建一个数据包,而两个节点将继续来回传递相同的数据包。我们将节点称为tictoc。稍后,我们将逐步改进此模型,并在每个步骤中引入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()"

我们从重新定义两种方法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文件。

现在,我们已经完成了创建第一个模型的准备,并可以编译和运行它了。

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

OMnet++ 初学者教程 第一节 入门的更多相关文章

  1. Android精通教程-第一节Android入门简介

    前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be ...

  2. 2014年度辛星html教程夏季版第一节

    从今天起开始在博客园开启自己的html教程啦,先从第一节开始把,首先推荐一个网站,就是http:/www.w3cschool.cc,这是一个公开的教学网站,但是它有一个问题,那就是虽然很全面,但是不是 ...

  3. MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件

    MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件 前言 万事开头难,有了<MapSer ...

  4. Ionic 入门与实战之第二章第一节:Ionic 环境搭建之开发环境配置

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第一节,主要对 Ionic 的开发环境配置做了简要的介绍,本文介绍的开发环境为 Mac 系统,Windows 系统基本类似,少许 ...

  5. 《进击吧!Blazor!》系列入门教程 第一章 8.部署

    <进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...

  6. 基本教程篇--第一节:InitialSampleDemo.cs介绍

       第一节:InitialSampleDemo.cs介绍         为了讲解方便,我先附上源代码和效果图. 代码如下: using System; using System.Drawing; ...

  7. android内部培训视频_第一节

    声明:本视频为公司内部做android培训时录制的,无任何商业目的.同时鉴于水平有限,可能不符合您的需求,放在这里的目的是提供给公司同事下载,作为培训的一个记录,也作为一个系列教程的自我督促完成的理由 ...

  8. Spring_MVC_教程_快速入门_深入分析

    Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...

  9. 辛星跟您玩转vim第一节之vim的下载与三种模式

    首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...

随机推荐

  1. GitHub Ribbons : 谈网站的安全性-资源链接如何 预防/实现 爬虫的批量下载!

    GitHub Ribbons : 谈网站的安全性-资源链接如何 预防/实现 爬虫的批量下载! 预防方法: 1. 使用随机数字符串,拼接URL! https://camo.githubuserconte ...

  2. js debounce & throttle All In One

    js debounce & throttle All In One debounce & throttle js 节流 防抖 debounce 防抖 防抖,是指一个事件触发后在单位时间 ...

  3. Cocos Creator 游戏开发

    Cocos Creator 游戏开发 https://www.cocos.com/products#CocosCreator 一体化编辑器: 包含了一体化.可扩展的编辑器,简化了资源管理.游戏调试和预 ...

  4. Python 2 to Python 3 convert

    Python 2 to Python 3 convert 2to3, 自动将 Python 2 代码转为 Python 3 代码 https://docs.python.org/zh-cn/2/lib ...

  5. how to write an ebook that can support published by format PDF, Epub, Mobi and so on

    how to write an ebook that can support published by format PDF, Epub, Mobi and so on 如何写一本自己的电子书,支持各 ...

  6. flex & flex-wrap

    flex & flex-wrap https://css-tricks.com/almanac/properties/f/flex-wrap/ https://developer.mozill ...

  7. Taro Advanced

    Taro Advanced aro 代码与小程序代码混写 https://nervjs.github.io/taro/docs/hybrid.html https://github.com/NervJ ...

  8. c++ DWORD和uintptr_t

    x86模式 DWORD 是4字节 x86模式 uintptr_t 是4字节 x64模式 DWORD 是4字节 x64模式 uintptr_t 是8字节 std::cout << sizeo ...

  9. animejs 动画库

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. NGK官方又出助力市场计划方案 1万枚VAST任性送

    近期NGK官方的一系列动作,可以说是在向外界宣告:NGK2.0即将来袭,席卷加密数字货币市场.前一段时间,NGK官方宣布,NGK公链布局算力领域,打造NGK算力生态星空计划,并推出了SPC星空币.目前 ...