受博客 https://blog.csdn.net/PERSEUS_/article/details/105647598
的启发,学习之后,自己试着实现一个小例子:rsu广播自己的id等信息,车辆收到后将rsu的id记录下来。

一、创建msg消息

1 在路径veins/modules/application/traci/创建BeaconRSU.msg

cplusplus{{#import "veins/base/utils/Coord.h"
#import "veins/modules/utility/Consts80211p.h"
#include "veins/modules/messages/BaseFrame1609_4_m.h"
#include "veins/base/utils/SimpleAddress.h"}};namespace veins;class noncobject Coord;
class BaseFrame1609_4;packet BeaconRSU extends BaseFrame1609_4{//id of the originatorint RSUId = 0;Coord position[100];double beaconrate[100]; string myDemoData;Coord slotpos;simtime_t timestamp = 0;
}

2 build project后生成对应的.h和.cc文件

二、创建RSU的应用层实现类

在我的设定中,rsu用来发送消息,将原有的MyVeinsApp复制一份,重命名为MyVeinsAppRSU,在头文件中增加

cMessage* sendBeacon;

MyVeinsAppRSU.cc文件中,初始化函数中发送一个自消息

void MyVeinsAppRSU::initialize(int stage)
{DemoBaseApplLayer::initialize(stage);if (stage == 0) {sendBeacon = new cMessage("send Beacon");EV << "Initializing " << par("appName").stringValue() << std::endl;}else if (stage == 1) {if (sendBeacon->isScheduled()) {cancelEvent(sendBeacon);}scheduleAt(simTime()+5,sendBeacon);}
}

再重写一下handleSelfMsg函数

void MyVeinsAppRSU::handleSelfMsg(cMessage* msg)
{if (msg == sendBeacon) {BeaconRSU* rsuBeacon = new BeaconRSU();rsuBeacon->setRSUId(this->getParentModule()->getIndex());rsuBeacon->setMyDemoData("RSU message!!");
//          新建WSM,这是应用层和MAC层通信的消息BaseFrame1609_4* WSM = new BaseFrame1609_4();//把rsuBeacon封装在WSM中WSM->encapsulate(rsuBeacon);//设置WSM的基本信息populateWSM(WSM);send(WSM,lowerLayerOut);EV << "rsu send success" <<endl;if (simTime() < 2000) {scheduleAt(simTime()+1,sendBeacon);}return;}
}

这样,rsu就可以实现发送消息的功能了

三、创建车辆的应用层实现类

车辆用来接收rsu的消息,所以只用重写initialize和handleLowerMsg函数,继续将原有的MyVeinsApp复制一份,重命名为MyVeinsAppCar,头文件如下

#pragma once#include "veins/veins.h"
#include "veins/modules/application/ieee80211p/DemoBaseApplLayer.h"
#include "veins/modules/application/traci/RSUBeacon_m.h"using namespace omnetpp;namespace veins {class VEINS_API MyVeinsAppCar : public DemoBaseApplLayer {public:void initialize(int stage) override;void finish() override;protected:void onBSM(DemoSafetyMessage* bsm) override;void onWSM(BaseFrame1609_4* wsm) override;void onWSA(DemoServiceAdvertisment* wsa) override;void handleLowerMsg(cMessage* msg) override;void handleSelfMsg(cMessage* msg) override;void handlePositionUpdate(cObject* obj) override;cOutVector RSUIndex;int a;
};} // namespace veins

在MyVeinsAppCar.cc中,initialize函数如下,其中RSUIndex用来记录收到消息的rsu的id

void MyVeinsAppCar::initialize(int stage)
{DemoBaseApplLayer::initialize(stage);if (stage == 0) {EV << "Initializing " << par("appName").stringValue() << std::endl;int a = INT_MIN;}else if (stage == 1) {RSUIndex.setName("test");int a = INT_MIN;}
}

handleLowerMsg函数如下:

void MyVeinsAppCar::handleLowerMsg(cMessage* msg) {EV << "receive message  !!!" << endl;//消息传换成WSMBaseFrame1609_4* WSM = check_and_cast<BaseFrame1609_4*>(msg);//从WSM中解封数据包cPacket* enc = WSM->getEncapsulatedPacket();//数据包转换成BeaconRSUBeaconRSU* bc = dynamic_cast<BeaconRSU*>(enc);if(a!=bc->getRSUId()){RSUIndex.record(bc->getRSUId());a=bc->getRSUId();}EV << "my message = " <<bc->getMyDemoData()<<endl;EV <<"send message RSU id:" <<bc->getRSUId() << "  Receive successfully !!!!!!!!!!!" << endl;
}

四、在ini文件中修改配置信息

在ini文件中,进行如下修改

*.rsu[*].applType = "MyVeinsAppRSU"
*.node[*].applType = "MyVeinsAppCar"

五、结果

运行之后,就可以观察到车辆收到消息,如下图所示

veins中实现rsu与车辆通信相关推荐

  1. vue2.0s中eventBus实现兄弟组件通信

    在vue1.0中,组件之间的通信主要通过vm.$dispatch沿着父链向上传播和用vm.$broadcast向下广播来实现.然而在vue2.0中,已经废除了这种用法. vuex加入后,对组件之间的通 ...

  2. java 线程 condition_Java编程中实现Condition控制线程通信

    java中控制线程通信的方法 1.传统的方式:利用synchronized关键字来保证同步,结合wait(),notify(),notifyall()控制线程通信.不灵活. 2.利用condition ...

  3. [转帖]中美高速公路等车辆收费有何异同?

    [转帖]中美高速公路等车辆收费有何异同? 转载自:http://hi.baidu.com/%D1%94%D2y%D7%D3/blog/item/dbf1c8fd12765751d6887dad.htm ...

  4. STM32与中显串口屏的通信

    STM32与中显串口屏的通信 本文将简要介绍STM32单片机和武汉中显串口屏之间的通信实现过程.不过使用大彩.迪文这些公司的串口屏的同学也能参考一下,它们的通信协议好像一样. 注意:我代码用的ardu ...

  5. html多页面之间如何通信,html5中sharedWorker实现多页面通信代码示例

    本篇文章小编给大家分享一下html5中sharedWorker实现多页面通信代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 在没有登录浏览了一 ...

  6. 中移物联网onenet入门学习笔记2:中移物联的通信格式

    中移物联网onenet入门学习笔记2:中移物联的通信格式 中移物联网硬件接入协议:LWM2M协议,EDP协议,MQTT协议,HTTP协议,TCP透传,MODBUS协议,JT/T808协议,RCMP协议 ...

  7. 在两个TIA博途项目中组态PROFIBUS和PROFINET通信的具体方法

    在两个TIA博途项目中组态PROFIBUS和PROFINET通信的具体方法 为了在两个项目间实现S7-1200/S7-1500的通信,要为其中一个CPU创建GSDML文件,然后将其安装在TIA Por ...

  8. 考虑下行链路的蜂窝网络中存在多个D2D通信对和多个蜂窝用户,它们共享相同的频率资源并且蜂窝用户为主用户

    1.仿真预览 2.理论分析 整个仿真一定要有完整的链路结构,波束赋形按照参考要求设计外,其他模块都要有,但可以适当根据理论进行简化,重点是波束赋形部分的matlab程序编写.主要看这部分内容. 具体实 ...

  9. 自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)

    点云PCL免费知识星球,点云论文速读. 文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicl ...

