veins中实现rsu与车辆通信
受博客 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与车辆通信相关推荐
- vue2.0s中eventBus实现兄弟组件通信
在vue1.0中,组件之间的通信主要通过vm.$dispatch沿着父链向上传播和用vm.$broadcast向下广播来实现.然而在vue2.0中,已经废除了这种用法. vuex加入后,对组件之间的通 ...
- java 线程 condition_Java编程中实现Condition控制线程通信
java中控制线程通信的方法 1.传统的方式:利用synchronized关键字来保证同步,结合wait(),notify(),notifyall()控制线程通信.不灵活. 2.利用condition ...
- [转帖]中美高速公路等车辆收费有何异同?
[转帖]中美高速公路等车辆收费有何异同? 转载自:http://hi.baidu.com/%D1%94%D2y%D7%D3/blog/item/dbf1c8fd12765751d6887dad.htm ...
- STM32与中显串口屏的通信
STM32与中显串口屏的通信 本文将简要介绍STM32单片机和武汉中显串口屏之间的通信实现过程.不过使用大彩.迪文这些公司的串口屏的同学也能参考一下,它们的通信协议好像一样. 注意:我代码用的ardu ...
- html多页面之间如何通信,html5中sharedWorker实现多页面通信代码示例
本篇文章小编给大家分享一下html5中sharedWorker实现多页面通信代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 在没有登录浏览了一 ...
- 中移物联网onenet入门学习笔记2:中移物联的通信格式
中移物联网onenet入门学习笔记2:中移物联的通信格式 中移物联网硬件接入协议:LWM2M协议,EDP协议,MQTT协议,HTTP协议,TCP透传,MODBUS协议,JT/T808协议,RCMP协议 ...
- 在两个TIA博途项目中组态PROFIBUS和PROFINET通信的具体方法
在两个TIA博途项目中组态PROFIBUS和PROFINET通信的具体方法 为了在两个项目间实现S7-1200/S7-1500的通信,要为其中一个CPU创建GSDML文件,然后将其安装在TIA Por ...
- 考虑下行链路的蜂窝网络中存在多个D2D通信对和多个蜂窝用户,它们共享相同的频率资源并且蜂窝用户为主用户
1.仿真预览 2.理论分析 整个仿真一定要有完整的链路结构,波束赋形按照参考要求设计外,其他模块都要有,但可以适当根据理论进行简化,重点是波束赋形部分的matlab程序编写.主要看这部分内容. 具体实 ...
- 自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)
点云PCL免费知识星球,点云论文速读. 文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicl ...
最新文章
- Hadoop Hive sql 语法详细解释
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.10. 位串类型
- asp语言与php语言的差别,用什么语言进行网页开发最好.php与asp语言的区别
- hideprocess in bcb
- 从零单排HBase 02:全面认识HBase架构(建议收藏)
- linux中lamp架构搭建,Linux LAMP架构平台搭建
- 【渝粤题库】国家开放大学2021春2605经济法律基础题目
- PHP实现程序单例执行
- [转] 字符编码笔记:ASCII,Unicode和UTF-8
- Nero Video 2019中文破解版
- linux刷显卡bios版本,一种Linux系统下显卡刷新BIOS的方法与流程
- matlab绘图空间曲线,matlab空间曲线绘图
- C++经典编程题目(九)玩火柴棍游戏
- 为什么128KB的魂斗罗可以实现那么长的剧情?
- .net\C#基于zxing的彩色、Logo二维码生成---随笔
- Windows服务器应该如何保持长时间连接不断开。
- 设备综合效率(OEE)的计算方法
- python数据分析设置教程视频_炼数成金女讲师Python数据分析实战应用视频教程
- 如何在unity上放置3d图片
- 熊猫教你路由器和三层交换机的区别
热门文章
- command-codes
- 图解AUTOSAR(六)——服务层(Service Layer)、复杂驱动(Complex Drivers)
- 3天25顿的潮汕美食记
- LINUX嵌入式系统开发平台选择
- Win7 未识别网络 的20种常见解决方案
- 软件及系统开发项目可行性分析
- 云南民大java期中考试_云南省中央民大附中芒市国际学校2017-2018学年高一下学期期中考试英语试题(含听力)...
- 【性能测试】如何完全卸载LoadRunner?
- CCF CSP认证——201312
- Android - 集成高德地图API(搜索,地图,定位)