从零开始学习OMNeT++系列第三弹——新建一个使用INET框架的工程

上一篇学习了如何新建一个omnet++的工程,这篇来学习下INET框架以及如何使用INET框架来新建一个工程。

INET框架是什么

  • INET框架是一个开源模型库,用于OMNeT++仿真环境。它为研究者和学生在使用通信网络时提供协议、代理和其他模型。当设计和验证新协议或探索新的场景时,INET尤其有用。
  • INET支持广泛的通信网络类别,包括有线无线移动自组织和传感器网络。它包含了互联网协议栈(TCP、UDP、IPv4、IPv6、OSPF、BGP等)、链路层协议(以太网、PPP、IEEE 802.11、各种传感器MAC协议等)、无线物理层的精细支持、MANET路由协议、区分服务(DiffServ)、MPLS与LDP和RSVP-TE信令、多个应用模型以及许多其他协议和组件。它还提供了对节点移动性、高级可视化、网络仿真等的支持。
  • 有几个其他的仿真框架以INET为基础,并将其扩展到特定方向,如车联网、覆盖/对等网络和LTE。

INET框架的安装

  • 在新建自己工程的时候,可以在omnet++解压后的那个文件夹里新建一个存储自己工程文件的文件夹
  • 然后启动omnet++的时候,会弹出来设置启动路径的窗口,这个时候将启动路径设置为自己新建的文件夹的路径
  • 对于新建的工作空间,启动后进入到IDE界面,会自动弹出来安装INET框架的提示,然后直接点击安装就好了,十分方便!

新建一个INET框架的工程

参考资料:新建一个基于INET框架的工程

新建一个OMNeT++的工程

选择File---->OMNeT++ Project
图片1
输入自己的工程名称,点击next
图片2
选择Empty project with ‘src’ and ‘simulations’ folders,然后点击finish
图片3
这样,我们就完成了新建omnet++工程的步骤,到这里是和我们创建普通的omnet++工程是一样的,接下来开始配置INET框架。

配置INET框架

右击刚刚新建的omnet++工程的文件夹,选择Properties
图片4
在下面的窗口中,选择Project References,然后给inet4.5打钩
图片5
然后选择上面OMNeT++下面的Makemake选项,然后选择下面图中蓝色的选项,再点击Build选项栏里面的Options选项
图片6
然后在下面的窗口中选择Compile选项,将下面的三个选项全部勾上。
图片7
再点击Link选项,将其中的两项也全部勾选上。
图片8
然后点击OK,之后再原来的窗口点击Apply,然后Apply and Close,就完成了该工程和INET框架的连接。

在工程中新建仿真文件进行仿真运行

我给的参考资料中用的是AODV那个仿真程序,我按照资料里给的方法试了一下,发现报错:
图片9
具体错误信息如下:

<!> Enum "inet::NodeStatus" not found -- its declaration may be missing from .msg files, or the code was not linked in -- in module (inet::NodeStatus) AODVNetwork.host[0].status (id=31), during network initialization

然后试图解决一下,但是也没搞定,后续还得好好研究一下INET框架的源码,如果有哪个友友解决了这个问题,可以交流一下,感谢!!!

于是,我从官网上找了INET的教程,重新新建了一个仿真程序来进行INET框架的仿真验证,跑成功了!
参考资料:Two hosts communicating wirelessly

目标

首先,我们想要创建一个包含两个主机的网络,其中一台主机通过无线给另一台主机发送UDP数据流,我们的目的是想要物理层和更底层的协议尽可能的简单。

建立的模型如下图所示:
图片10
该模型的NED源码如下所示:

//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
package learn_2.simulations.test;
// 定义网络模型所在的路径
import inet.networklayer.configurator.ipv4.Ipv4NetworkConfigurator; // 从inet框架导入IP 网络配置器模块
import inet.node.contract.INetworkNode; // 从inet框架导入网络节点接口模块
import inet.physicallayer.wireless.common.medium.RadioMedium; // 从inet框架中导入无线介质接口模块
import inet.visualizer.contract.IIntegratedVisualizer; //从inet框架中导入集成可视化接口模块network WirelessA // 定义一个WirelessA的网络模型
{// 参数定义parameters: @display("bgb=650,500;bgg=100,1,grey95"); @figure[title](type=label; pos=0,-1; anchor=sw; color=darkblue);@figure[rcvdPkText](type=indicatorText; pos=380,20; anchor=w; font=,18; textFormat="packets received: %g"; initialValue=0);@statistic[packetReceived](source=hostB.app[0].packetReceived; record=figure(count); targetFigure=rcvdPkText);submodules:visualizer: <default(firstAvailableOrEmpty("IntegratedCanvasVisualizer"))> like IIntegratedVisualizer if typename != "" {@display("p=580,125");}configurator: Ipv4NetworkConfigurator {@display("p=580,200");}// 无线介质,使用 RadioMedium 作为无线通信的物理介质radioMedium: RadioMedium {@display("p=580,275");}// 主机 A,使用 WirelessHost 作为无线网络节点hostA: <default("WirelessHost")> like INetworkNode {@display("p=50,325"); // 主机 A 在画布上的位置}// 主机 B,使用 WirelessHost 作为无线网络节点hostB: <default("WirelessHost")> like INetworkNode {@display("p=450,325"); // 主机 B 在画布上的位置}
}

