开源库 INET wireless 示例

示例 1 两台主机无线通信

实验目的

创建一个包含 2 个主机的网络,其中一台主机向另一台主机发送 UDP 数据流。在实验过程尽量简化底层协议模型。官方示例保存在 inet4/tutorials/wireless/ 路径中。

实验原理

网络模型文件

本次实验的网络是一个包含 2 个主机的网络,对应的 NED 文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
network 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: <default("UnitDiskRadioMedium")> like IRadioMedium {
@display("p=580,275");
}
hostA: <default("WirelessHost")> like INetworkNode {
@display("p=50,325");
}
hostB: <default("WirelessHost")> like INetworkNode {
@display("p=450,325");
}
}

上述 NED 文件通过 @display() 方法定义了一个 $500 \times 600$ 米的仿真场景,两个主机的距离为 $450 - 50 = 400$ 米。除了主机之外,NED 文件还定义了可视化、配置 IP 层和对物理无线电信道建模等对象。

omnetpp.ini 文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[Config Wireless01]
description = Two hosts communicating wirelessly
network = WirelessA
sim-time-limit = 20s

*.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.transmitter.communicationRange = 500m
*.host*.wlan[0].radio.receiver.ignoreInterference = true
*.host*.wlan[0].mac.headerLength = 23B

*.host*.**.bitrate = 1Mbps

主机

在 INET 中,主机通常定义为 StandardHost NED 类型,这是 TCP/IP 主机的通用模板,包含 TCP、UDP 和 IP 等协议组件、用于插入应用程序模型的插槽以及各种网络接口 (NIC)。StandardHost 在实际应用中存在一些变体,例如上述 NED 文件中提到的 WirelessHost,它是为无线场景预配置的 StandardHost

主机的类型在上述 NED 文件中是通过 hostType 参数和 INetworkNode 网络模块接口定义的。这使得接下来的实验中可以用不同的 NED 类型替换主机。这里的 NED 实际类型是 WirelessHost,在后面的实验中将使用 omnetpp.ini 配置进行替代。

参考链接:

StandardHosthttps://doc.omnetpp.org/inet/api-current/neddoc/inet.node.inet.StandardHost.html

WirelessHosthttps://doc.omnetpp.org/inet/api-current/neddoc/inet.node.inet.WirelessHost.html

INetworkNodehttps://doc.omnetpp.org/inet/api-current/neddoc/inet.node.contract.INetworkNode.html

地址分配

IP 地址通过 Ipv4NetworkConfigurator 模块分配给主机,该模块在 NED 中的实例化对象为 configurator。此外,主机之间还需要知道彼此的 MAC 地址才能进行通信,在仿真模型中主要通过每个主机的 GlobalArp 模块代替现实中的 ARP 进行处理。

流量模型

在模型中,主机 B 需要接收主机 A 生成的 UDP 数据包。为此,在主机 A 内部配置一个 UdpBasicApp 模块,模块以指数分布的平均 12 秒随机间隔生成 1000 字节的 UDP 信息。也就是说,应用程序将为主机 A 生成一个 100 kbyte/s 的 UDP 流量。在 NED 文件中,主机 B 还包含了一个 UdpSink 应用程序丢弃接收到的数据包。

参考链接:

UdpSink:https://doc.omnetpp.org/inet/api-current/neddoc/inet.applications.udpapp.UdpSink.html

物理层建模

INET 中所有无线仿真都需要一个 radioMedium 模块。该模块代表进行通信的物理介质,负责考虑信号传播、衰减、干扰和其他物理现象。

INET 可以在各种细节层次上对无线物理层进行建模,通过不同的无线电介质模块实现。在该示例中使用最简单的模型 UnitDiskRadioMedium。该模型忽略了信号衰减等物理现象,通信范围以米为单位。

