我们先来了解一下Veins是什么。
Veins是一个开源的车联网模拟仿真框架,它为车联网络集成了一系列仿真模型。这些模型在与车辆交通状况模拟器(SUMO)交互时运行在事件网络模拟器(OMNeT++)之上。Veins构建了一个模型框架,使得面向特定仿真模型的代码编程可以更加容易。该框架意味着Veins是面向特定仿真模型的代码编程,使用者所写的代码只是利用仿真来评估具体应用场景的表现。
Veins是一款用于车载移动环境下无线通信仿真的开源框架,其对于车载无线网的底层结构,如物理层、MAC层等基于802.11p协议已基本开发完善,因此在此基础上进行二次开发,如改进MAC层协议或者路由协议等研究都是非常便携的。甚至如果是进行应用层上的研究,如车联网环境下的车辆自动驾驶、编队行驶、路径规划、信号灯区域协调等则更加方便,因为底层的结构可以直接使用,不必再浪费时间精力在这些并不是需要主要研究但却又对仿真结果影响重大的部分。
Veins包含了大量的仿真模型以适应更广泛的车辆网络,这些模型可以用来构建一个广泛的、丰富内容仿真的车辆网络。

一句话概括来说,就是开源软件 SUMO 实现道路交通环境的模拟,具体包括仿真的路网环境、车辆运行等信息;OMNeT++实现通信网络的模拟和仿真;Veins 在 SUMO 和 OMNeT++的基础上构建了车联网的通信仿真框架。
官网下载链接:http://veins.car2x.org/download/
推荐下载这个,不用再额外配omnet++和sumo的环境了。这个就是整体的能够跑的环境。




大概的代码如下所示,接下来我们将按照功能来区分讲解。

基本参数的代码如下图所示。


