모각코(개인 활동 계획)

모각코 다섯 번째 모임 개인 계획, 활동 과정 및 결과

Beige00 2024. 2. 2. 18:22

IRSML 코드 구현의 문제를 확인하고 다시 코드를 작성하였다.


#include <random>
#include <string>
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/applications-module.h"
#include "ns3/mobility-module.h"
#include "ns3/config-store-module.h"
#include "ns3/netanim-module.h"
#include "ns3/internet-module.h"
#include "ns3/yans-wifi-helper.h"
#include "ns3/flow-monitor-module.h"
#include "ns3/ssid.h"
#include "ns3/point-to-point-helper.h"
#include "ns3/point-to-point-layout-module.h"

#define SIMULATION_NUM 1020
#define SIMULATION_AREA 1000
#define SIMULATION_TIME 240
#define APnum 17
#define TransmitPower 12
#define ReceiverSensitivity -76
#define TransmissionRange 250
#define BERthreshold 0.000001
#define MinSNR 25
#define dataRate "54Mbps"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE("IRSMLResult");

int numberOfMHs[7] = {30,35,40,45,50,55,60};
int APx[] = {250,500,750,200,400,600,800,250,500,750,200,400,600,800,250,500,750};
int APy[] = {166,166,166,333,333,333,333,500,500,500,665,665,665,665,832,832,832};

