Εργαστηριακή Άσκηση 5 1) Σκοπός της εργαστηριακής άσκησης Σκοπός της άσκησης είναι η μελέτη της ενεργειακής συμπεριφοράς των κόμβων ενός ασύρματου δικτύου και η μελέτη της εξασθένισης του σήματος. 2) Βασικές έννοιες Propagation loss: Εξασθένιση του σήματος. Κατά τη μετάδοση των σημάτων, παρατηρείται εξασθένιση της ισχύος των σημάτων, που ονομάζεται απώλεια διαδρομής (path loss). Για τον προσδιορισμό της απώλειας διαδρομής και την περιοχή κάλυψης ενός πομπού χρησιμοποιούνται διάφορα propagation loss models. Propagation delay: Ο χρόνος που χρειάζεται ώστε να φτάσει το σήμα στον προορισμό του. Εξαρτάται από την απόσταση μεταξύ πομπού και δέκτη και την ταχύτητα μετάδοσης. 3) Σενάριο Προσομοίωσης Αρχικά, δηλώνουμε τα include αρχεία που θα χρειαστούμε και το namespace που θα χρησιμοποιήσουμε. #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/mobility-module.h" #include "ns3/config-store-module.h" #include "ns3/wifi-module.h" #include "ns3/energy-module.h" #include "ns3/internet-module.h" #include "ns3/applications-module.h" #include <iostream> #include <fstream> #include <vector> #include <string> NS_LOG_COMPONENT_DEFINE ("Lab7"); usingnamespacens3; Στη συνέχεια, δημιουργούμε τη μέθοδο RemainingEnergy, η οποία τυπώνει την εναπομένουσα ενέργεια σε ένα κόμβο και τη μέθοδο TotalEnergy, η οποία τυπώνει τη συνολική κατανάλωση της ενέργειας σε ένα κόμβο, αντίστοιχα. void RemainingEnergy (double oldvalue, double remainingenergy) std::cout<<simulator::now ().GetSeconds () 1
<< "s Current remaining energy = " <<remainingenergy<< "Joules"<<std::endl; void TotalEnergy (double oldvalue, double totalenergy) std::cout<<simulator::now ().GetSeconds () << "s Total energy consumed = " <<totalenergy<< "Joules" <<std::endl; Έπειτα, ορίζουμε τη μέθοδο main, στην οποία δημιουργούμε 2 κόμβους στο δίκτυο και ορίζουμε ότι το δίκτυό μας θα είναι ένα 802.11b δίκτυο. int main (intargc, char *argv[]) //LogComponentEnable ("EnergySource", LOG_LEVEL_DEBUG); //LogComponentEnable ("BasicEnergySource", LOG_LEVEL_DEBUG); //LogComponentEnable ("WifiRadioEnergyModel", LOG_LEVEL_DEBUG); LogComponentEnable("UdpClient", LOG_LEVEL_INFO); LogComponentEnable("UdpServer", LOG_LEVEL_INFO); NodeContainer nodes; nodes.create (2); WifiHelperwifi; wifi.setstandard (WIFI_PHY_STANDARD_80211b); Με το παρακάτω κομμάτι κώδικα, καθορίζουμε τα RxGain και TxGain, τα οποία σχετίζονται με την ποιότητα του λαμβανόμενου και του προς αποστολή σήματος, αντίστοιχα. Επίσης, ορίζουμε το CCaMode1Threshold, το οποίο είναι ένα κατώφλι. Αν η ισχύς του λαμβανόμενου σήματος υπερβεί το εν λόγω κατώφλι, τότε ο κόμβος μεταβαίνει σε κατάσταση CCA_BUSY. YansWifiPhyHelperwifiPhy = YansWifiPhyHelper::Default (); wifiphy.set ("RxGain", DoubleValue (1)); wifiphy.set ("TxGain", DoubleValue (1)); wifiphy.set ("CcaMode1Threshold", DoubleValue (0)); Το propagation loss model που θα χρησιμοποιηθεί είναι το RangePropagationLossModel, το οποίο καθορίζει την απώλεια διαδρομής σε μέτρα. Πιο συγκεκριμένα, οι κόμβοι που βρίσκονται σε απόσταση μικρότερη ή ίση με την MaxRange, λαμβάνουν το σήμα. Ακόμα, ορίζουμε ότι θα χρησιμοποιηθεί το ConstantSpeedPropagationDelayModel, όπου η ταχύτητα μετάδοσης είναι σταθερή. YansWifiChannelHelperwifiChannel; wifichannel.setpropagationdelay ("ns3::constantspeedpropagationdelaymodel"); 2
wifichannel.addpropagationloss ("ns3::rangepropagationlossmodel","maxrange", DoubleValue (250.0)); Ptr<YansWifiChannel>wifiChannelPtr = wifichannel.create (); wifiphy.setchannel (wifichannelptr); Θέτουμε τον τύπο του αλγορίθμου για τον έλεγχο του ρυθμού που θα χρησιμοποιεί και καθορίζουμε να μην εφαρμόζεται κάποια μέθοδος εξασφάλισης της Ποιότητα της Υπηρεσίας (QualityofService) στο επίπεδο MAC, ενεργοποιούμε το μηχανισμό RTS/CTS κι ορίζουμε τις θέσεις των κόμβων του δικτύου. Επίσης, καθορίζουμε ότι το δίκτυο υποστηρίζει την αδόμητη δικτύωση (AdHoc). NqosWifiMacHelperwifiMac = NqosWifiMacHelper::Default (); wifi.setremotestationmanager ("ns3::arfwifimanager", "RtsCtsThreshold",StringValue("0")); wifimac.settype ("ns3::adhocwifimac"); NetDeviceContainer devices = wifi.install (wifiphy, wifimac, nodes); MobilityHelper mobility; Ptr<ListPositionAllocator>positionAlloc = CreateObject<ListPositionAllocator> (); positionalloc->add (Vector (0.0, 0.0, 0.0)); positionalloc->add (Vector (0.0, 100.0, 0.0)); mobility.setpositionallocator (positionalloc); mobility.setmobilitymodel ("ns3::constantpositionmobilitymodel"); mobility.install (nodes); Εν συνεχεία, θέτουμε την αρχική ενέργεια των κόμβων και την τιμή του ρεύματος σε Ampere, που συμβάλει στον υπολογισμό της κατανάλωσης της ενέργειας του κόμβου όταν μεταδίδει πακέτα. Ακόμα, εγκαθιστούμε το μοντέλο ενέργειας (WifiRadioEnergyModel) σε όλους τους κόμβους. BasicEnergySourceHelperbasicSourceHelper; basicsourcehelper.set ("BasicEnergySourceInitialEnergyJ", DoubleValue (0.1)); EnergySourceContainer sources = basicsourcehelper.install (nodes); WifiRadioEnergyModelHelperradioEnergyHelper; radioenergyhelper.set ("TxCurrentA", DoubleValue (0.0174)); DeviceEnergyModelContainerdeviceModels = radioenergyhelper.install (devices, sources); Θέτουμε τις IP διευθύνσεις που θα χρησιμοποιηθούν και τους server και client (application). InternetStackHelper internet; internet.install (nodes); Ipv4AddressHelper ipv4; ipv4.setbase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer interfaces = ipv4.assign (devices); 3
uint16_t port = 49000; UdpServerHelper server (port); ApplicationContainer apps = server.install (nodes.get (0)); apps.start(seconds(1.0)); apps.stop(seconds(12.0)); UdpClientHelper client (interfaces.getaddress (0), port); client.setattribute("maxpackets", UintegerValue(1000000)); client.setattribute("interval", TimeValue(Seconds(1))); client.setattribute("packetsize", UintegerValue(1024)); ApplicationContainer apps2 = client.install(nodes.get(1)); apps2.start(seconds(2.0)); apps2.stop(seconds(10.0)); Τέλος, καλούμε τις συναρτήσεις RemainingEnergy και TotalEnergy για να παρατηρούμε την εναπομένουσα ενέργεια των κόμβων και τη συνολική κατανάλωση της ενέργειας κάθε χρονική στιγμή, αντίστοιχα. Ptr<BasicEnergySource>basicSourcePtr = DynamicCast<BasicEnergySource> (sources.get (1)); basicsourceptr->traceconnectwithoutcontext ("RemainingEnergy", MakeCallback (&RemainingEnergy)); Ptr<DeviceEnergyModel>basicRadioModelPtr = basicsourceptr->finddeviceenergymodels ("ns3::wifiradioenergymodel").get (0); basicradiomodelptr->traceconnectwithoutcontext ("TotalEnergyConsumption", MakeCallback (&TotalEnergy)); Simulator::Stop (Seconds (13.0)); Simulator::Run (); Simulator::Destroy (); return 0; 4) Άσκηση 1. Εκτελέστε το lab7.cc σενάριο και καταγράψτε τις τελικές τιμές για την εναπομένουσα ενέργεια και τη συνολική κατανάλωση της ενέργειας. 2. Ορίστε την απόσταση μεταξύ των δύο κόμβων στα 300 μέτρα κι εκτελέστε πάλι το σενάριο. Τι παρατηρείτε? Δώστε σύντομη εξήγηση. Επιπλέον, καταγράψτε πάλι τις τελικές τιμές για την εναπομένουσα ενέργεια και τη συνολική κατανάλωση της ενέργειας. 3. Ορίστε το MaxRange στα 350 μέτρα κι εκτελέστε το σενάριο. Τι παρατηρείτε? 4
4. Συγκρίνετε τις τιμές που προέκυψαν από το ερώτημα 2 με αυτές που προέκυψαν από το ερώτημα 3. Δώστε σύντομη εξήγηση. 5. Αλλάξτε το interval σε 0.011 και καταγράψτε τα αποτελέσματα. 6. Αλλάξτε την τιμή TxCurrentA σε 0.00174. Τι παρατηρείτε? Δώστε σύντομη εξήγηση. 7. Ορίστε ο server να λειτουργεί από το δευτερόλεπτο 3 έως το 10 και τον clientαπό το 4 έως το 9. Τι παρατηρείτε? Δώστε σύντομη εξήγηση. 8. Αντικαταστήστε το RangePropagationLossModel με το LogDistancePropagationLossModel. Πώς λειτουργεί το παραπάνω μοντέλο? Καταγράψτε τα αποτελέσματα και δώστε σύντομη εξήγηση. wifichannel.addpropagationloss("ns3::logdistancepropagationlossmodel","e xponent",stringvalue ("3")); 5
Παράρτημα Κώδικα #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/mobility-module.h" #include "ns3/config-store-module.h" #include "ns3/wifi-module.h" #include "ns3/energy-module.h" #include "ns3/internet-module.h" #include "ns3/applications-module.h" #include <iostream> #include <fstream> #include <vector> #include <string> NS_LOG_COMPONENT_DEFINE ("Lab7"); using namespace ns3; void RemainingEnergy (double oldvalue, double remainingenergy) std::cout<<simulator::now ().GetSeconds () << "s Current remaining energy = " <<remainingenergy<< "Joules"<<std::endl; void TotalEnergy (double oldvalue, double totalenergy) std::cout<<simulator::now ().GetSeconds () << "s Total energy consumed = " <<totalenergy<< "Joules" <<std::endl; int main (int argc, char *argv[]) //LogComponentEnable ("EnergySource", LOG_LEVEL_DEBUG); //LogComponentEnable ("BasicEnergySource", LOG_LEVEL_DEBUG); //LogComponentEnable ("WifiRadioEnergyModel", LOG_LEVEL_DEBUG); LogComponentEnable("UdpClient", LOG_LEVEL_INFO); LogComponentEnable("UdpServer", LOG_LEVEL_INFO); std::string phymode ("DsssRate1Mbps"); NodeContainer nodes; 6
nodes.create (2); WifiHelper wifi; wifi.setstandard (WIFI_PHY_STANDARD_80211b); YansWifiPhyHelper wifiphy = YansWifiPhyHelper::Default (); wifiphy.set ("RxGain", DoubleValue (1)); wifiphy.set ("TxGain", DoubleValue (1)); wifiphy.set ("CcaMode1Threshold", DoubleValue (0)); YansWifiChannelHelper wifichannel; wifichannel.setpropagationdelay ("ns3::constantspeedpropagationdelaymodel"); wifichannel.addpropagationloss ("ns3::rangepropagationlossmodel","maxrange", DoubleValue (250.0)); Ptr<YansWifiChannel> wifichannelptr = wifichannel.create (); wifiphy.setchannel (wifichannelptr); NqosWifiMacHelper wifimac = NqosWifiMacHelper::Default (); wifi.setremotestationmanager "RtsCtsThreshold",StringValue("0")); wifimac.settype ("ns3::adhocwifimac"); ("ns3::arfwifimanager", NetDeviceContainer devices = wifi.install (wifiphy, wifimac, nodes); MobilityHelper mobility; Ptr<ListPositionAllocator> positionalloc = CreateObject<ListPositionAllocator> (); positionalloc->add (Vector (0.0, 0.0, 0.0)); positionalloc->add (Vector (0.0, 100.0, 0.0)); mobility.setpositionallocator (positionalloc); mobility.setmobilitymodel ("ns3::constantpositionmobilitymodel"); mobility.install (nodes); BasicEnergySourceHelper basicsourcehelper; basicsourcehelper.set ("BasicEnergySourceInitialEnergyJ", DoubleValue (0.1)); EnergySourceContainer sources = basicsourcehelper.install (nodes); WifiRadioEnergyModelHelper radioenergyhelper; radioenergyhelper.set ("TxCurrentA", DoubleValue (0.0174)); DeviceEnergyModelContainer devicemodels = radioenergyhelper.install (devices, sources); InternetStackHelper internet; internet.install (nodes); Ipv4AddressHelper ipv4; ipv4.setbase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer interfaces = ipv4.assign (devices); 7
uint16_t port = 49000; UdpServerHelper server (port); ApplicationContainer apps = server.install (nodes.get (0)); apps.start(seconds(1.0)); apps.stop(seconds(12.0)); UdpClientHelper client (interfaces.getaddress (0), port); client.setattribute("maxpackets", UintegerValue(1000000)); client.setattribute("interval", TimeValue(Seconds(1))); client.setattribute("packetsize", UintegerValue(1024)); ApplicationContainer apps2 = client.install(nodes.get(1)); apps2.start(seconds(2.0)); apps2.stop(seconds(10.0)); Ptr<BasicEnergySource> basicsourceptr = DynamicCast<BasicEnergySource> (sources.get (1)); basicsourceptr->traceconnectwithoutcontext ("RemainingEnergy", MakeCallback (&RemainingEnergy)); Ptr<DeviceEnergyModel> basicradiomodelptr = basicsourceptr->finddeviceenergymodels ("ns3::wifiradioenergymodel").get (0); basicradiomodelptr->traceconnectwithoutcontext ("TotalEnergyConsumption", MakeCallback (&TotalEnergy)); Simulator::Stop (Seconds (13.0)); Simulator::Run (); Simulator::Destroy (); return 0; 8