Omnetpp - 在 List/Vector 中显示模拟拓扑(节点、链接等)

Omnetpp - Show Simulation Topology(Nodes, Links etc) in List/Vector

我想在日志中显示模拟拓扑。特别是交换机和来自交换机的连接。

我添加了 inet/common/Topology.cc 头文件,我认为有多个函数可以满足我的要求。

但我不明白如何为我的 ned 文件、ini 文件或我的模块提供这些函数的完整路径?

我已经搜索了实现,但是没有关于 that.All 的信息,我可以找到的是 omnetpp manuel 并且该站点没有提供任何关于如何使用这些方法的信息。

您要查找的内容已记录在 Topology.h 文件中。您不必向拓扑对象添加任何内容。模块和链接将自己注册到模拟运行时。您只需创建一个 Topology 对象并对其调用 extractBy...() 函数之一,该函数将遍历模块层次结构并在该 Topology 对象内构建拓扑图。例如。要提取网络中的所有节点,您将使用 extractByPropery("networkNode"),因为所有网络节点在 INET 中都由 @networkNode 属性 标记。显然,如果你只需要开关,你可以使用不同的提取方法,例如接受 ned 类型作为过滤器。

提取拓扑后,您可以遍历所有节点并转储信息。此代码部分来自网络配置器,正是这样做的:

https://github.com/inet-framework/inet/blob/master/src/inet/networklayer/configurator/ipv4/Ipv4FlatNetworkConfigurator.cc#L61

void Ipv4FlatNetworkConfigurator::extractTopology(cTopology& topo, NodeInfoVector& nodeInfo)
{
    // extract topology
    topo.extractByProperty("networkNode");
    EV_DEBUG << "cTopology found " << topo.getNumNodes() << " nodes\n";

    // fill in isIPNode, ift and rt members in nodeInfo[]
    nodeInfo.resize(topo.getNumNodes());
    for (int i = 0; i < topo.getNumNodes(); i++) {
        cModule *mod = topo.getNode(i)->getModule();
        nodeInfo[i].isIPNode = L3AddressResolver().findIpv4RoutingTableOf(mod) != nullptr && L3AddressResolver().findInterfaceTableOf(mod
        if (nodeInfo[i].isIPNode) {
            nodeInfo[i].ift = L3AddressResolver().interfaceTableOf(mod);
            nodeInfo[i].rt = L3AddressResolver().getIpv4RoutingTableOf(mod);
            nodeInfo[i].ipForwardEnabled = mod->hasPar("forwarding") ? mod->par("forwarding") : false;
            topo.getNode(i)->setWeight(nodeInfo[i].ipForwardEnabled ? 0.0 : INFINITY);
        }
    }
}