在此模型中,实验选择的物理层模型(UnitDiskRadioMediumUnitDiskRadio 设置如下:通信范围为 $500 m$ ,忽略干扰导致的数据包丢失问题;无线电数据速率设置为 $1 Mbps$。上述这些值都可以通过相应模块在 omnetpp.ini 文件中的 communicationRangeignoreInterferencebitrate 参数进行设置。

参考链接:

UnitDiskRadioMediumhttps://doc.omnetpp.org/inet/api-current/neddoc/inet.physicallayer.wireless.unitdisk.UnitDiskRadioMedium.html

UnitDiskRadio (https://doc.omnetpp.org/inet/api-current/neddoc/inet.physicallayer.wireless.unitdisk.UnitDiskRadio.html)

MAC 层

NIC 模块还包含 L2 层(数据链路层)协议。其中涉及 MAC 协议的接口 AckingWirelessInterface 是可配置的,默认值为 MultipleAccessMac.。MultipleAccessMac 实现了一个简单的 MAC 层协议,只提供封装/解封装功能而没有真正的媒体访问协议,即一旦前一个数据包传输完成,下一个数据包就会立刻开始传输。MultipleAccessMac 还包含一个可选的确认机制,在该实验中已被关闭。

实验结果

完成配置后进入 /inet4/ 文件夹。与 omnetpp 的操作类似,先使用命令

1
. setenv

启动环境,再输入命令

1
opp_makemake

编译产生 Makefile 文件,接着输入命令 make 即可产生可执行文件 inet4

完成构建后,前往示例所在文件夹 /inet4/tutorials/wireless,输入命令

1
inet

即可开始仿真。得到的仿真结果如下所示:

wireless1仿真结果

多个网络时,可以通过

1
inet -c wireless01

指定对应的配置进行编译。

示例 2 增加动画

可视化示例,略过。

示例 3 缩短通信范围,增加主机

增加了三个无线节点,并缩小了通信范围,使我们原来的两台主机无法直接相互联系。配置文件的修改如下:

1
2
*.host*.wlan[0].radio.transmitter.communicationRange = 250m
*.hostR1.wlan[0].radio.displayCommunicationRange = true

此外,NED 文件使用了继承方式继承了第一步的网络结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
network WirelessB extends WirelessA
{
submodules:
hostR1: <default("WirelessHost")> like INetworkNode {
@display("p=250,300");
}
hostR2: <default("WirelessHost")> like INetworkNode {
@display("p=150,450");
}
hostR3: <default("WirelessHost")> like INetworkNode {
@display("p=350,450");
}
}

示例 4 静态路由

INET 框架中的静态配置通常由 configurator 模块完成。静态 IPv4 的配置包括地址分配和添加路由,通常使用 Ipv4NetworkConfigurator 模块完成。该实验中已经有这个模块的一个实例,即 configurator 子模块。可以使用 XML 规范和一些附加参数来配置配置器。XML 规范在 .ini 文件中作为字符串常量提供:

1
2
3
*.configurator.config = xml("<config><interface hosts='**' address='10.0.0.x' netmask='255.255.255.0'/><autoroute metric='errorRate'/></config>")
*.configurator.optimizeRoutes = false
*.host*.ipv4.routingTable.netmaskRoutes = ""

在本实验中通过 XML 让配置器分配 10.0.0.x 范围内的 IP 地址,并根据估计的节点之间链路的数据包错误率创建路由.。配置器将无线网络视为一个完整的图模型,错误率高的链路成本高,错误率低的链路成本低。形成的路由以使其错误成本最小化。

参考资料:

Ipv4NetworkConfiguratorhttps://doc.omnetpp.org/inet/api-current/neddoc/inet.networklayer.configurator.ipv4.Ipv4NetworkConfigurator.html

示例 5-8 物理层问题

暂时忽略

示例 9 节点移动

在 INET 框架中,节点移动性由mobility 模块的子模块处理。INET 定义了几种可以插入主机的移动模块类型:运动轨迹可以是确定性的(例如直线、矩形或圆形)、概率性的(例如随机航路点)、脚本化的(例如 LOGO 脚本)或轨迹驱动的,以及个人和团体流动模型。

在这里,我们将 LinearMobility 安装到中间节点中。 LinearMobility 实现沿线的运动,其中方向和速度是待定参数。将节点配置为以 12 m/s 的速度向北移动,如下所示:

1
2
3
4
5
6
7
8
9
[Config Wireless09]
description = Configuring node movements
extends = Wireless08

*.hostR*.mobility.typename = "LinearMobility"
*.hostR*.mobility.speed = 12mps
*.hostR*.mobility.initialMovementHeading = 270deg

*.host*.wlan[0].queue.packetCapacity = 10

此外,实验将队列长度限制为 10 个数据包。这使得网络可以对节点移动引起的拓扑变化做出更快的反应,因为队列不会被旧数据包堵塞。然而,由于丢包,我们预计主机 B 收到的数据包的序列号将不再是连续的。

参考资料:

LinearMobilityhttps://doc.omnetpp.org/inet/api-current/neddoc/inet.mobility.single.LinearMobility.html

示例 10 AD-HOC 路由

在该实验中,将主机更改为 AodvRouter 的实例。AodvRouter 类似于 WirelessHost,但在其基础上添加了一个 AodvRouting 子模块,将每个节点变成一个 AODV 路由器:

1
2
3
4
5
description = Configuring ad-hoc routing (AODV)
extends = Wireless09
*.configurator.addStaticRoutes = false
*.host*.typename = "AodvRouter"
*.hostB.wlan[0].radio.displayCommunicationRange = true

AODV 代表 Ad hoc On-Demand Distance Vector。在 AODV 中,路线根据需求建立。一旦建立,只要存在需求就会一直保持路由。

AODV 定义的消息类型有路由请求 (RREQ)、路由回复 (RREP) 和路由错误 (RERR)。在 AODV 中,网络静默直到需要连接。此时,需要连接的网络节点会广播连接请求。其他 AODV 节点转发此消息并记录他们从哪个节点听到该消息,从而创建大量返回需要节点的临时路由。当一个节点接收到这样的消息并且已经有到所需节点的路由时,它会通过临时路由将消息向后发送到请求节点。然后,有需要的节点开始使用通过其他节点的跳数最少的路由。路由表中未使用的条目在一段时间后被回收。

参考资料:

AodvRouterhttps://doc.omnetpp.org/inet/api-current/neddoc/inet.node.aodv.AodvRouter.html

示例 11 给环境添加障碍

在 INET 中,障碍物作为 PhysicalEnvironment 模块的一部分进行管理,因此需要在网络添加一个实例:

1
2
3
4
submodules:
physicalEnvironment: PhysicalEnvironment {
@display("p=580,425");
}

障碍在 walls.xml XML 文件中描述。障碍物由其形状、位置、方向和材料定义。它也可以有一个名称,并且可以定义它应该如何呈现(颜色、线宽、不透明度等)。XML 格式允许人们使用预定义的形状,如长方体、棱柱、多面体或球体,还可以定义新的可以重复用于任何数量的障碍的形状。材料也是类似的:有预定义的材料,如混凝土、砖、木头、玻璃、森林,还可以定义新材料。材料由其物理特性定义,例如电阻率、相对介电常数和相对磁导率。这些属性用于计算介电损耗角正切、折射率和信号传播速度,并最终用于计算信号损耗。

参考资料:

PhysicalEnvironmenthttps://doc.omnetpp.org/inet/api-current/neddoc/inet.environment.common.PhysicalEnvironment.html

示例 12 增加调制和信道建模

该示例中使用 ApskScalarRadio :APSK(幅度和相移键控)调制方案对无线电进行建模。默认情况下,它使用 BPSK,但也可以配置 QPSK、QAM-16、QAM-64、QAM-256 和其他几种调制方式。(调制是无线电发射器组件的参数。)此外,在无线信道方面,ApskScalarRadio 还具有插入各种传播模型、路径损耗模型、障碍物损耗模型、模拟模型和背景噪声模型的“插槽”。

接收器的物理参数也很重要。实验需要配置以下接收器参数:

  • 灵敏度 [dBm]:如果信号功率低于此阈值,则无法接收(即接收器无法从信道忙状态进入接收状态)
  • 能量检测阈值 [dBm]:如果接收功率低于此阈值,未检测到信号并且检测到信道为空(这对于 CSMA 的“载波侦听”部分很重要)
  • SNIR 阈值 [dB]:如果 SNIR 低于此阈值,则接收不成功

配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Config Wireless12]
description = Changing to a more realistic radio model
extends = Wireless11

*.radioMedium.typename = "ApskScalarRadioMedium"
*.radioMedium.backgroundNoise.power = -90dBm
*.radioMedium.mediumLimitCache.centerFrequency = 2GHz

*.host*.wlan[0].radio.typename = "ApskScalarRadio"
*.host*.wlan[0].radio.centerFrequency = 2GHz
*.host*.wlan[0].radio.bandwidth = 2MHz
*.host*.wlan[0].radio.transmitter.power = 1.4mW
*.host*.wlan[0].radio.transmitter.preambleDuration = 10us
*.host*.wlan[0].radio.transmitter.headerLength = 8B
*.host*.wlan[0].radio.receiver.sensitivity = -85dBm
*.host*.wlan[0].radio.receiver.energyDetection = -85dBm
*.host*.wlan[0].radio.receiver.snirThreshold = 4dB

*.hostR1.wlan[*].radio.bitErrorRate.result-recording-modes = default,+vector

参考资料:

ApskScalarRadiohttps://doc.omnetpp.org/inet/api-current/neddoc/inet.physicallayer.wireless.apsk.packetlevel.ApskScalarRadio.html

示例 13 路径损耗模型

与地面反射、障碍物反射衍射模型有关。安装两射线地面反射模型只需将 ApskScalarRadiopathLossType 参数从默认的 FreeSpacePathLoss 更改为 TwoRayGroundReflection 即可。(其他选项包括 RayleighFadingRicianFadingLogNormalShadowing 等。)

参考资料:

TwoRayGroundReflectionhttps://doc.omnetpp.org/inet/api-current/neddoc/inet.physicallayer.wireless.common.pathloss.TwoRayGroundReflection.html

RayleighFadinghttps://doc.omnetpp.org/inet/api-current/neddoc/inet.physicallayer.wireless.common.pathloss.RayleighFading.html

RicianFadinghttps://doc.omnetpp.org/inet/api-current/neddoc/inet.physicallayer.wireless.common.pathloss.RicianFading.html

LogNormalShadowinghttps://doc.omnetpp.org/inet/api-current/neddoc/inet.physicallayer.wireless.common.pathloss.LogNormalShadowing.html

示例 14 天线增益

在前面的示例中,假设天线为各向同性天线,增益为 1 (0dB)。可通过下述方式修改天线增益:

1
2
*.host*.wlan[0].radio.antenna.typename = "ConstantGainAntenna"
*.host*.wlan[0].radio.antenna.gain = 3dB

其中,ConstantGainAntenna 是一种对在与仿真相关的方向上具有恒定增益的天线进行建模,而不管这种天线在现实生活中如何实现的抽象。

参考资料:

ConstantGainAntennahttps://doc.omnetpp.org/inet/api-current/neddoc/inet.physicallayer.wireless.common.antenna.ConstantGainAntenna.html

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lgc0208@foxmail.com
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信