对于该仿真模型的描述

仿真背景
  • 该模型包含一个500x650米的运动场,两个主机相隔400米。(这个距离将在后面的步骤中变得相关。)这些数字是通过显示字符串设置的。
  • 除了主机之外,网络中存在的模块负责诸如可视化、配置IP层和模拟物理无线电信道等任务。
主机
  • 在INET框架中,主机通常是由StandardHost的NED类型来表示,这是一个用于TCP/IP主机的通用模板。它包含了像TCP、UDP和IP这样的协议组件,用于插入应用模型的插槽,以及各种网络接口(NICs)。
  • 在INET中,StandardHost有一些变体,例如,WirelessHost基本上是一个为无线场景预配置的StandardHost
  • 在这个NED文件中,主机的类型是参数化的(通过hostType参数和INetworkNode模块接口定义)。这样做是为了在后面的步骤中我们可以用不同的NED类型替换主机。这里的实际NED类型是WirelessHost(在NED文件顶部附近给出),后面的步骤将使用omnetpp.ini覆盖这个设置。
地址分配
  • IP地址由一个Ipv4NetworkConfigurator模块分配给主机,该模块在网络中显示为配置器子模块。主机还需要知道彼此的MAC地址才能通信,在这个模型中,这是通过为每个主机使用GlobalArp模块而不是真实的ARP来处理的。
流量模型
  • 在这个模型中,主机A生成UDP数据包,由主机B接收。为此,主机A被配置为包含一个UdpBasicApp模块,该模块以平均12毫秒的指数分布随机间隔生成1000字节的UDP消息,因此该应用程序将生成100千字节/秒(800千比特/秒)的UDP流量,不包括协议开销。主机B包含一个UdpSink应用程序,它只丢弃接收到的数据包。
  • 该模型还显示了主机B接收的数据包数量,文本由@figure[rcvdPkText]行添加,随后的行会在仿真期间更新该数字。
物理层模型
  • INET中的所有无线仿真都需要一个无线介质模块。这个模块代表了通信发生的共享物理介质。它负责信号传播、衰减、干扰和其他物理现象。
  • INET能够以不同的细节层次模拟无线物理层,通过不同的无线介质模块实现。在这个步骤中,使用了UnitDiskRadioMedium,这是最简单的模型。它实现了一种单元磁盘无线电的变体,意味着像信号衰减这样的物理现象被忽略了,通信范围简单地以米为单位指定。在范围内的传输总是正确接收,除非发生碰撞。可选模拟碰撞(重叠传输导致接收失败)和干扰范围(一个范围,信号不能正确接收,但仍然与其他信号发生冲突导致它们的接收失败)。

注意:这种物理层的模型与现实几乎没有对应关系。但是,它在仿真中有其用途。它的简单性和可预测性在物理层现实建模不是主要关注点的场景中是一种优势,例如在模拟自组织路由协议时。使用UnitDiskRadioMedium的仿真也比更现实的模型运行得更快,因为计算成本低。

  • 在主机中,网络接口卡由NIC模块表示。无线电是无线NIC模块的一部分。有各种无线电模块,必须始终使用与介质模块兼容的一个。在这个步骤中,主机包含的GenericUnitDiskRadio是AckingWirelessInterface中的一部分。
  • 在这个模型中,我们如下配置所选的物理层模型(UnitDiskRadioMedium和GenericUnitDiskRadio),通信范围设置为500米,将由于碰撞导致的分组丢失(在这个模型中称为“干扰”)的模拟功能关闭,形成独立的双向通信信道。无线电数据速率设置为1 Mbps,这些值在omnetpp.ini中通过适当的模块的communicationRange、ignoreInterference和bitrate参数进行设置。
MAC层
  • 网络接口卡的模块也包含L2层的协议,比如数据链路层的协议。AckingWirelessInterface中的MAC协议是可配置的,默认选择是MultipleAccessMac。MultipleAccessMac实现了一个简单的MAC层,它只提供封装/解封装,但没有真正的介质访问协议。实际上几乎没有介质访问控制:只要前一个数据包完成了传输,数据包就会立即传输。MultipleAccessMac还包含一个可选的带外确认机制,我们这里将其关闭。

