首先,让我们从一个由两个节点组成的“网络”开始。节点将做一些简单的事情:其中一个节点将创建一个数据包,两个节点将继续来回传递相同的数据包。我们将节点称为“tic”和“toc”。

以下是从头开始实施第一个模拟的步骤:

1.创建一个名为tictoc的工作目录,并cd到此目录。

2.通过创建拓扑文件来描述您的示例网络。拓扑文件是一个文本文件,用于标识网络的节点及其之间的链接。您可以使用自己喜欢的文本编辑器创建它。我们称之为tictoc1.ned:

tictoc1.ned

simple Txc1
{gates:input in;output out;
}//Txc1的两个实例(tic和toc)都是双向连接的
// tic和toc将消息传递给另一个network Tictoc1
{submodules:tic: Txc1;toc: Txc1;connections:tic.out --> {  delay = 100ms; } --> toc.in;tic.in <-- {  delay = 100ms; } <-- toc.out;
}

该文件最好从下往上阅读。它是说:

  • Tictoc1是一个网络,由两个子模块tic和toc组合而成。tic和toc是名为Txc1的相同模块类型的实例。我们将tic的输出门(命名为)连接到toc的输入门(命名为),反之亦然(network ... { ... })。两种方式都会有100ms的传播延迟;
  • Txc1是一个简单的模块类型(这意味着它在NED级别上是原子的,并且将在C ++中实现)。Txc1有一个名为in的输入门,一个输出门名为out(simple ... { ... }

3.我们现在需要实现简单模块Txc1的功能。这是通过编写C ++文件txc1 :: cc来实现的

#include <string.h>
#include <omnetpp.h>class Txc1 : public cSimpleModule
{protected: virtual void initialize();virtual void handleMessage(cMessage *msg);
};// The module class needs to be registered with OMNeT++
Define_Module(Txc1);void Txc1::initialize()
{// 模拟开始时调用Initialize来引导tic-toc-tic-toc进程// 其中一个模块需要发送第一条消息。让它成为'tic'// 是Tic还是Toc?if (strcmp("tic", getName()) == 0){// 在门“out”上创建并发送第一条消息//“tictocMsg”是任意字符串,它将是消息对象的名称cMessage *msg = new cMessage("tictocMsg");send(msg, "out");}
}void Txc1::handleMessage(cMessage *msg)
{// 每当消息到达模块时,都会调用handleMessage()方法//在这里,我们只是通过‘out’门将它发送到另一个模块//因为'tic'和`toc'都是相同的,所以消息会在两者之间反弹send(msg, "out");
}

简单模块Txc1由C ++类Txc1来表示,它是cSimpleModule的子类,并注册在OMNeT++的 Define_Module()宏里。我们从cSimpleModule重新定义了两个方法:initialize()和handleMessage()。它们是从仿真内核里调用的:第一个只使用一次,第二个是在消息到达模块时使用。

initialize()中,我们创建一个消息对象(cMessage),通过“out”门发送它。由于此“out”门连接到另一个模块的输入门,因此仿真内核会在handleMessage()的参数中将此消息传递给另一个模块--- NED文件中,在100ms传播延迟之后将它分配到链路中。另一个模块只是将其发回(另外100ms延迟),因此它将导致连续的乒乓。

Messages(数据包,帧,作业等)和events(定时器,超时)都是由OMNeT ++中的cMessage对象(或其子类)表示。在发送或安排它们之后,仿真内核将他们保存在“scheduled events”或“future events”列表中,直到它们到来并通过handleMessage()传递给模块。

请注意,此模拟中没有内置停止条件:它将永远持续下去。您将能够从GUI停止它。(您还可以在配置文件中指定模拟时间限制或CPU时间限制,但我们在教程中不这样做。)

4.我们现在创建Makefile,它将帮助我们编译和链接我们的程序以创建可执行文件tictoc

$ opp_makemake

此命令现在应该已在工作目录tictoc中创建了一个Makefile

5.现在让我们通过发出make命令来编译和链接我们的第一个模拟:

$ make

如果存在编译错误,则需要纠正它们并重复make,直到获得无错误的编译和链接。

6.如果您现在启动可执行文件,它会抱怨它无法找到omnetpp.ini文件,因此您必须创建一个。omn​​etpp.ini告诉模拟程序您要模拟哪个网络(是的,几个网络可以存在于同一个模拟程序中),您可以将参数传递给模型,明确指定随机数生成器的种子等。

创建以下非常简单的omnetpp.ini:

[General]
network = Tictoc1

tictoc2和进一步的步骤将共享以下omnetpp.ini:

# This file is shared by all tictoc simulations.
# Lines beginning with `#' are comments[General]
# nothing here[Config Tictoc1]
network = Tictoc1[Config Tictoc2]
network = Tictoc2[Config Tictoc3]
network = Tictoc3[Config Tictoc4]
network = Tictoc4
Tictoc4.toc.limit = 5[Config Tictoc5]
network = Tictoc5
**.limit = 5[Config Tictoc6]
network = Tictoc6[Config Tictoc7]
network = Tictoc7
# argument to exponential() is the mean; truncnormal() returns values from
# the normal distribution truncated to nonnegative values
Tictoc7.tic.delayTime = exponential(3s)
Tictoc7.toc.delayTime = truncnormal(3s,1s)[Config Tictoc8]
network = Tictoc8[Config Tictoc9]
network = Tictoc9[Config Tictoc10]
network = Tictoc10[Config Tictoc11]
network = Tictoc11[Config Tictoc12]
network = Tictoc12[Config Tictoc13]
network = Tictoc13[Config Tictoc14]
network = Tictoc14[Config Tictoc15]
network = Tictoc15
record-eventlog = true[Config Tictoc16]
network = Tictoc16
**.tic[1].hopCount.result-recording-modes = +histogram
**.tic[0..2].hopCount.result-recording-modes = -vector

7.完成上述步骤后,通过发出以下命令启动模拟

$ ./tictoc

现在应该已经打开OMNeT ++模拟窗口

8.按工具栏上的“运行”按钮开始模拟,您应该看到的是tic和toc正在相互交换消息。

主窗口工具栏显示模拟时间。这是虚拟时间,它与程序执行的实际(或挂钟)时间无关。实际上,您可以在一个真实世界中模拟多少秒,这在很大程度上取决于硬件的速度,更取决于仿真模型本身的性质和复杂性。请注意,节点处理消息需要零模拟时间。使模拟时间在此模型中通过的唯一因素是连接上的传播延迟。

9.您可以使用图形窗口顶部的滑块来减慢动画速度或加快速度。您可以通过按F8(相当于工具栏上的STOP按钮),单步执行(F4),使用(F5)或不使用(F6)动画运行来停止模拟。F7(快速模式)完全关闭跟踪功能以获得最大速度。请注意主窗口状态栏上的事件/秒和simsec / sec计量器。

10.您可以通过单击“关闭”图标或选择“文件”|“退出”来退出模拟程序。

  • 要点:

  1. 创建NED文件(在NED中给出网络的拓扑结构),拓扑结构包含简单模块(主要包含input门和output门)、复合模块、网络模块(包含子模块和连接)
  2. 创建C++文件(*.cc)为每个简单模块实现功能,每个简单模块的类名必须与NED中简单模块的名字保持一致;简单模块类继承于系统库中提供的cSimpleModule类,类中一般方法包含初始化函数initialize(),以及接受到消息后的处理函数handleMessage();类定义完成后,必须使用宏Define_Module()进行注册
  3. Build工程会自动生成makefile文件,并对源代码进行编译(命令行实际是调用opp_makemake工具来自动生成makefile文件),生成可执行程序
  4. 此时模拟程序还无法启动,需要创建omnetpp.ini文件;ini文件中主要描述一下需要模拟定义的哪个网络(一个模拟程序中可以定义多个网络),已经如何给该网络模型传递参数等等
  5. 通过debug、run或者直接在命令行中运行生成的可执行程序,模拟就跑起来了。模拟中可以一步一步运行,可以调节运行的速度,以及动画的速度。
  • 容易出错的地方:

1)NED和cc文件中模型的类名必须保持一致;