最新文章

  1. Hadoop Hive sql 语法详细解释
  2. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.10. 位串类型
  3. asp语言与php语言的差别,用什么语言进行网页开发最好.php与asp语言的区别
  4. hideprocess in bcb
  5. 从零单排HBase 02:全面认识HBase架构(建议收藏)
  6. linux中lamp架构搭建,Linux LAMP架构平台搭建
  7. 【渝粤题库】国家开放大学2021春2605经济法律基础题目
  8. PHP实现程序单例执行
  9. [转] 字符编码笔记:ASCII,Unicode和UTF-8
  10. Nero Video 2019中文破解版
  11. linux刷显卡bios版本,一种Linux系统下显卡刷新BIOS的方法与流程
  12. matlab绘图空间曲线,matlab空间曲线绘图
  13. C++经典编程题目(九)玩火柴棍游戏
  14. 为什么128KB的魂斗罗可以实现那么长的剧情?
  15. .net\C#基于zxing的彩色、Logo二维码生成---随笔
  16. Windows服务器应该如何保持长时间连接不断开。
  17. 设备综合效率(OEE)的计算方法
  18. python数据分析设置教程视频_炼数成金女讲师Python数据分析实战应用视频教程
  19. 如何在unity上放置3d图片
  20. 熊猫教你路由器和三层交换机的区别

热门文章

  1. command-codes
  2. 图解AUTOSAR(六)——服务层(Service Layer)、复杂驱动(Complex Drivers)
  3. 3天25顿的潮汕美食记
  4. LINUX嵌入式系统开发平台选择
  5. Win7 未识别网络 的20种常见解决方案
  6. 软件及系统开发项目可行性分析
  7. 云南民大java期中考试_云南省中央民大附中芒市国际学校2017-2018学年高一下学期期中考试英语试题(含听力)...
  8. 【性能测试】如何完全卸载LoadRunner?
  9. CCF CSP认证——201312
  10. Android - 集成高德地图API(搜索,地图,定位)