OMNeT++中WirelessHost无线发送自定义有效信息的方法咨询
OMNeT++无线自定义消息收发实现方案(适配后续VEINS 802.11p迁移)
不要直接修改INET自带的UdpBasicApp源码实现自定义载荷,耦合度太高,后续扩展或者迁移框架的时候坑很多,按下面的步骤做,从零搭和tictoc逻辑一致的无线场景最快,也方便后续接VEINS:
1. 先定义自定义载荷消息格式
在你的工程目录下新建消息定义文件WirelessTicTocMsg.msg,所有你需要的核心载荷字段都可以直接在里面定义,OMNeT编译时会自动生成对应的C操作类,不用自己写序列化逻辑:
packet WirelessTicTocMsg { int senderId; // 发送节点ID int hopCount = 0; // 转发跳数,和tictoc示例计数对齐 simtime_t sendTime; // 发送时间戳 string payload; // 自定义业务载荷,后续项目核心数据直接在这里扩展 }
编译后直接调用生成类的setXxx()/getXxx()方法就能读写载荷字段。
2. 编写自定义应用层模块
新建C++类继承INET的UdpApp基类,只需要重写两个核心方法就能实现和tictoc一致的收发逻辑,比改UdpBasicApp灵活很多:
initialize()方法:完成UDP套接字绑定、端口注册,调度第一条消息的发送自事件,和tictoc的初始化逻辑完全对齐handleMessageWhenUp()方法:分两类消息处理:- 收到自调度消息(发送触发):实例化你之前定义的
WirelessTicTocMsg,填充所有需要的载荷字段,调用UDP套接字的sendTo()方法将消息发到广播地址IPv4Address::ALLONES_ADDRESS,同时调度下一次发送的自事件 - 收到网络层递上来的UDP包:解封装取出内层的
WirelessTicTocMsg,读取载荷做自定义处理,需要回传/转发的话就更新字段重新调用发送接口即可,完全复刻tictoc的消息交互逻辑
- 收到自调度消息(发送触发):实例化你之前定义的
3. 网络与配置适配
- 编写对应模块的NED文件,直接继承
UdpApp的基础参数,把你之前跑通的无线示例网络里节点挂载的UdpBasicApp替换成你自己写的自定义应用即可 - INI配置文件不需要做大改,和你之前跑通的UdpBasicApp无线示例保持一致就行:配置好无线网卡的物理层参数、发射功率、接收灵敏度,默认就能实现通信范围内的节点广播收发。
4. 后续迁移VEINS 802.11p的适配要点
你现在写的自定义消息定义、应用层收发逻辑完全可以直接复用到VEINS工程中:
- VEINS本身是基于INET扩展的车联网框架,802.11p协议栈实现在链路层和物理层,上层应用逻辑不需要做任何修改
- 迁移时只需要把节点的普通无线网卡替换为VEINS提供的802.11p网卡模块,调整MAC层的信道频率、接入优先级、传输速率等参数即可,不会和你现在做的基础验证冲突。
踩坑提醒:别为了图省事直接修改
UdpBasicApp源码里写死的载荷生成逻辑,后续你加业务字段、调整收发规则的时候会和INET源码强耦合,后续升级INET版本或者迁移VEINS的时候很容易出现编译错误、逻辑异常,继承基类自定义模块的方式维护成本最低。
内容的提问来源于stack exchange,提问作者jamie wubben
相关产品推荐
相关产品推荐