网络模型配置

[Config Wireless01]
description = Two hosts communicating wirelessly
network = WirelessA
#record-eventlog = true
sim-time-limit = 20s
record-eventlog = true*.radioMedium.signalAnalogRepresentation = "unitDisk"
*.host*.ipv4.arp.typename = "GlobalArp"*.hostA.numApps = 1
*.hostA.app[0].typename = "UdpBasicApp"
*.hostA.app[0].destAddresses = "hostB"
*.hostA.app[0].destPort = 5000
*.hostA.app[0].messageLength = 1000B
*.hostA.app[0].sendInterval = exponential(12ms)
*.hostA.app[0].packetName = "UDPData"*.hostB.numApps = 1
*.hostB.app[0].typename = "UdpSink"
*.hostB.app[0].localPort = 5000*.host*.wlan[0].typename = "AckingWirelessInterface"
*.host*.wlan[0].mac.useAck = false
*.host*.wlan[0].mac.fullDuplex = false
*.host*.wlan[0].radio.signalAnalogRepresentation = "unitDisk"
*.host*.wlan[0].radio.transmitter.analogModel.communicationRange = 500m
*.host*.wlan[0].radio.receiver.ignoreInterference = true
*.host*.wlan[0].mac.headerLength = 23B*.host*.**.bitrate = 1Mbps

仿真运行

当我们运行仿真时,主机A的UdpBasicApp在随机间隔生成UDP数据包。这些数据包通过UDP和IPv4发送到网络接口进行传输。网络接口将数据包存储在缓冲区队列中,并在可以时立即传输它们。只要网络接口的发送队列中有数据包,数据包就会连续进行传输。

这些事件可以在OMNeT++的Qtenv仿真GUI中进行跟踪。以下图片是从Qtenv捕获的,显示了仿真期间主机A的内部。可以看到一个UDP数据包从udpApp子模块发送下来,穿过中间的协议层,并由wlan接口传输。
图片11
下面这个仿真显示了两台主机通过omnet++默认的消息进行通信的动画
在这里插入图片描述
当仿真在t=25s时结束时,数据包计数器显示大约发送了2000个数据包。一个包含开销的数据包是1028字节,这意味着传输速率大约是660 kbps。

这就是新建一个基于INET框架的工程的过程,下一篇继续更新INET框架相关的仿真学习,还是调试相关的东西,我再想想。

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

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

相关文章

深入理解计算机系统--计算机系统漫游

对于一段最基础代码的文件hello.c&#xff0c;解释程序的运行 #include <stdio.h>int main() {printf ( "Hello, world\n") ;return 0; }1.1、信息就是位上下文 源程序是由值 0 和 1 组成的位&#xff08;比特&#xff09;序列&#xff0c;8 个位被组织成一组…

安防监控摄像头图传模组,1公里WiFi无线传输方案,监控新科技

在数字化浪潮汹涌的今天&#xff0c;安防监控领域也迎来了技术革新的春风。今天&#xff0c;我们就来聊聊这一领域的产品——摄像头图传模组&#xff0c;以及它如何借助飞睿智能1公里WiFi无线传输技术&#xff0c;为安防监控带来未有的便利与高效。 一、安防监控的新篇章 随着…

mysql--基本查询

目录 搞定mysql--CURD操作&#xff0c;细节比较多&#xff0c;不难&#xff0c;贵在多多练 1、Create--创建 &#xff08;1&#xff09;单行插入 / 全列插入 &#xff08;2&#xff09;插入否则替换 &#xff08;3&#xff09;替换 2、Retuieve--select 1&#xff09;全…

FreeRTOS - 软件定时器

在学习FreeRTOS过程中&#xff0c;结合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源&#xff0c;整理了该篇文章。如有内容理解不正确之处&#xff0c;欢迎大家指出&#xff0c;共同进步。 1. 软件定时器 软件定时器也可以完成两类事情…

JDK-23与JavaFX的安装

一、JDK-23的安装 1.下载 JDK-23 官网直接下载&#xff0c;页面下如图&#xff1a; 2.安装 JDK-23 2.1、解压下载的文件 找到下载的 ZIP 文件&#xff0c;右键点击并选择“解压到指定文件夹”&#xff0c;将其解压缩到您希望的目录&#xff0c;例如 C:\Program Files\Java\…

多进程思维导图

1> 思维导图 2> 使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;两个进程同时进行&#xff08;君子作业&#xff09; #include <myhead.h> typedef struct sockaddr_in addr_in_t; typedef struct sockaddr…

毕业设计选题:基于django+vue的个人博客系统设计与开发

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 博主管理 博客文章管理 博文排行管理 博文打赏管理 博文…

Spring 的依赖注入的最常见方式

