簡體   English   中英

如何將自定義模塊與Omnet ++ INET的簡單模塊結合使用

[英]How can I combine my customize module with Omnet++INET's simple module

在INET模塊中已經定義了所有簡單模塊的行為,例如80211 mac層。 如果要在mac層和網絡層之間添加自定義層以處理網絡編碼。 如何結合定制模塊和INET的簡單模塊?

要在網絡層和MAC層之間添加新模塊,我建議在新項目中創建修改后的主機。 對於OMNeT++ 4.6和INET 3.2.4,請執行以下操作:

  1. 使用src和模擬目錄創建一個新的OMNeT++空項目。
  2. 在新項目中,打開Properties | Project References然后選擇inet
  3. 右鍵單擊src並選擇New | Simple module 稱之為DummyLayer.ned
  4. 打開DummyLayer.ned並添加:

     @namespace(inet); import inet.linklayer.contract.INic; simple DummyLayer like INic { parameters: @display("i=block/buffer"); // here you can add others parameter gates: input ifIn; output ifOut; input upperLayerIn; output upperLayerOut; } 
  5. 修改DummyLayer.hDummyLayer.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 
  6. 為自己的主機創建一個新的復合模塊,將其稱為WirelessHostEx.ned

     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 (eg ~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; } } 

必須擁有自己的主機模塊,因為INET StandardHost會自動在MAC和網絡層之間創建連接,並且不可能在這些層之間添加自己的模塊。

  1. 創建一個網絡(用於測試):

     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"); } } 
  2. 修改omnetpp.ini

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

開始仿真后,可以看到在每個主機dummyLayer中都dummyLayer發送消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM