C++ 如何将自定义模块与Omnet++INET的简单模块结合起来

C++ 如何将自定义模块与Omnet++INET的简单模块结合起来,c++,omnet++,inet,C++,Omnet++,Inet,由于所有简单模块(如80211 mac层)的行为都已在INET模块中定义。如果我想在mac层和网络层之间添加一个自定义层来处理网络编码。如何组合自定义模块和INET的简单模块?要在网络层和MAC层之间添加新模块,我建议在新项目中创建修改后的主机。对于OMNeT++4.6和INET 3.2.4,请执行以下操作: 使用src和simulation目录创建一个新的OMNeT++空项目。 在新项目中打开属性|项目引用并选择inet。 右键单击src并选择新建|简单模块。叫它DummyLayer.ned。

由于所有简单模块(如80211 mac层)的行为都已在INET模块中定义。如果我想在mac层和网络层之间添加一个自定义层来处理网络编码。如何组合自定义模块和INET的简单模块?

要在网络层和MAC层之间添加新模块,我建议在新项目中创建修改后的主机。对于OMNeT++4.6和INET 3.2.4,请执行以下操作:

使用src和simulation目录创建一个新的OMNeT++空项目。 在新项目中打开属性|项目引用并选择inet。 右键单击src并选择新建|简单模块。叫它DummyLayer.ned。 打开DummyLayer.ned并添加:

修改DummyLayer.h和DummyLayer.cc此模块只传递上下消息以及递增计数器:

// DummyLayer.h
#include <omnetpp.h>
namespace inet {
class DummyLayer: public cSimpleModule {
protected:
    virtual void initialize();
    virtual void handleMessage(cMessage *msg);
private:
    int upNumber;
    int downNumber;
};
} //namespace

//----------------------------------------------
// DummyLayer.cc
#include "DummyLayer.h"
namespace inet {
Define_Module(DummyLayer);

void DummyLayer::initialize() {
   upNumber = 0;
   downNumber = 0;
}

void DummyLayer::handleMessage(cMessage *msg) {
  if (msg->arrivedOn("upperLayerIn")) {
      send(msg, "ifOut");
      downNumber++;
  } else if (msg->arrivedOn("ifIn")) {
      send(msg, "upperLayerOut");
      upNumber++;
  } else {
      error("Incorrect gate");
  }
  char buf[128];
  sprintf(buf, "up: %d, down: %d", upNumber, downNumber);
  getDisplayString().setTagArg("t", 0, buf);
  }
} //namespace
需要自己的主机模块,因为INET中的StandardHost会自动在MAC层和网络层之间创建连接,并且不可能在这些层之间添加自己的模块

为测试创建网络:

import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.physicallayer.ieee80211.packetlevel.Ieee80211ScalarRadioMedium;
import inet.node.wireless.AccessPoint;

network WirelessNetwork {
    submodules:
        configurator: IPv4NetworkConfigurator {
            @display("p=33,81");
        }
        radioMedium: Ieee80211ScalarRadioMedium {
            @display("p=33,30");
        }
        node0: WirelessHostEx {
            @display("p=128,121");
        }
        node1: WirelessHostEx {
            @display("p=384,115");
        }
        ap: AccessPoint {
            @display("p=273,54");
        }
}
修改omnetpp.ini:


在开始模拟后,可以看到在每个主机dummyLayer中都会向前发送消息

非常感谢你,杰瑞。这对我帮助很大。看完代码后,我有一些问题。因为我不熟悉NED的语言,所以你能解释一下像wlan[numRadios]:像IWirelessNic这样的代码吗。和喜欢的含义是什么。有什么语言像奈德的语言吗?在DummyLayer.cc中,getDisplayString.setTagArgt,0,buf;,是什么意思?行wlan[numRadios]:与IWirelessNic的意思类似:创建wlan模块的numRadios实例,除非在omnetpp.ini中选择了其他类型,否则每一个都是IEEE801NIC NED类型。要选择另一种类型的wlan模块,应在omnetpp.ini中写入:*.wlan[*].typename=IdealWirelessNic,其中IdealWirelessNic是必须从IWirelessNic继承的复合模块的名称。typename单词是NED语法的一部分,请参见OMNeT++手册中的;只需在模块图标上方添加来自buf的文本。OMNeT++手册第8.1章详细介绍了显示字符串。一般来说,显示字符串允许向模块的图标添加任何文本,以及更改颜色、位置、添加工具提示等。因此,像IWirelessNic这样的代码意味着IEEE801NIC继承了IWirelessNic?正如您所说,linegetDisplayString.setTagArgt,0,buf;在模块图标上方添加一个文本表单buf,但我在哪里可以看到它?嗨,Jerzy。当我查看主机内部并开始模拟时,我发现传输仅基于mac层,而不通过虚拟层。此模型中使用的协议是什么?
import inet.common.lifecycle.NodeStatus;
import inet.linklayer.contract.IWiredNic;
import inet.linklayer.contract.IWirelessNic;
import inet.linklayer.loopback.LoopbackInterface;
import inet.mobility.contract.IMobility;
import inet.networklayer.contract.IRoutingTable;
import inet.networklayer.common.InterfaceTable;
import inet.networklayer.contract.INetworkLayer;
import inet.power.contract.IEnergyStorage;
import inet.power.contract.IEnergyGenerator;
import inet.applications.contract.IPingApp;
import inet.applications.contract.ISCTPApp;
import inet.applications.contract.ITCPApp;
import inet.applications.contract.IUDPApp;
import inet.transportlayer.contract.ISCTP;
import inet.transportlayer.contract.ITCP;
import inet.transportlayer.contract.IUDP;
import inet.node.inet.INetworkNode;

module WirelessHostEx like INetworkNode
{
    parameters:
        @networkNode;
        @display("i=device/wifilaptop");
        @labels(wireless-node);
        bool hasStatus = default(false);
        int numExtInterfaces = default(0);
        int numRadios = 1;
        int numTunInterfaces = default(0);
        string mobilityType = default(numRadios > 0 ? "StationaryMobility" : "");
        string networkLayerType = default("IPv4NetworkLayer");
        string routingTableType = default("IPv4RoutingTable");
        bool forwarding = default(true);
        bool multicastForwarding = default(false);
        string energyStorageType = default("");
        string energyGeneratorType = default("");
        routingTable.forwarding = forwarding;
        routingTable.multicastForwarding = multicastForwarding;  
        *.interfaceTableModule = default(absPath(".interfaceTable"));
        *.routingTableModule = default(routingTableType != "" ? absPath(".routingTable") : "");
        *.energySourceModule = default(energyStorageType != "" ? absPath(".energyStorage") : "");
        *.mobilityModule = default(mobilityType != "" ? absPath(".mobility") : "");
        int numTcpApps = default(0);
        int numUdpApps = default(0); 
        int numPingApps = default(0); 
        bool hasTcp = default(numTcpApps > 0);
        bool hasUdp = default(numUdpApps > 0);
        string tcpType = default(firstAvailableOrEmpty("TCP", "TCP_lwIP", "TCP_NSC"));  // tcp implementation (e.g. ~TCP, ~TCP_lwIP, ~TCP_NSC) or ~TCPSpoof
        string udpType = default(firstAvailableOrEmpty("UDP"));
        forwarding = default(false);  // disable routing by default
        networkLayer.proxyARP = default(false);
    gates:
        input radioIn[numRadios] @directIn;
        inout pppg[] @labels(PPPFrame-conn);
        inout ethg[] @labels(EtherFrame-conn);
    submodules:
        status: NodeStatus if hasStatus {
            @display("p=50,50");
        }
        energyStorage: <energyStorageType> like IEnergyStorage if energyStorageType != "" {
            parameters:
                @display("p=50,100;i=block/plug;is=s");
        }
        energyGenerator: <energyGeneratorType> like IEnergyGenerator if energyGeneratorType != "" {
            parameters:
                @display("p=50,150;i=block/plug;is=s");
        }
        mobility: <mobilityType> like IMobility if mobilityType != "" {
            parameters:
                @display("p=53,200");
        }
        networkLayer: <networkLayerType> like INetworkLayer {
            parameters:
                @display("p=329,287;q=queue");
        }
        routingTable: <routingTableType> like IRoutingTable if routingTableType != "" {
            parameters:
                @display("p=53,250;is=s");
        }
        interfaceTable: InterfaceTable {
            parameters:
                @display("p=53,300;is=s");
        }
        lo0: LoopbackInterface {
            @display("p=78,406");
        }
        wlan[numRadios]: <default("Ieee80211Nic")> like IWirelessNic {
            parameters:
                @display("p=216,406,row,60;q=queue");
        }
        eth[sizeof(ethg)]: <default("EthernetInterface")> like IWiredNic {
            parameters:
                @display("p=368,406,row,60;q=txQueue");
        }
        ppp[sizeof(pppg)]: <default("PPPInterface")> like IWiredNic {
            parameters:
                @display("p=558,406,row,60;q=txQueue");
        }
        tcpApp[numTcpApps]: <> like ITCPApp {
            parameters:
                @display("p=147,54,row,60");
        }
        tcp: <tcpType> like ITCP if hasTcp {
            parameters:
                @display("p=147,141");
        }
        udpApp[numUdpApps]: <> like IUDPApp {
            parameters:
                @display("p=329,54,row,60");
        }
        udp: <udpType> like IUDP if hasUdp {
            parameters:
                @display("p=329,141");
        }
        pingApp[numPingApps]: <default("PingApp")> like IPingApp {
            parameters:
                @display("p=635,141,row,60");
        }
        dummy: DummyLayer {
            @display("p=273,350");
        }
    connections allowunconnected:
        radioIn[0] --> { @display("m=s"); } --> wlan[0].radioIn;
        // the order of connections is important here
        wlan[0].upperLayerOut --> dummy.ifIn;
        dummy.upperLayerOut --> networkLayer.ifIn++;
        wlan[0].upperLayerIn <-- dummy.ifOut;
        dummy.upperLayerIn <-- networkLayer.ifOut++;
        networkLayer.ifOut++ --> lo0.upperLayerIn;
        lo0.upperLayerOut --> networkLayer.ifIn++;
        for i=0..sizeof(ethg)-1 {
            ethg[i] <--> { @display("m=s"); } <--> eth[i].phys;
            eth[i].upperLayerOut --> networkLayer.ifIn++;
            eth[i].upperLayerIn <-- networkLayer.ifOut++;
        }
        for i=0..sizeof(pppg)-1 {
            pppg[i] <--> { @display("m=s"); } <--> ppp[i].phys;
            ppp[i].upperLayerOut --> networkLayer.ifIn++;
            ppp[i].upperLayerIn <-- networkLayer.ifOut++;
        }
        for i=0..numTcpApps-1 {
            tcpApp[i].tcpOut --> tcp.appIn++;
            tcpApp[i].tcpIn <-- tcp.appOut++;
        }
        tcp.ipOut --> networkLayer.transportIn++ if hasTcp;
        tcp.ipIn <-- networkLayer.transportOut++ if hasTcp;
        for i=0..numUdpApps-1 {
            udpApp[i].udpOut --> udp.appIn++;
            udpApp[i].udpIn <-- udp.appOut++;
        }
        udp.ipOut --> networkLayer.transportIn++ if hasUdp;
        udp.ipIn <-- networkLayer.transportOut++ if hasUdp;
        for i=0..numPingApps-1 {
            networkLayer.pingOut++ --> pingApp[i].pingIn;
            networkLayer.pingIn++ <-- pingApp[i].pingOut;
        }
}
import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.physicallayer.ieee80211.packetlevel.Ieee80211ScalarRadioMedium;
import inet.node.wireless.AccessPoint;

network WirelessNetwork {
    submodules:
        configurator: IPv4NetworkConfigurator {
            @display("p=33,81");
        }
        radioMedium: Ieee80211ScalarRadioMedium {
            @display("p=33,30");
        }
        node0: WirelessHostEx {
            @display("p=128,121");
        }
        node1: WirelessHostEx {
            @display("p=384,115");
        }
        ap: AccessPoint {
            @display("p=273,54");
        }
}
[General]
network = WirelessNetwork

// node0 will send ping to node1
**.node0.numPingApps = 1
**.node0.pingApp[0].destAddr = "node1" // using IP address here is allowed too