Omnet++、Veins与SUMO中自定义消息及日志显示问题咨询
自定义消息及事件日志显示实现指南
1. 先定义自定义消息类型
在Veins的src/veins/modules/messages目录下新建MyCustomMessage.msg文件,示例内容:
cplusplus {{ #include "veins/base/utils/Coord.h" }} message MyCustomMessage extends BaseFrame1609_4 { Coord senderPos; // 自定义字段:发送方位置 string content; // 自定义字段:消息内容 }
Veins的构建系统会自动编译该文件,生成对应的C++类供代码调用。
2. 在应用模块中发送自定义消息
以TraCIDemo11p.cc为例(或你自己的应用模块),添加发送逻辑:
// 创建自定义消息实例 MyCustomMessage* customMsg = new MyCustomMessage("MyCustomBroadcast"); customMsg->setContent("RSU向节点发送的自定义消息"); customMsg->setSenderPos(myMobility->getCurrentPosition()); // 设置MAC层必要参数 customMsg->setRecipientAddress(LAddress::L2BROADCAST()); customMsg->setChannelNumber(static_cast<int>(Channel::CCH)); // 向下发送到MAC层 sendDown(customMsg);
3. 修改AirFrame日志显示逻辑
在src/veins/modules/phy/AirFrame11p.cc的info()方法中,添加自定义消息的识别与日志内容:
std::string AirFrame11p::info() const { std::ostringstream os; os << AirFrame::info(); // 判断封装的是否为自定义消息 const MyCustomMessage* msg = dynamic_cast<const MyCustomMessage*>(getEncapsulatedPacket()); if (msg) { os << ", 自定义消息内容: " << msg->getContent(); } return os.str(); }
这样事件日志中就会显示自定义消息的具体内容。
4. 开启事件日志记录
在omnetpp.ini中添加配置:
**.record-eventlog = true **.eventlog-file = "${resultdir}/${configname}-${runnumber}.elog"
思路补充
你关注airframe11p.cc的方向是对的,但遗漏了消息类型定义这一前置步骤——Veins的所有无线消息都需要先通过.msg文件定义,才能在AirFrame中被识别和处理。另外要注意消息的发送流程:应用层构造消息→传递到MAC层→封装为AirFrame→无线传输,整个链路的参数配置要完整。
内容的提问来源于stack exchange,提问作者Prarthana Prabhakaran
相关产品推荐
相关产品推荐

