首页 > 解决方案 > 通过特定路径发送消息

问题描述

我是 Omnet++ 的新手,正在构建我的第一个网络,其中消息必须通过特定路由。这是我正在使用的示例网络的简化版本。

在此处输入图像描述

接收请求时,它必须经过特定的路由。例如; A->B->E->D->E->C

我的问题是在处理门时出现的。我的第一个直觉是创建一个inout特定于每个模块之间连接的门。所以 A->B 会有自己的inout门,B->E 会有自己的inout门,等等。但是,随着网络的增长,这会导致需要管理的门数量非常多。

我的第二次尝试是创建和inout门阵列。我的连接如下:

    A.nodeGates++ <--> B.nodeGates++;
    A.nodeGates++ <--> C.nodeGates++;
    A.nodeGates++ <--> D.nodeGates++;
    C.nodeGates++ <--> E.nodeGates++;
    B.nodeGates++ <--> E.nodeGates++;
    D.nodeGates++ <--> E.nodeGates++;

然后在 cpp 文件send(msg, "nodeGates$o", indexId);中调用我的handleMessage函数。有没有办法根据模块名称映射 indexId ?例如,当我在模块A时,对于路线 A->B->E->D->E->C,我会动态找到从AB的 indexId 。一旦在B,我会找到 indexId 去E等等。

有没有办法动态找到两个节点之间的 indexId 以遵循精确的路线?

标签: omnet++

解决方案


在给定的输出 gate上,您可以调用getPathEndGate()这将为您提供连接远端的门。调用getOwnerModule()那个门会给你远端的模块,然后调用getFullName()那个模块会给你那个模块的名称。通过这种方式,您可以获得连接到给定输出门的模块的名称。您可以根据该信息做出路由决策。

gate("nodeGates$o", indexId)->getPathEndGate()->getOwnerModule()->getFullName()

见:https ://doc.omnetpp.org/omnetpp/api/classomne​​tpp_1_1cGate.html

另请注意,您必须实现源路由,即在创建数据包时必须将数据包的所需路径存储在数据包本身中,并且在每一跳上,节点必须从该列表中删除一跳并根据以下内容进行路由决策下一个需要的节点。这样,数据包将通过指定的路径并在最终目的地结束。


推荐阅读