在OMNET++中,注释是一种用于在仿真结果中添加额外信息的机制。注释可以包含文本、图形、表格等形式的附加信息,以帮助理解仿真结果。
在上述代码中,*.annotations.draw = true指示OMNET++在仿真过程中将所有的注释绘制出来。通过将该值设置为true,注释将在仿真结果中以图形形式呈现,以提供更直观的视觉效果。这对于分析和理解仿真结果非常有用,因为它可以帮助用户更好地理解网络行为和性能。
在OMNET++中,这段代码的意思是,从名为"config.xml"的XML文件中获取"SimpleObstacleShadowing"类型的模拟模型(AnalogueModel)的"obstacles"属性值,并将其应用于当前对象(即当前正在被配置的对象)的障碍物(obstacles)属性。
具体来说,xmldoc(“config.xml”, “//AnalogueModel[@type=‘SimpleObstacleShadowing’]/obstacles”)这行代码是在读取名为"config.xml"的XML文件,并使用XPath表达式"//AnalogueModel[@type=‘SimpleObstacleShadowing’]/obstacles"来选择符合条件的元素。这意味着它选择的是所有类型为"SimpleObstacleShadowing"的模拟模型(AnalogueModel)中的"obstacles"属性。
然后,*.obstacles.obstacles = xmldoc(“config.xml”, “//AnalogueModel[@type=‘SimpleObstacleShadowing’]/obstacles”)这行代码将获取到的值赋给当前对象的"obstacles"属性。这使得当前对象的障碍物配置与"SimpleObstacleShadowing"类型的模拟模型中的障碍物配置保持一致。
通过这样的配置,用户可以方便地根据指定的模拟模型配置对象的属性,从而实现灵活的网络模拟。
TraCIScenarioManager是用于管理和控制TraCI(Traffic Control Interface)仿真场景的模块。TraCI是一种用于仿真城市交通流量的接口,通过它可以从外部程序中控制和获取仿真场景的状态和参数。
以下是每行代码的解释:
对RSUExampleScnario.ned中的路侧单元ned中的参数做出设置。其中最重要的就是applType,它指定了RSU的应用层,也就是RSU会做什么。其实RSU也是一个ned文件,比network级低,它是由另外几个更低级的ned组成的,包括作为应用层的ned(appl),作为MAC层的ned(nic),作为移动驱动的ned(mobility)。
applType指定的就是应用层的ned,而应用层ned的功能又由其同名且在同一个文件夹的C++文件定义,这样RSU的功能也就确定了,做应用层研究的要改变的就是这个应用层的ned与对应的C++文件。
至于后面那些参数都是对于应用层ned中的一些参数做出设置,如.rsu[*].appl.beaconUserPriority = 7就是令所有RSU应用层的信标优先级为7。

首先在车联网的Veins框架中,RSU代表路侧单元(Road Side Unit)。路侧单元是一种设备,安装在路侧,用于在V2X通信中与车载单元(On Board Unit, OBU)进行通信。
知道了RSU的意思,我们就可以开始入手这个RSU SETTINGS代码了。
*.rsu[0].mobility.x = 5500:这行代码将第一个"rsu"模块的移动性属性(mobility)的x坐标设置为5500。这可能表示该模块在二维空间中的水平位置。
*.rsu[0].mobility.y = 7000:这行代码将第一个"rsu"模块的移动性属性的y坐标设置为7000。这可能表示该模块在二维空间中的垂直位置。
*.rsu[0].mobility.z = 3:这行代码将第一个"rsu"模块的移动性属性的z坐标设置为3。这可能表示该模块在三维空间中的某一维度(比如高度)的位置。
*.rsu[1].mobility.x = 6500:这行代码将第二个"rsu"模块的移动性属性的x坐标设置为6500。
*.rsu[1].mobility.y = 5850:这行代码将第二个"rsu"模块的移动性属性的y坐标设置为5850。
*.rsu[1].mobility.z = 3:这行代码将第二个"rsu"模块的移动性属性的z坐标设置为3。
接下来的几行代码是针对所有"rsu"模块的应用类型(applType)和一些应用级别的参数进行设置。
.rsu[].applType = “IoVSDemo”:这行代码将所有"rsu"模块的应用类型设置为"IoVSDemo"。
.rsu[].appl.headerLength = 80 bit:这行代码将所有"rsu"模块的应用级别的header长度设置为80 bit。
.rsu[].appl.sendBeacons = false:这行代码将所有"rsu"模块的应用级别的发送信标(beacon)参数设置为false,表示不发送信标。
.rsu[].appl.dataOnSch = false:这行代码将所有"rsu"模块的应用级别的数据在调度(dataOnSch)参数设置为false,表示不在调度上发送数据。
.rsu[].appl.beaconInterval = 1s:这行代码将所有"rsu"模块的应用级别的信标间隔(beaconInterval)设置为1秒。
.rsu[].appl.beaconUserPriority = 7:这行代码将所有"rsu"模块的应用级别的信标用户优先级(beaconUserPriority)设置为7。
.rsu[].appl.dataUserPriority = 5:这行代码将所有"rsu"模块的应用级别的数据用户优先级(dataUserPriority)设置为5。
.rsu[].nic.phy80211p.antennaOffsetZ = 0 m:这行代码将所有"rsu"模块的网络接口卡(nic)的物理层(phy80211p)的天线偏移(antennaOffsetZ)设置为0米。
在Veins车联网平台中,信标用户优先级(Beacon User Priority)和数据用户优先级(Data User Priority)是两个相关的概念,它们用于确定车辆在通信过程中的优先级。
在车联网中,信标(Beacon)是一种信息公告,它是由车辆或路侧单元(RSU)发送的特定消息。信标通常用于在一定范围内广播车辆的身份、位置和其他相关信息。信标的作用类似于一个标识符,它可以被其他车辆或RSU接收,从而提供关于周围车辆的实时信息。
信标通常是在特定的时间间隔内周期性地发送,以便其他车辆或RSU能够感知到附近车辆的存在和状态。在Veins车联网模拟框架中,信标被用于模拟车辆间的通信过程,以支持各种交通管理和安全应用。
信标传递阶段:在这个阶段,车辆或RSU通过DSRC技术向周围发送信标,信标包含了车辆的身份、位置等信息。其他车辆或RSU可以接收到这些信标,从而获取周围车辆的信息。信标传递阶段主要用于建立车辆间的通信连接,为后续的数据传输做准备。
数据传输阶段:在建立了通信连接之后,车辆或RSU可以通过DSRC技术进行数据传输。数据传输阶段主要用于车辆之间或车辆与RSU之间交换各种信息,例如交通状况、行驶速度、行驶方向等。这个阶段通常需要设置数据用户优先级,以确定哪些车辆可以优先发送数据。
消息传递阶段:除了实时的数据传输,车联网中还需要支持一些非实时的消息传递,例如紧急事件通知、交通公告等。消息传递阶段主要用于在较大的范围内广播这些消息,让所有车辆都能够接收到相关信息。
信标用户优先级和数据用户优先级是分别用于信标传递阶段和数据传输阶段的两个不同的参数。信标用户优先级用于确定哪些车辆可以发送信标,而数据用户优先级用于确定哪些车辆可以发送数据。通过设置不同的优先级,可以控制车辆在通信过程中的行为,从而实现更高效、更安全的通信。

11p specific parameters和NIC-Settings是两个不同的配置参数。
nic包含两个子ned(mac1609_4和phy80211p)。
11p specific parameters是与802.11p协议相关的参数,用于配置无线通信的特性。802.11p是一种无线通信标准,专门用于车辆网络(V2X通信),具有较高的传输速率和较低的延迟。这些参数包括调制方式、数据速率、信道带宽等,可以根据具体的应用场景进行调整。
NIC-Settings是指网络接口卡(NIC)的设置。在OMNeT++中,可以通过设置NIC参数来模拟不同类型和配置的网络接口卡。这些参数包括网络接口卡的类型、MAC地址、最大传输单元(MTU)等。通过配置NIC参数,可以模拟不同的网络环境和通信条件,以支持各种网络协议和仿真场景。
这里先介绍一下网卡的相关概念。
网卡,又称网络适配器或网卡适配器,是计算机中用于连接网络的硬件设备。它负责将计算机产生或接收的数据转换为适合在网络上传输的格式,并且能够通过物理介质(如以太网、无线电波等)与其他计算机或网络设备进行通信。
网卡主要分为有线网卡和无线网卡两种类型。有线网卡通常采用以太网协议,使用网线连接计算机与网络设备(如路由器、交换机等),传输以太网帧,实现数据的传输和通信。无线网卡则是用于无线网络连接的设备,通过无线信号与路由器等网络设备进行通信。
网卡工作在OSI模型中的第二层——数据链路层。
数据链路层是OSI模型中第二层,它负责将网络层传来的数据进行分帧,然后将分帧后的数据发送到物理层,以便在物理层上进行传输。网卡就是在数据链路层上工作的,它接收从物理层传来的数据,然后将数据进行解析和处理,最后将处理后的数据发送到网络层。
网卡的具体功能如下:
那么我们查看一下网卡NIC的相关代码:
可以看到这里有相关的ned文件。




“.node[].veinsmobility.x = 0”: “这行代码将所有节点的veinsmobility对象的x坐标设为0。”, “.node[].veinsmobility.y = 0”: “这行代码将所有节点的veinsmobility对象的y坐标设为0。”, “.node[].veinsmobility.z = 0”: “这行代码将所有节点的veinsmobility对象的z坐标设为0。”, “.node[].veinsmobility.setHostSpeed = false”: “这行代码将所有节点的veinsmobility对象的setHostSpeed属性设为false,意味着不会设置或更改主机速度。”, “*.node[0].veinsmobility.accidentCount = 1”: “这行代码将编号为0的节点的veinsmobility对象的accidentCount属性设为1,这可能代表该节点会发生一次事故。”, “.node[0].veinsmobility.accidentStart = 73s”: “这行代码将编号为0的节点的veinsmobility对象的accidentStart属性设为73秒,这可能代表事故开始的时间。”, “.node[*0].veinsmobility.accidentDuration = 50s”: “这行代码将编号为0的节点的veinsmobility对象的accidentDuration属性设为50秒,这可能代表事故的持续时间。”