2)不要忘记Define_Module();

3)cc文件中   不要忘记#include <omnetpp.h>,using namespace omnetpp;

OMNeT++学习---TicToc(1)相关推荐

  1. OMNeT学习之OMNeT安装与运行

    OMNeT学习之OMNeT安装与运行 前言 本文原创,创作不易,转载请注明!!! 本人为OMNet初学者,如有错误,请不吝请教! 最近学WSN(无线传感器网络),做传感器实验,老师强调了仿真平台Mat ...

  2. 2022-04-21 Omnet学习笔记(一)

    Omnet学习笔记(一) 前言 1.本机为Inspiron 5005,为64位,所用操作系统为Windos 10.所使用软件为Omnet-5.2.1. 2.推荐Omnet入门教程系列 实验现象 在网络 ...

  3. OMNeT学习之新建工程

    OMNeT学习之新建工程 前言 之前学习了OMNeT的安装与运行官方的实例代码,这篇文章记录一下,OMNeT如何创建一个新的项目. 本人为初学者,如有错误望批评指正! 本文原创,创作不易,转载请注明! ...

  4. omnet学习记录之tictoc1-18

    最近需要学习omnet这个软件,先从例程开始,记录一下自己的学习过程和一些疑惑的地方,如果有错误的地方,请大家批评指正.也欢迎大家给我解惑,谢谢!(好多对实例的理解是借助网上的帖子) 完整地运行一个O ...

  5. OMNeT++学习(概述+框架)一

    中文手册地址 之前一直学习的是mininet,但是所做的方向有一个开源的代码,和我需要的框架一样,它用的仿真器是Omnetpp-5.4.1. 概述 omnet++是开源的基于组件的模块化的开放网络仿真 ...

  6. OMNET++学习(Network Node)

    在本次学习中,我们将研究这些节点模型的内部结构,以便更深入地了解它们的定制可能性,并对如何组装定制节点模型给出一些指导. Ingredient 节点模型由其他模块组装而成,这些模块代表了应用程序.通信 ...

  7. OMNET++学习(Networks)

    内置网络节点 StandardHost包含最常见的互联网协议.UDP.TCP.IPv4.IPv6.以太网.IEEE802.11.它还支持可选的移动性模型.可选的能源模型和任何数量的应用程序,这些都是可 ...

  8. OMNet++学习笔记2

    OMNet++ 模型 由模块组成,模块之间通过消息传递方式进行通信.模块结构通过NED语言描述. Messages 可以代表网络数据包.数据帧.排队网络中的客户 gates 模块输入输出接口 conn ...

  9. omnet++学习记录2

    OMNET++ 学习过程记录2 1.先在.cc中声明 class NODE1 : public cSimpleModule { } 2.再在.cc中注册 Define_Module(NODE1);写在 ...

  10. OMNet++学习笔记1

    主要应用领域 无线传感器网络(数据压缩.路由协议.能耗问题) 移动自组网(组网算法) OSI模型(eg. MAC,TCPIP等协议仿真) 网络通信协议 网络安全 光通信(光网络频谱分布) 水声通信 车 ...

