如何实现OMNeT++中单个节点与多节点的定向通信?
实现方案
1. 独立消息类型定义
确保两种消息完全独立,分别创建.msg文件:
tictocMsg.msg:
message tictocMsg { // 按需添加字段,本需求无修改则可留空 }
rndMsg.msg:
message rndMsg { // 按需添加字段,本需求无修改则可留空 }
编译消息生成对应的C++类文件。
2. NED网络与节点配置
网络拓扑定义
通过独立端口区分两条通信链路,避免消息混流:
network TicTocRndNet { submodules: tic: TicNode; toc: TocNode; rnd: RndNode; connections: // tic与toc的tictocMsg通信链路 tic.out_tictoc --> { delay = 100ms; } --> toc.in_tictoc; toc.out_tictoc --> { delay = 100ms; } --> tic.in_tictoc; // toc与rnd的rndMsg通信链路 toc.out_rnd --> { delay = 100ms; } --> rnd.in_rnd; rnd.out_rnd --> { delay = 100ms; } --> toc.in_rnd; }
节点NED定义
每个节点仅暴露对应通信所需的端口:
TicNode.ned:
simple TicNode { gates: input in_tictoc; output out_tictoc; }
TocNode.ned:
simple TocNode { gates: input in_tictoc; output out_tictoc; input in_rnd; output out_rnd; }
RndNode.ned:
simple RndNode { gates: input in_rnd; output out_rnd; }
3. C++节点逻辑实现
TicNode 逻辑(仅处理tictocMsg)
#include <omnetpp.h> #include "tictocMsg_m.h" using namespace omnetpp; class TicNode : public cSimpleModule { protected: virtual void initialize() override; virtual void handleMessage(cMessage *msg) override; }; Define_Module(TicNode); void TicNode::initialize() { // 初始化发送第一条tictocMsg给toc tictocMsg *msg = new tictocMsg("tictocMsg"); send(msg, "out_tictoc"); } void TicNode::handleMessage(cMessage *msg) { // 收到toc返回的消息,直接转发(无修改) send(msg, "out_tictoc"); }
TocNode 逻辑(区分处理两种消息)
#include <omnetpp.h> #include "tictocMsg_m.h" #include "rndMsg_m.h" using namespace omnetpp; class TocNode : public cSimpleModule { protected: virtual void initialize() override; virtual void handleMessage(cMessage *msg) override; }; Define_Module(TocNode); void TocNode::initialize() { // 初始化发送第一条rndMsg给rnd rndMsg *rnd_msg = new rndMsg("rndMsg"); send(rnd_msg, "out_rnd"); } void TocNode::handleMessage(cMessage *msg) { if (dynamic_cast<tictocMsg*>(msg)) { // 识别为tictocMsg,转发回tic send(msg, "out_tictoc"); } else if (dynamic_cast<rndMsg*>(msg)) { // 识别为rndMsg,转发回rnd send(msg, "out_rnd"); } else { // 未知消息类型,直接销毁 delete msg; } }
RndNode 逻辑(仅处理rndMsg)
#include <omnetpp.h> #include "rndMsg_m.h" using namespace omnetpp; class RndNode : public cSimpleModule { protected: virtual void handleMessage(cMessage *msg) override; }; Define_Module(RndNode); void RndNode::handleMessage(cMessage *msg) { // 收到toc发送的消息,直接转发(无修改) send(msg, "out_rnd"); }
4. 常见问题排查
- 确认消息文件已编译:检查项目目录下是否生成
tictocMsg_m.h、rndMsg_m.h等文件 - 端口名称严格匹配:NED中定义的端口名与C++代码
send()调用的名称必须完全一致 - 消息类型判断准确:使用
dynamic_cast而非字符串匹配,避免名称修改导致的错误 - 禁止修改消息内容:直接转发原消息对象,不要调用
dup()或修改字段
内容的提问来源于stack exchange,提问作者최지성
相关产品推荐
相关产品推荐

