Veins中自定义非WSA/WSM/BSM消息实现问题咨询
解决Veins中自定义消息的仿真报错问题
别担心,Veins完全支持自定义消息,你遇到的报错只是因为Mac1609_4模块默认只处理WaveShortMessage(也就是WSM)类型的消息,你的自定义消息没被它识别才触发了错误。下面给你两种可行的解决方法,优先推荐第一种,简单又稳妥:
方法一:让自定义消息继承WaveShortMessage
这是最省心的方案,因为Veins的MAC层是针对WSM设计的,让你的自定义消息继承它之后,MAC层会自动把它当成合法的WSM处理,不需要修改核心代码。
具体操作:
- 打开你的自定义
.msg文件,修改类定义为:class MyCustomMessage extends WaveShortMessage; - 重新运行Veins的消息生成脚本(比如
opp_msgc),生成新的.cc和.h文件 - 在应用层使用这个自定义消息时,你既可以使用WSM原有的所有字段(比如信道号、优先级、PSID等),还能添加自己的自定义字段
发送消息时记得设置必要的MAC层参数,比如:
MyCustomMessage* msg = new MyCustomMessage(); msg->setChannelNumber(Channels::CCH); // 设置控制信道 msg->setPsid(1); // 设置服务ID msg->setPriority(3); // 设置消息优先级 // 这里添加你的自定义字段赋值 sendDown(msg);
方法二:修改MAC层以支持自定义消息(不推荐新手)
如果你不想让自定义消息继承WSM,可以修改Mac1609_4的代码,让它接受你的消息类型。但这个方法需要改动Veins核心模块,后续升级Veins时可能会有兼容性问题,所以只推荐有一定Veins源码基础的开发者使用。
具体操作:
- 找到
Mac1609_4.cc中的消息处理逻辑,比如handleUpperMsg函数 - 在判断消息类型的代码块中,添加你的自定义消息类型的判断,比如:
if (dynamic_cast<MyCustomMessage*>(msg)) { // 按照处理WSM的逻辑处理你的自定义消息 ... } - 同时需要在
Mac1609_4.h中引入你的自定义消息头文件
总结
优先选择方法一,通过继承WaveShortMessage来实现自定义消息,这样既能保留Veins原有MAC层的所有功能,又能轻松添加自己的业务字段,完全避开你遇到的报错问题。
内容的提问来源于stack exchange,提问作者Nina
相关产品推荐
相关产品推荐