最新文章

  1. 理解YOLOv2训练过程中输出参数含义
  2. C语言单向链表的实现
  3. Ubuntu搭建Spark运行环境
  4. Django视图之介绍、项目准备、URL、路由命名、reverse反解析和Postman测试
  5. 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题
  6. 生成N个0~1的随机数,同时这些随机数的和为1
  7. [Java基础]Arrays的常用方法
  8. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
  9. 江西师范大学2017年C语言考试,2018年江西师范大学程序设计(C语言)考研初试大纲...
  10. git 提交代码命令_提交代码:git push 命令的四种形式
  11. Spread for Windows Forms高级主题(6)---数据绑定管理
  12. 安装brew_MacBook Pro安装Homebrew慢的问题解决方案
  13. 读书笔记--疯狂Android讲义 目录
  14. 开源协议的几种类型认识
  15. python安装pil库-python第三方库PIL.Image安装
  16. 网易云音乐ncm格式转换mp3格式工具
  17. ap音频测试仪软件,美国进口音频分析仪/AP音频测试仪/电声测试仪
  18. Mac使用终端连接远程LInux,FTP连接
  19. 关于epub格式电子书和PC上的ePub阅读器...
  20. 如何万网域名解析亚马逊服务器,关于aws亚马逊dns域名解析route53的使用

热门文章

  1. JavaScript 详解(表单验证,JSON,JS事件,JS函数)
  2. c#和java工资相差多少岁_为什么C#程序员平均工资水平比Java程序员低?
  3. Modelsim查看中间变量
  4. 关键词词云怎么做_关键词云图生成器
  5. 飞天云动能否一飞冲天?
  6. qt编写网易云界面(1)----标题框的实现
  7. 多路由器实现无线无缝漫游
  8. 面包板电源线怎么接_如何维修面包板电源
  9. ANC 调试 -FB 降噪原理和调试
  10. ANC主动降噪的量化描述