int
main(int argc, char* argv[]){

    std::random_device rd;

    //for(int i=0; i<SIMULATION_NUM; i++){

        SeedManager::SetSeed(10);
        SeedManager::SetRun(1);

        //node 수
        uint32_t nWifi;
        std::mt19937 gen(rd());
        std::uniform_int_distribution<int> dis(0,6);
        nWifi = numberOfMHs[dis(gen)];

        // //Gate Way node
        // NodeContainer GWnodes;
        // GWnodes.Create(1);

        //AP node
        NodeContainer APnodes;
        APnodes.Create(APnum);

        //MH node
        NodeContainer MHnodes;
        MHnodes.Create(nWifi);

        // //GW & AP node 1,2,3 Wire P2P Link
        // NodeContainer P2Plink1;
        // P2Plink1.Add(GWnodes.Get(0));
        // P2Plink1.Add(APnodes.Get(0));
        // NodeContainer P2Plink2;
        // P2Plink1.Add(GWnodes.Get(0));
        // P2Plink1.Add(APnodes.Get(1));
        // NodeContainer P2Plink3;
        // P2Plink1.Add(GWnodes.Get(0));
        // P2Plink1.Add(APnodes.Get(2));

        // //p2p Link Ap1,2,3 GW
        // PointToPointHelper p2p;
        // p2p.SetChannelAttribute("Delay",StringValue("1ms"));
        // p2p.SetDeviceAttribute("DataRate",StringValue("1Gbps"));
        
        // NetDeviceContainer p2p1;
        // p2p1 = p2p.Install(P2Plink1);
        // NetDeviceContainer p2p2;
        // p2p2 = p2p.Install(P2Plink2);
        // NetDeviceContainer p2p3;
        // p2p3 = p2p.Install(P2Plink3);

          //Allocate Position & Mobility Model
        MobilityHelper mobility;
        Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
        for(int i=0; i<APnum; i++){
            positionAlloc->Add(Vector(APx[i],APy[i],0));
        }
        mobility.SetPositionAllocator(positionAlloc);
        mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
        mobility.Install(APnodes);

        // Ptr<ListPositionAllocator> positionAlloc2 = CreateObject<ListPositionAllocator> ();
        // positionAlloc2->Add(Vector(499,999,0));
        // mobility.SetPositionAllocator(positionAlloc2);
        // mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
        // mobility.Install(GWnodes);

        //Set MH mobility Model
        ObjectFactory points;
        points.SetTypeId("ns3::RandomRectanglePositionAllocator");
        points.Set("X",StringValue("ns3::UniformRandomVariable[Min=0.0|Max=1000.0]"));
        points.Set("Y",StringValue("ns3::UniformRandomVariable[Min=0.0|Max=1000.0]"));
        Ptr<PositionAllocator> waypos = points.Create() -> GetObject<PositionAllocator>();   
        mobility.SetMobilityModel("ns3::RandomWaypointMobilityModel",
        "Speed",StringValue("ns3::UniformRandomVariable[Min=0.0|Max=20.0]"),
        "Pause",StringValue("ns3::UniformRandomVariable[Min=0.0|Max=2.0]"),
        "PositionAllocator",PointerValue(waypos));
        mobility.Install(MHnodes);

        //Define Wifi
        WifiHelper wifi;
        wifi.SetStandard(WIFI_STANDARD_80211ac);
        YansWifiPhyHelper wifiPhy;
        YansWifiChannelHelper wifiChannel;
        wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
        wifiChannel.AddPropagationLoss("ns3::RangePropagationLossModel","MaxRange",DoubleValue(TransmissionRange));;
        wifiPhy.SetChannel(wifiChannel.Create());
        wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager","DataMode",StringValue("OfdmRate54Mbps"),"ControlMode",StringValue("VhtMcs0"));
        WifiMacHelper wifiMac;
        Ssid ssid = Ssid("IRSML_wifi");

        //Install to AP, MH
        NetDeviceContainer APDevices;
        NetDeviceContainer MHDevices;
        wifiMac.SetType("ns3::ApWifiMac","Ssid",SsidValue(ssid));
        APDevices = wifi.Install(wifiPhy,wifiMac,APnodes);
        wifiMac.SetType("ns3::StaWifiMac","Ssid",SsidValue(ssid));
        MHDevices = wifi.Install(wifiPhy,wifiMac,MHnodes);

      
        //Install Internet & Assign Ipv4 Address
        InternetStackHelper internet;
        // internet.Install(GWnodes);
        internet.Install(APnodes);
        internet.Install(MHnodes);

        Ipv4InterfaceContainer APInterFaces;
        Ipv4InterfaceContainer MHInterFaces;
        // Ipv4InterfaceContainer P2PInterfaces1;
        // Ipv4InterfaceContainer P2PInterfaces2;
        // Ipv4InterfaceContainer P2PInterfaces3;
        Ipv4AddressHelper address;
        address.SetBase("192.168.0.0","255.255.255.0");
        // P2PInterfaces1 = address.Assign(p2p1);
        // address.NewNetwork();
        // P2PInterfaces2 = address.Assign(p2p2);
        // address.NewNetwork();
        // P2PInterfaces3 = address.Assign(p2p3);
        // address.NewNetwork();
        APInterFaces = address.Assign(APDevices);
        MHInterFaces = address.Assign(MHDevices);

        //install Application, port1 for P2P, port2 for wifi
        //uint16_t port1 = 9; 
        uint16_t port2 = 10;

        // //P2P Application
        // PacketSinkHelper GWapp ("ns3::TcpSocketFactory",InetSocketAddress(Ipv4Address::GetAny(),port1));
        // ApplicationContainer GateWay_app = GWapp.Install(GWnodes);
        // GateWay_app.Start(Seconds(0.0));
        // GateWay_app.Stop(Seconds(SIMULATION_TIME));

        // //For AP1
        // OnOffHelper P2PAPapp1 ("ns3::TcpSocketFactory",InetSocketAddress(P2PInterfaces1.GetAddress(0),port1));
        // P2PAPapp1.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
        // P2PAPapp1.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
        // P2PAPapp1.SetAttribute("DataRate", DataRateValue(DataRate("1Gbps")));
        // ApplicationContainer P2PAP_app1 = P2PAPapp1.Install(P2Plink1.Get(1));
        // P2PAP_app1.Start(Seconds(2.0));
        // P2PAP_app1.Stop(Seconds(SIMULATION_TIME-2.0));

        // //For AP2
        // OnOffHelper P2PAPapp2 ("ns3::TcpSocketFactory",InetSocketAddress(P2PInterfaces2.GetAddress(0),port1));
        // P2PAPapp2.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
        // P2PAPapp2.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
        // P2PAPapp2.SetAttribute("DataRate", DataRateValue(DataRate("1Gbps")));
        // ApplicationContainer P2PAP_app2 = P2PAPapp2.Install(P2Plink2.Get(1));
        // P2PAP_app2.Start(Seconds(2.0));
        // P2PAP_app2.Stop(Seconds(SIMULATION_TIME-2.0));

        // //For AP3
        // OnOffHelper P2PAPapp3 ("ns3::TcpSocketFactory",InetSocketAddress(P2PInterfaces3.GetAddress(0),port1));
        // P2PAPapp3.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
        // P2PAPapp3.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
        // P2PAPapp3.SetAttribute("DataRate", DataRateValue(DataRate("1Gbps")));
        // ApplicationContainer P2PAP_app3 = P2PAPapp3.Install(P2Plink3.Get(1));
        // P2PAP_app3.Start(Seconds(2.0));
        // P2PAP_app3.Stop(Seconds(SIMULATION_TIME-2.0));
        
        //Wifi AP application
        PacketSinkHelper APapp ("ns3::TcpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(),port2));
        ApplicationContainer AP_app = APapp.Install(APnodes);
        AP_app.Start(Seconds(0.0));
        AP_app.Stop(Seconds(SIMULATION_TIME));

        //Wifi Moblie Host Application
        ApplicationContainer MH_app;
        for(int i=0; i<APnum; i++){
            OnOffHelper MHapp ("ns3::TcpSocketFactory",InetSocketAddress(APInterFaces.GetAddress(i),port2));
            MHapp.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
            MHapp.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
            MHapp.SetAttribute("DataRate", DataRateValue(DataRate(dataRate)));
            
            MH_app = MHapp.Install(MHnodes);
            MH_app.Start(Seconds(2.0));
            MH_app.Stop(Seconds(SIMULATION_TIME-2.0));
        }

        AnimationInterface anim("IRSML_demo.xml");
        anim.SetMaxPktsPerTraceFile(99999999);
        for(int i=0; i<APnum; i++){
            anim.UpdateNodeSize(i,6,6);
            anim.SetConstantPosition(APnodes.Get(i),APx[i],APy[i],0);
            anim.UpdateNodeColor(i,255,255,102);
            anim.UpdateNodeDescription(i,"AP"+std::to_string(i));
        }
        for(uint32_t i=0; i<MHnodes.GetN();i++){
            anim.UpdateNodeDescription(i+APnum,"MH"+std::to_string(i));
        }
        anim.EnablePacketMetadata(true);
        anim.EnableIpv4RouteTracking("IRSML_routetable.xml",Seconds(1),Seconds(SIMULATION_TIME-1),Seconds(SIMULATION_TIME/2));
        anim.EnableIpv4L3ProtocolCounters(Seconds(0),Seconds(SIMULATION_TIME-1));
        anim.EnableQueueCounters(Seconds(0),Seconds(SIMULATION_TIME-1));

        Simulator::Stop(Seconds(SIMULATION_TIME));
        Simulator::Run();
        Simulator::Destroy();
    //}
    
}

첫번째로 작성한 코드이다. WLAN 환경으로 AP, MH를 구성했고 AP1,2,3과 P2P(주석처리) 링크를 구성했다.

그러나 P2P 부분에는 주소할당 오류가 자꾸 났고, WLAN 환경은 AP가 많아서 그런지 Eventmiss 오류가 자꾸 발생하였다.

(인터넷에 검색했으나 관련 글은 없었다.)

그래서 우선 P2P 부분은 주석처리를 하고 WLAN 부분은 알아보니 Adhoc Network로 구성해야함을 느꼈다.

더보기

다음 링크를 참고하면 Ad-hoc network의 뜻은 Mesh network라는 의미도 가지며, IRSML은 WMN 위에서 돌아간다는 정보를 논문에서 읽을 수 있었다.

(출처 : https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=ki630808&logNo=221620151504)


따라서 WLAN 부분을 Adhoc NetWork로 교체하였다.

#include <random>
#include <string>
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/applications-module.h"
#include "ns3/mobility-module.h"
#include "ns3/config-store-module.h"
#include "ns3/netanim-module.h"
#include "ns3/internet-module.h"
#include "ns3/yans-wifi-helper.h"
#include "ns3/flow-monitor-module.h"
#include "ns3/point-to-point-helper.h"
#include "ns3/point-to-point-layout-module.h"
#include "ns3/aodv-helper.h"
#include "ns3/ssid.h"

#define SIMULATION_NUM 1020
#define SIMULATION_AREA 1000
#define SIMULATION_TIME 2400
#define APnum 17
#define TransmitPower 12
#define ReceiverSensitivity -76
#define TransmissionRange 250
#define BERthreshold 0.000001
#define MinSNR 25
#define dataRate "54Mbps"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE("IRSMLResult");

int numberOfMHs[7] = {30,35,40,45,50,55,60};
int APx[] = {250,500,750,200,400,600,800,250,500,750,200,400,600,800,250,500,750};
int APy[] = {166,166,166,333,333,333,333,500,500,500,665,665,665,665,832,832,832};

int
main(int argc, char* argv[]){

    std::random_device rd;

    //for(int i=0; i<SIMULATION_NUM; i++){

        SeedManager::SetSeed(10);
        SeedManager::SetRun(1);

        //node 수
        uint32_t nWifi;
        std::mt19937 gen(rd());
        std::uniform_int_distribution<int> dis(0,6);
        nWifi = numberOfMHs[dis(gen)];

        //AP node
        NodeContainer APnodes;
        APnodes.Create(APnum);

        //MH node
        NodeContainer MHnodes;
        MHnodes.Create(nWifi);

        NodeContainer allNodes = NodeContainer(APnodes, MHnodes);

        //Allocate Position & Mobility Model
        MobilityHelper mobility;
        Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
        for(int i=0; i<APnum; i++){
            positionAlloc->Add(Vector(APx[i],APy[i],0));
        }
        mobility.SetPositionAllocator(positionAlloc);
        mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
        mobility.Install(APnodes);


        //Set MH mobility Model
        ObjectFactory points;
        points.SetTypeId("ns3::RandomRectanglePositionAllocator");
        points.Set("X",StringValue("ns3::UniformRandomVariable[Min=0.0|Max=1000.0]"));
        points.Set("Y",StringValue("ns3::UniformRandomVariable[Min=0.0|Max=1000.0]"));
        Ptr<PositionAllocator> waypos = points.Create() -> GetObject<PositionAllocator>();   
        mobility.SetMobilityModel("ns3::RandomWaypointMobilityModel",
        "Speed",StringValue("ns3::UniformRandomVariable[Min=0.0|Max=20.0]"),
        "Pause",StringValue("ns3::UniformRandomVariable[Min=0.0|Max=2.0]"),
        "PositionAllocator",PointerValue(waypos));
        mobility.Install(MHnodes);

        //Define Wifi
        WifiHelper wifi;
        wifi.SetStandard(WIFI_STANDARD_80211ac);
        YansWifiPhyHelper wifiPhy;
        YansWifiChannelHelper wifiChannel;
        wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
        wifiChannel.AddPropagationLoss("ns3::RangePropagationLossModel","MaxRange",DoubleValue(TransmissionRange));;
        wifiPhy.SetChannel(wifiChannel.Create());
        wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager","DataMode",StringValue("OfdmRate54Mbps"),"ControlMode",StringValue("VhtMcs0"));
        WifiMacHelper wifiMac;
        Ssid ssid = Ssid("IRSML");

        //Install to AP, MH
        NetDeviceContainer allDevices;
        NetDeviceContainer apDevices;
        NetDeviceContainer mhDevices;
        wifiMac.SetType("ns3::AdhocWifiMac","Ssid",SsidValue(ssid));
        apDevices = wifi.Install(wifiPhy,wifiMac,APnodes);
        mhDevices = wifi.Install(wifiPhy,wifiMac,MHnodes);
        allDevices = NetDeviceContainer(apDevices,mhDevices);

      
        //Install Internet & Assign Ipv4 Address
        InternetStackHelper internet;
        AodvHelper aodv;
        internet.SetRoutingHelper(aodv);
        internet.Install(allNodes);

        Ipv4InterfaceContainer allInterFaces;
        Ipv4AddressHelper address;
        address.SetBase("192.168.0.0","255.255.255.0");
        allInterFaces = address.Assign(allDevices);

        //install Application, port1 for P2P, port2 for wifi
        uint16_t port2 = 10;

        //Wifi AP application
        PacketSinkHelper APapp ("ns3::TcpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(),port2));
        ApplicationContainer AP_app = APapp.Install(APnodes);
        AP_app.Start(Seconds(0.0));
        AP_app.Stop(Seconds(SIMULATION_TIME));

        //Wifi Moblie Host Application
        ApplicationContainer MH_app;
        OnOffHelper MHapp ("ns3::TcpSocketFactory",InetSocketAddress(allInterFaces.GetAddress(0),port2));
        MHapp.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
        MHapp.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
        MHapp.SetAttribute("DataRate", DataRateValue(DataRate(dataRate)));
            
        MH_app = MHapp.Install(MHnodes);
        MH_app.Start(Seconds(2.0));
        MH_app.Stop(Seconds(SIMULATION_TIME-2.0));



        AnimationInterface anim("IRSML_demo.xml");
        anim.SetMaxPktsPerTraceFile(99999999);
        for(int i=0; i<APnum; i++){
            anim.UpdateNodeSize(i,6,6);
            anim.SetConstantPosition(APnodes.Get(i),APx[i],APy[i],0);
            anim.UpdateNodeColor(i,255,255,102);
            anim.UpdateNodeDescription(i,"AP"+std::to_string(i));
        }
        for(uint32_t i=0; i<MHnodes.GetN();i++){
            anim.UpdateNodeDescription(i+APnum,"MH"+std::to_string(i));
        }
        anim.EnablePacketMetadata(true);
        anim.EnableIpv4RouteTracking("IRSML_routetable.xml",Seconds(1),Seconds(SIMULATION_TIME-1),Seconds(SIMULATION_TIME/2));
        anim.EnableIpv4L3ProtocolCounters(Seconds(0),Seconds(SIMULATION_TIME-1));
        anim.EnableQueueCounters(Seconds(0),Seconds(SIMULATION_TIME-1));

        Simulator::Stop(Seconds(SIMULATION_TIME));
        Simulator::Run();
        Simulator::Destroy();
    //}
    
}

수정한 Adhoc Network Topo 이다. 일단 임시로 작동이 되는지 테스트를 하기 위해 GateWay를 구현하지 않고 Node 0으로 패킷을 전송하는 Application을 MH에 설치하였다.

이후 프로그램을 작동시켰으나 시뮬레이션 시간이 엄청 오래걸리는 이전과 동일한 현상이 발생했다.

결과가 나오면 이후 해결한 과정과 함께 코드를 다음 글에 첨부하도록 하겠다.