使用Simu5G实现车联网V2X通信过程(两个简单的示例)

1. Simu5G简介

  Simu5G官网(http://simu5g.org/index.html)介绍其是一个基于OMNeT++和INET的网络仿真模拟器,可以模拟基于5G New Radio协议的V2X通信。Simu5G使用OMNeT++的仿真模块,在车联网相关的5G网络仿真中也会调用Veins的相关模块。但是,由于协议不同,Simu5G和Veins还是有很多不同之处。如Simu5G中的节点模块与Veins中不同,下图左右分别是Simu5G和Veins中的车辆节点模块:
Simu5G中的车辆模块结构Veins中的车辆模块结构
另外,Simu5G和Veins中应用层的消息下发方式也不同,Veins通过指定的Output Gate(LowerLayerOut)向下层传输消息,而Simu5G指定IP和端口号并使用socket通信。
  这篇博文从使用的角度出发,在Simu5G框架上实现V2S(Vehicle-to-Server)和V2V(Vehicle-to-Vehicle)通信过程。为了简明的展示Simu5G的使用过程,我将V2S和V2V通信过程分别用两个示例进行说明。示例的代码我一并上传(链接),大家配合代码放心食用,我在这里就不贴代码了。
  建议下载虚拟机版本:http://simu5g.org/install.html#download_vm

2. V2S通信

  在实现的过程中,我们可以参考Simu5G > simulations > NR > Cars仿真示例中的相关配置和代码实现。在Simu5G > simulations > NR >目录下新建一个v2s仿真示例,将Simu5G > simulations > NR > Cars下的地图等文件复制过来。随后完成配置文件(omnetpp.ini),最后完成应用层代码实现。

2.1 配置文件(omnetpp.ini)

  [General]部分的配置和Cars中的一样,不用修改,只需修改一下场景的路径:

network = simu5g.simulations.NR.v2s.Highway

在这里插入图片描述在这里插入图片描述
   上图配置v2s场景下的应用层。Server可以配置多个应用层,每个应用层可以匹配不同的端口给不同节点提供服务。其中第99行指定server的应用层数量;第101行指定应用层模块;第102行指定每个应用层的端口号,ancestorIndex是每个app层的索引,此例中的端口号即3000…3499,每一个应用层对应一个端口号。第101行和第105行分别指定服务器和车辆的应用层模块;106行表示消息发送的目标端口号(即服务器对应应用层的local port);107行表示目标地址,地址写“server”就行。

2.2 V2S应用层模块实现

  随后实现发送和接收者的应用层,在Simu5G > src > apps下新建一个v2s目录,在该目录下实现车辆发送者的应用层VehicleSender和Server接收者的应用层ServerReceiver。
  首先为应用层VehicleSender新建一个.ned文件,可以参考其他的.ned文件,大致如下,其中一些参数可以换成自己需要的。可以看到这个应用层模块的gates是socketOut和socketIn,而Veins中应该是Lower/Upper Layer Out/In,这有些不同,导致发送消息的方式也有些许区别,见下文。
在这里插入图片描述
  接着实现VehicleSender,在Simu5G > src > apps > v2s目录下新建VehicleSender.cc和VehicleSender.h文件,模板也可以参考其他模块的实现类。头文件与veins中的相比变化不大,仅多了一些端口和地址的声明,如下图:
在这里插入图片描述
注意:Simu5G中应用层头文件中一个numInitStages函数的声明不能删除,涉及到多级初始化过程,删除会导致无法初始化应用层:
在这里插入图片描述
  在.cc文件中,结构和Veins的差不多,有initialize、handleMessage、finish等函数。需要注意的有以下几点:

  1. 初始化函数中会获取一些地址和端口的配置信息(在.ned或.ini中配置的)
    在这里插入图片描述
      对于明确的目的地址,如destAddress = "car[62]"或destAddress = "server"等,可以直接在初始化函数中获取目标地址。但是考虑到车辆会驶出场景,还是建议在发送消息之前指定IP地址和端口号,对于时变的目标地址也是如此。
    在这里插入图片描述
  2. Simu5G的应用层中不区分handleSelfMessage、handleLowerMessage和handleUpperMessage,所有消息都在handleMessage中处理,在该函数中需要区分自消息、下层消息、上层消息。可以通过消息的name和消息类型区分不同的消息。如处理自消息和下层消息:
    处理自消息
    处理下层消息
  3. 在消息发送之前,可以检查目标地址是否合规:
    在这里插入图片描述
  4. 发送消息时,需要将自己的消息(如此例中Beacon类型的beacon消息)附加在Packet类型的消息后面,随后指定目标的IP地址、端口,并通过socket将消息发送出去。周期性发送消息在处理完自消息(sendBeacon)之后再次schedule即可:
    注意:Beacon等消息的定义与Veins中一样,网络上可以搜索到相关博客教程。
    数据包的附加
    指定目标地址,发送消息
       应用层中消息发送的程序完成后无需处理节点内部的消息传输过程。接下来处理消息的接收过程,即实现ServerReceiver应用层。同样新建一个ServerReceiver.ned,再创建ServerReceiver.h和ServerReceiver.cc进行实现。同样需要注意的是,需要在一个handleMessage函数中同时处理自消息、下层消息和上层消息,而接收者主要处理来自下层消息:
    接收者处理来自下层的消息
      在V2S示例中,演示了一些消息车辆到服务器的数据上传过程,可以在仿真界面查看服务器的应用层输出:
    注意:仿真在第10s开始。
    搜索相关信息
    在这里插入图片描述

3 V2V通信

  V2V通信分为单播和广播,主要是要注意接收者/发送者的应用层指定问题和广播时Multicast Group 的设置问题。我们在在Simu5G > simulations > NR >目录下新建一个v2v目录配置仿真示例,并在Simu5G > src > apps > 目录下新建一个v2v目录实现我们的相关应用层。

3.1 应用层实现

  Omnetpp.ini文件中的[General]依然不做改动(只需修改仿真路径,与2.1所介绍的一样),接着在下面添加一个[configure v2v]配置,如下图。其中#97指定D2D模式;#109指定两个应用层,其中一个作为发送应用层,另一个为接收应用层。(为了便于演示,实例中仅安排一个车辆发送消息,一个车辆接收消息)。#113指定目标端口,与#117的接收者本地端口一致。
在这里插入图片描述
注意:如果你只想给每个车辆设置一个应用层,有些车辆的应用层用来实现消息的发送,有些用来实现消息的接收,那么只需要给不同车辆的app[0]指定不同的应用层即可(最好不要给同一个车辆的app[0]重复指定不同的应用层),可以参考cars示例中的配置
在这里插入图片描述
  在omnetpp.ini文件中[configure v2v]下方再添加一个[config v2vbroadcast]多播配置(这里命名成广播了,见谅)。注意应指定多播组的IP(#151),并指定发送者的目标地址为多播组的IP。同时端口号需要一致。
在这里插入图片描述
  接着在Simu5G > src > apps > v2v 目录下实现应用层,首先新建应用层的V2VVehicleSender.ned和V2VVehicleReceiver.ned模块文件,分别如下图所示(红色方框为多播的必要设置):
在这里插入图片描述
  随后实现V2VVehicleSender和V2VVehicleReceiver应用层,消息的发送过程与2.2介绍的v2s过程并无差别,就不再贴图介绍了。需要注意的是多播过程中的发送者/接收者需要在应用层initialize函数中多一个multicast group的设置,下图分别是发送者和接收者的相关设置:
在这里插入图片描述
在这里插入图片描述

3.2 仿真演示

注意:仿真在第10s开始,单播由car[30]发送,car[62]接收。多播由car[30]发送。

3.2.1 V2V单播仿真

  由于我们先前配置了两个仿真示例,在仿真界面中选择v2v仿真。仿真运行到特定时间后可以搜索查看发送者和接收者的输出,可以看到是car[30]的app[0]发送,由car[62]的app[1]接收。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.2 V2V多播仿真

  选择v2vbroadcast仿真示例,查看发送和接收消息的日志,多个应用层的消息可以通过过滤器选择特定的车辆节点的应用层进行展示,便于查看 :在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

4 总结

  Simu5G与Veins相比,在模块定义与实现、消息的交互与处理等方面非常相似。但是由于DSRC和5G协议的不同,Simu5G在通信模块的结构、IP地址与端口的配置、socket的绑定与消息的发送等方面与Veins存在明显差异。
  希望这两个小的示例可以帮助大家更好的理解Simu5G仿真平台,在此基础上可以更快的学习其他的示例,并能够顺利实现自己的网络仿真!!

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值