在 Spring 中&#xff0c;依赖注入的方式有多种选择。下面我们来逐一分析它们的特点、适用场景和注意事项&#xff1a; 1. 构造函数注入 构造函数注入要求在对象创建时提供所有依赖。这种方式确保依赖在对象创建后不可变&#xff0c;特别适合必须强制存在的依赖。所有依赖在对…

JavaWeb 22.Node.js_简介和安装

有时候&#xff0c;后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境&#xff0c;可以使 JavaScript 运行在服务器端。使用 Node.js&#xff0c;可以方便地开发服务器端应用程序&#xff0c;如 Web 应用、API、后端服务&a…

Python 工具库每日推荐 【FastAPI】

文章目录 引言Web 框架的重要性今日推荐:FastAPI Web 框架主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:构建一个简单的博客 API案例分析高级特性依赖注入系统后台任务扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式…

Transformer图解以及相关的概念

前言 transformer是目前NLP甚至是整个深度学习领域不能不提到的框架&#xff0c;同时大部分LLM也是使用其进行训练生成模型&#xff0c;所以transformer几乎是目前每一个机器人开发者或者人工智能开发者不能越过的一个框架。接下来本文将从顶层往下去一步步掀开transformer的面…

asp.net Core 自定义中间件

内联中间件 中间件转移到类中 推荐中间件通过IApplicationBuilder 公开中间件 使用扩展方法 调用中间件 含有依赖项的 》》》中间件 参考资料

中企通信赋能中信戴卡入选工信部颁发的2023年工业互联网试点示范名单

2024年10月17日&#xff0c;北京-随着工业互联网的迅猛发展&#xff0c;网络安全已成为国家关注的重点议题之一。日前&#xff0c;工业和信息化部&#xff08;工信部&#xff09;公布了2023年工业互联网试点示范名单&#xff0c;中企网络通信技术有限公司&#xff08;简称“中企…

读数据工程之道:设计和构建健壮的数据系统12开源软件

1. 开源软件 1.1. 开源软件(Open Source Software&#xff0c;OSS)是一种软件发行模式&#xff0c;在这种模式下&#xff0c;软件和底层代码库通常在特定的许可条款下可供普遍开发者使用 1.2. 社区管理的开源软件 1.2.1. 大部分开源软件项目…

【Qt】信号和槽——信号和槽的概念、信号和槽的使用、信号和槽的优缺点、自定义信号和槽、信号和槽的断开

文章目录 Qt1. 信号和槽的概念2. 信号和槽的使用3. 信号和槽的优缺点4. 自定义信号和槽5. 信号和槽的断开 Qt 1. 信号和槽的概念 信号是什么&#xff1a; 在Linux中&#xff0c;我们知道信号是一种异步的事件通知机制&#xff0c;用于通知进程某个事件已经发生。它是进程间通信…

MOE论文详解(4)-GLaM

2022年google在GShard之后发表另一篇跟MoE相关的paper, 论文名为GLaM (Generalist Language Model), 最大的GLaM模型有1.2 trillion参数, 比GPT-3大7倍, 但成本只有GPT-3的1/3, 同时效果也超过GPT-3. 以下是两者的对比: 跟之前模型对比如下, 跟GShard和Switch-C相比, GLaM是第一…

opcode从零开始

opcode从零开始 参考资料: Intel 64 and IA-32 ArchitecturesSoftware Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4() Intel64和IA-32架构软件开发人员手册组合卷&#xff1a;1,2a, 2B, 2C, 2D, 3A, 3B, 3C, 3D&#xff0c;和4 罗聪–c…

wordart.top - 轻松创建令人惊叹的文字云!

轻松创建令人惊叹的文字云/词云图&#xff01;适合营销人员、教育工作者、数据爱好者、创意人员、商务人士、活动策划者和社交媒体专家等多种用户群体。支持海量模版库、自定义模板、文本快速提取、精准关键字调整、词云Gif动图制作、词云视频制作、图片一键分享及数据轻松导入…

网盘如何拉新方法教程

网盘拉新是指通过各种推广方式吸引新用户注册和使用网盘服务的过程。以下是对网盘拉新的详细解释&#xff1a; 一、网盘拉新的背景与意义 背景&#xff1a;随着互联网的发展&#xff0c;网盘作为一种基于云计算技术的存储服务&#xff0c;因其便捷性和高效性而备受欢迎。为了…

Linux debian 系桌面系统安装软件方式介绍

debian 系软件的安装方式多种多样&#xff0c;但对于不想花太多时间配置各种环境和依赖的用户来说&#xff0c;建议直接使用“新立得包管理器”安装&#xff0c;既方便又直观。 本文将以常用软件为例&#xff0c;介绍常用的几种软件安装方式。 1. 使用新立得包管理器安装&…