通过Omnet++官网tictoc教程学习在Omnet++中构建和运行仿真 Part4

官方链接

文章目录

  • Part4:让仿真更像实际网络
    • 增加节点
    • 信道和内部类型定义
    • 双向连接的链路
    • 自定义消息类

Part4:让仿真更像实际网络

增加节点

现在我们将迈出一大步:创建几个tic模块并将它们连接到一个网络中。现在,我们将保持简单:其中一个节点生成消息,其他节点将消息向随机的方向传递,直到它到达预定的目标节点。

NED文件需要做一些修改。首先,Txc模块需要有多个输入和输出门:

simple Txc10
{parameters:@display("i=block/routing");gates:input in[];  // declare in[] and out[] to be vector gatesoutput out[];
}```
[]将门转换为门向量。向量的大小(门的数量)将由我们使用Txc构建网络的地方决定。```cpp
network Tictoc10
{submodules:tic[6]: Txc10;connections:tic[0].out++ --> {  delay = 100ms; } --> tic[1].in++;tic[0].in++ <-- {  delay = 100ms; } <-- tic[1].out++;tic[1].out++ --> {  delay = 100ms; } --> tic[2].in++;tic[1].in++ <-- {  delay = 100ms; } <-- tic[2].out++;tic[1].out++ --> {  delay = 100ms; } --> tic[4].in++;tic[1].in++ <-- {  delay = 100ms; } <-- tic[4].out++;tic[3].out++ --> {  delay = 100ms; } --> tic[4].in++;tic[3].in++ <-- {  delay = 100ms; } <-- tic[4].out++;tic[4].out++ --> {  delay = 100ms; } --> tic[5].in++;tic[4].in++ <-- {  delay = 100ms; } <-- tic[5].out++;
}

在这里,我们创建了6个模块作为模块向量,并将它们连接起来。

结果拓扑看起来像这样:
在这里插入图片描述
在这个版本中,tic[0]将生成要发送的消息。这是在initialize()方法中借助getIndex()函数完成的,getIndex()函数返回模块在向量中的索引。

代码的核心是forwardMessage()函数,每当消息到达节点时,我们就从handleMessage()调用该函数。它随机抽取一个门号,并在门上发送消息。

void Txc10::forwardMessage(cMessage *msg)
{// In this example, we just pick a random gate to send it on.// We draw a random number between 0 and the size of gate `out[]'.int n = gateSize("out");int k = intuniform(0, n-1);EV << "Forwarding message " << msg << " on port out[" << k << "]\n";send(msg, "out", k);
}

当消息到达tic[3]时,其handleMessage()将删除该消息。

练习:你会注意到,这种简单的“路由”效率并不高:数据包在被发送到另一个方向之前,通常会在两个节点之间跳动一段时间。如果节点不将数据包发送回发送端,这种情况可以有所改善。实现这一点。提示:cMessage:: getargate (), cGate::getIndex()。注意,如果消息不是通过gate到达的,而是一个自消息,那么getargate()会返回NULL。

总结:该部分主要是告诉我们如何增加节点以及增加gate和节点间的连接

将网络由原来的2节点扩展为6个节点,每个节点都继承自Tx10,由于一个节点可能不止连接一个其他节点,所以出入的网口不再只是一个,在Ned文件中,将原来的gates:下的 Input in 和 output修改为 向量: input in[] 和 output out[] ,这样一个节点可以通过 in[0]作为第一个入口网关,in[1]作为第二个,以此类推。
该代码消息转发是由tic0生成初始消息,每到达一个节点调用handleMessage()中的forwardMessage()函数,该函数将此消息发往随机一个out gate 。

gateSize(“out”) :查询当前模块(module)中指定名称的出向消息门(output gate)的数量。
intuniform(0, n-1); :获取 0到n-1之间一个随机整数

信道和内部类型定义

我们新的网络定义变得相当复杂和冗长,特别是连接部分。我们试着简化一下。我们注意到的第一件事是连接总是使用相同的延迟参数。可以为连接创建类型(称为通道),类似于简单的模块。我们应该创建一个指定延迟参数的通道类型,我们将对网络中的所有连接使用该类型。

network Tictoc11
{types:channel Channel extends ned.DelayChannel {delay = 100ms;}submodules:

正如您已经注意到的,我们通过添加types部分在网络定义中定义了新的通道类型。该类型定义仅在网络内部可见。它被称为局部类型或内部类型。如果你愿意,也可以使用简单的模块作为内部类型。

注意:我们通过特化内置的DelayChannel创建了通道。(内置通道可以在Ned包中找到。这就是为什么我们在extends关键字后面使用完整的类型名称ned.DelayChannel)。

现在让我们看看connections部分是如何更改的:

  connections:tic[0].out++ --> Channel --> tic[1].in++;tic[0].in++ <-- Channel <-- tic[1].out++;tic[1].out++ --> Channel --> tic[2].in++;tic[1].in++ <-- Channel <-- tic[2].out++;tic[1].out++ --> Channel --> tic[4].in++;tic[1].in++ <-- Channel <-- tic[4].out++;tic[3].out++ --> Channel --> tic[4].in++;tic[3].in++ <-- Channel <-- tic[4].out++;tic[4].out++ --> Channel --> tic[5].in++;tic[4].in++ <-- Channel <-- tic[5].out++;
}

正如您所看到的,我们只是在连接定义中指定通道名称。这允许轻松更改整个网络的延迟参数。

总结:该部分主要是告诉我们如何生成信道,对于相同信道的连接可以统一设置,方便一起更改;在Ned文件的网络中,type关键字,通常用于自定义数据类型或通道类型 ;在创建信道时,可以继承定义好的信道类型,这里 channel Channel extends ned.DelayChannel 就是建立信道 Channel 该信道是ned中DelayChannel的扩展。

双向连接的链路

如果我们再检查一下连接部分,我们将意识到每个节点对由两个连接连接。每个方向一个。omnet++ 4支持双向连接,所以让我们使用它们。

首先,我们必须定义双向(或所谓的inout)门,而不是我们之前使用的单独的输入和输出门。

simple Txc12
{parameters:@display("i=block/routing");gates:inout gate[];  // declare two way connections
}

新的连接将如下所示:

connections:tic[0].gate++ <--> Channel <--> tic[1].gate++;tic[1].gate++ <--> Channel <--> tic[2].gate++;tic[1].gate++ <--> Channel <--> tic[4].gate++;tic[3].gate++ <--> Channel <--> tic[4].gate++;tic[4].gate++ <--> Channel <--> tic[5].gate++;
}

我们已经修改了gate的名称,因此我们必须对c++代码进行一些修改。

void Txc12::forwardMessage(cMessage *msg)
{// In this example, we just pick a random gate to send it on.// We draw a random number between 0 and the size of gate `gate[]'.int n = gateSize("gate");int k = intuniform(0, n-1);EV << "Forwarding message " << msg << " on gate[" << k << "]\n";// $o and $i suffix is used to identify the input/output part of a two way gatesend(msg, "gate$o", k);
}

注意:gate名称后面特殊的 i 和 i和 io后缀允许我们分别使用连接的两个方向。

总结:之前两节点间的连接都是定义了两条链路,分别进行两者间单向的传输,这一节告诉我们如何在两节点间创建一条可以双向传输的链路。首先在节点的gates 关键字下定义网口需要为 inout ;然后在连接两节点时使用 <–> ;c语言中原来使用 in/out的地方要对应的修改。

自定义消息类

在这一步中,目的地地址不再硬编码为tic[3]——我们采用随机的目的地,我们将把目的地地址添加到消息中。

最好的方法是继承cMessage,并将destination添加为数据成员。手工编写message类通常会太长,因为它包含很多样板代码,所以我们使用omnet++来生成这个类。message类规范在tictoc13.msg中:

message TicTocMsg13
{int source;int destination;int hopCount = 0;
}

注:可以看 Omnet++手册的第六节来详细了解message

设置makefile以便调用消息编译器opp_msgc从消息声明来生成tictoc13_m.h和tictoc13_m.cc(这两个名称是从tictoc13. msg文件名生成的,而不是消息类型名称)。它们将包含一个生成的TicTocMsg13类,它继承自[cMessage];这个类对每个字段都有getter和setter方法。

我们将把tictoc13_m.h包含到我们的c++代码中,我们可以像使用任何其他类一样使用TicTocMsg13。

19   #include "tictoc13_m.h"

例如,我们在generateMessage()中使用以下代码行来创建消息并填充其字段。

    TicTocMsg13 *msg = new TicTocMsg13(msgname);msg->setSource(src);msg->setDestination(dest);return msg;

然后,handleMessage() 会变成这样:

void Txc13::handleMessage(cMessage *msg)
{TicTocMsg13 *ttmsg = check_and_cast<TicTocMsg13 *>(msg);if (ttmsg->getDestination() == getIndex()) {

在handleMessage()的参数中,我们得到的消息是一个cMessage指针。但是,如果我们将msg转换为TicTocMsg13,我们只能访问它在TicTocMsg13中定义的字段。普通的c风格强制转换((TicTocMsg13 *)msg)是不安全的,因为如果消息不是TicTocMsg13,程序将崩溃,导致难以探索的错误。

c++提供了一个称为dynamic_cast的解决方案。这里我们使用omnet++提供的check_and_cast<>():它试图通过dynamic_cast强制转换指针,如果失败,它将以错误消息停止模拟,类似于以下内容:
在这里插入图片描述
在下一行中,我们检查目标地址是否与节点的地址相同。getIndex()成员函数返回该模块在子模块向量中的索引(请记住,在NED文件中我们将其声明为tic[6]: Txc13,因此我们的节点地址为0到5)。

为了使模型执行时间更长,在消息到达目的地后,目的地节点将生成另一个具有随机目的地地址的消息,以此类推。阅读完整的代码:txc13.cc

运行模型时,它看起来像这样:
在这里插入图片描述
您可以单击消息,在检查器窗口中查看它们的内容。双击将在一个新窗口中打开检查器。(你要么必须暂时停止模拟,要么必须非常快速地处理鼠标)。检查器窗口显示了很多有用的信息;可以在Contents页面上看到消息字段。
在这里插入图片描述
练习:这个模型中,在任何给定的时刻只有一条消息正在进行:节点只有在另一条消息到达时才生成一条消息。我们这样做是为了让模拟更容易进行。更改module类,让它定期生成消息。消息之间的间隔应该是一个指数分布的随机数。

总结: 该部分主要是告诉我们关于构建更复杂的消息以及其传递、使用等方面的内容 。

该实验想让消息传递到正确的目的地,通过将目的地消息加入消息中,在接受节点中进行判断来实现。

构建自定义消息都方法是创建新的消息文件:tictoc.msg文件,该文件中定义了新的消息类名字为TicTocMsg13 ,该类继承自 cMessage ,其中增添了三个变量: source 、destination和hopCount 。 在如此创建msg文件后,编译器会自动生成tictoc13_m.h和tictoc13_m.cc文件,该文件名字源自 tictoc.msg。 在需要使用该消息都cc文件中,需要 #include"tictoc13_m.h"

通过 TicTocMsg13 *msg = new TicTocMsg13(msgname); 创建一个此类型消息 ,通过如 msg->setSource(src); 来访问 ;

check_and_cast<TicTocMsg13 *>(msg): 该函数用于将msg的类型转换为 TicTocMsg13 * ,如果转换失败不会崩溃而是出现特定的消息提示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/311488.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果电脑启动磁盘是什么意思 苹果电脑磁盘清理软件 mac找不到启动磁盘 启动磁盘没有足够的空间来进行分区

当你一早打开苹果电脑&#xff0c;结果系统突然提示&#xff1a; “启动磁盘已满&#xff0c;需要删除部分文件”。你会怎么办&#xff1f;如果你认为单纯靠清理废纸篓或者删除大型文件就能释放你的启动磁盘上的空间&#xff0c;那就大错特错了。其实苹果启动磁盘的清理技巧有很…

pyside6自定义部件库和软件框架的建设记录

自定义的部件库原则上尽量做到前后端分离&#xff0c;接口方便&#xff0c;复制简单。 单选框部件 # encoding: utf-8 ################################################### # 自定义的单选框 #################################################### 对外接口&…

蓝桥杯2024年第十五届省赛真题-R 格式(高精度乘法 + 加法)

本题链接&#xff1a;蓝桥杯2024年第十五届省赛真题-R 格式 - C语言网 题目&#xff1a;​​​​​​​ 样例&#xff1a; 输入 2 3.14 输出 13 思路&#xff1a; 根据题意&#xff0c;结合数据范围&#xff0c;这是一道模板的高精度乘以低精度问题。 题意是double 类型 d 与…

【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 前言 本篇主要内容&#xff1a;类的6个默认成员函数中的拷贝构造函数…

由于找不到krpt.dll,无法继续执行代码的5种解决方法

在正常使用电脑的过程中&#xff0c;当尝试启动某个应用程序或者执行特定功能时&#xff0c;系统突然弹出一个错误提示窗口&#xff0c;明确指出由于缺失关键性文件——krpt.dll&#xff0c;导致当前运行的软件无法正常读取并执行相应的程序代码&#xff0c;进而无法顺利完成预…

Neo4j 图形数据库中有哪些构建块?

Neo4j 图形数据库具有以下构建块 - 节点属性关系标签数据浏览器 节点 节点是 Graph 的基本单位。 它包含具有键值对的属性&#xff0c;如下图所示。 NEmployee 节点 在这里&#xff0c;节点 Name "Employee" &#xff0c;它包含一组属性作为键值对。 属性 属性是…

Hit the World Hit世界 Hit2日服官网地址+配置要求+测试时间

Hit the World/Hit世界/Hit2日服官网地址配置要求测试时间 Hit the World/Hit世界是NEXON旗下MMOROG游戏&#xff0c;作品类型上是典型的类天堂游戏&#xff0c;升级思路很简单&#xff0c;一般是跟着主线走&#xff0c;除了主线还有副本升级。支持移动和PC两端&#xff0c;继…

1113. 红与黑--Flood Fill 算法

目录 1113. 红与黑--Flood Fill 算法---宽搜&#xff08;BFS&#xff09;或DFS&#xff09; 输入格式 输出格式 数据范围 输入样例&#xff1a; 输出样例&#xff1a; 思路&#xff1a; 1.BFS 思路&#xff1a; 2.DFS 思路 方法一&#xff1a;&#xff08;BFS&#x…

STM32H7的8个串口fifo收发(兼容232和485)

STM32H7的8个串口fifo收发&#xff08;兼容232和485&#xff09; 串口硬件串口时序串口高级特性同步和异步的区别单工、半双工、全双工的区别 STM32H78个串口fifo驱动定义数据结构uart_fifo.huart驱动包括中断配置等 应用示例RS485深入理解 仅供学习。 USART 的全称是 Universa…

【电控笔记6.2】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

sqlilabs靶场1—20题学习笔记(思路+解析+方法)

前几个题目较为简单&#xff0c;均尝试使用各种方法进行SQL注入 第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&…

全球顶级的低代码开发平台,你知道几个?

什么是低代码开发平台? 低码开发平台是一个应用程序,提供图形用户界面编程,从而以非常快的速度开发代码,减少了传统的编程工作。 这些工具有助于快速开发代码,最大限度地减少手工编码的努力。这些平台不仅有助于编码,而且还能快速安装和部署。 低码开发工具的好处 低代码平…

3dmax在线渲染怎么取消?怎么关闭云渲染

在线渲染&#xff0c;无论是通过云渲染服务还是渲染农场&#xff0c;已经成为众多3dmax动画制作者的首选方式来执行渲染任务。然而&#xff0c;如果在渲染过程中需要禁用这一在线渲染功能&#xff0c;该怎么操作呢&#xff1f;接下来&#xff0c;让我们一起探讨如何关闭这一功能…

【精读文献】Scientific data|2017-2021年中国10米玉米农田变化制图

论文名称&#xff1a;Mapping annual 10-m maize cropland changes in China during 2017–2021 第一作者及通讯作者&#xff1a;Xingang Li, Ying Qu 第一作者单位及通讯作者单位&#xff1a;北京师范大学地理学部 文章发表期刊&#xff1a;《Scientific data》&#xff08…

书生浦语学习第二课 轻松玩转书生浦语趣味Demo

本节课让同学们实践 4 个内容&#xff0c;分别是&#xff1a;部署 InternLM2-Chat-1.8B 模型进行智能对话、部署一期实战营优秀作品 八戒-Chat-1.8B 模型、 运行 Lagent 智能体 Demo、实践部署 浦语灵笔2 模型。 第一步&#xff0c;打开 Intern Studio 界面&#xff0c;点击 创…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Check Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Check Box的使用及说明 文章编号&#xff1a;…

CSS实现卡片在鼠标悬停时突出效果

在CSS中&#xff0c;实现卡片在鼠标悬停时突出&#xff0c;通常使用:hover伪类选择器。 :hover伪类选择器用于指定当鼠标指针悬停在某个元素上时&#xff0c;该元素的状态变化。通过:hover选择器&#xff0c;你可以定义鼠标悬停在元素上时元素的样式&#xff0c;比如改变颜色、…

基于Docker构建CI/CD工具链(七)使用Jmeter进行自动化压测

上一篇文章中&#xff0c;我们详细介绍了构建 Apifox Cli 的 Docker 镜像的步骤&#xff0c;并通过简单的示例演示了如何利用 GitLab 的 CI/CD 功能&#xff0c;将构建好的镜像利用在自动化测试作业中。在今天的文章中&#xff0c;我们将重点讨论如何构建 JMeter 的 Docker 镜像…

【Entity Framework】你知道如何处理无键实体吗

【Entity Framework】你知道如何处理无键实体吗 文章目录 【Entity Framework】你知道如何处理无键实体吗一、概述二、定义无键实体类型数据注释 三、无键实体类型特征四、无键实体使用场景五、无键实体使用场景六、无键使用示例6.1 定义一个简单的Blog和Post模型&#xff1a;6…

csdn 博客怎么设置背景图

一、效果图 话不多说&#xff0c;先看效果图&#xff1a; 二、操作步骤 点击创作中心&#xff1a; 点击博客设置&#xff1a; 编辑博客设置&#xff1a; 点击保存&#xff1a; 三、自定义背景图 csdn不支持自定义背景图&#xff0c;只支持选择背景主题。 四、其它