58 #include "ns3/command-line.h"
59 #include "ns3/config.h"
60 #include "ns3/double.h"
61 #include "ns3/flow-monitor-helper.h"
62 #include "ns3/gnuplot.h"
63 #include "ns3/internet-stack-helper.h"
64 #include "ns3/ipv4-address-helper.h"
65 #include "ns3/ipv4-flow-classifier.h"
67 #include "ns3/mobility-helper.h"
68 #include "ns3/on-off-helper.h"
69 #include "ns3/packet-sink-helper.h"
71 #include "ns3/uinteger.h"
72 #include "ns3/wifi-mac-header.h"
73 #include "ns3/wifi-mac.h"
74 #include "ns3/wifi-net-device.h"
75 #include "ns3/yans-wifi-channel.h"
76 #include "ns3/yans-wifi-helper.h"
104 void CheckStatistics(
double time);
192 double GetBusyTime()
const;
196 typedef std::vector<std::pair<Time, DataRate>>
TxTime;
211 std::map<Mac48Address, double> m_currentPower;
212 std::map<Mac48Address, DataRate> m_currentRate;
213 uint32_t m_bytesTotal;
214 double m_totalEnergy;
240 double power =
phy->GetTxPowerEnd();
241 for (uint32_t j = 0; j < stas.
GetN(); j++)
246 m_currentPower[addr] = power;
247 m_currentRate[addr] = dataRate;
249 m_currentRate[
Mac48Address(
"ff:ff:ff:ff:ff:ff")] = dataRate;
261 m_output.SetTitle(
"Throughput Mbits/s");
262 m_output_idle.SetTitle(
"Idle Time");
263 m_output_busy.SetTitle(
"Busy Time");
264 m_output_rx.SetTitle(
"RX Time");
265 m_output_tx.SetTitle(
"TX Time");
271 for (
const auto& mode :
phy->GetModeList())
277 DataRate dataRate(mode.GetDataRate(
phy->GetChannelWidth()));
280 m_timeTable.emplace_back(time, dataRate);
287 for (
auto i = m_timeTable.begin(); i != m_timeTable.end(); i++)
289 if (rate == i->second)
307 m_totalEnergy += pow(10.0, m_currentPower[dest] / 10.0) *
308 GetCalcTxTime(m_currentRate[dest]).GetSeconds();
309 m_totalTime += GetCalcTxTime(m_currentRate[dest]).GetSeconds();
316 m_currentPower[dest] = newPower;
325 m_currentRate[dest] = newRate;
356 m_bytesTotal += packet->
GetSize();
362 double mbs = ((m_bytesTotal * 8.0) / (1000000 * time));
364 double atp = m_totalEnergy / time;
370 m_output_idle.Add((
Simulator::Now()).GetSeconds(), idleTime * 100);
371 m_output_busy.Add((
Simulator::Now()).GetSeconds(), busyTime * 100);
391 return m_output_power;
397 return m_output_idle;
403 return m_output_busy;
421 return m_totalBusyTime + m_totalRxTime;
436 <<
" " << dest <<
" Old power=" << oldPower <<
" New power=" << newPower);
451 <<
" " << dest <<
" Old rate=" << oldRate <<
" New rate=" << newRate);
455 main(
int argc,
char* argv[])
459 double maxPower = 17;
461 uint32_t powerLevels = 18;
463 uint32_t rtsThreshold = 2346;
464 std::string manager =
"ns3::ParfWifiManager";
465 std::string outputFileName =
"parf";
474 uint32_t simuTime = 100;
477 cmd.AddValue(
"manager",
"PRC Manager", manager);
478 cmd.AddValue(
"rtsThreshold",
"RTS threshold", rtsThreshold);
479 cmd.AddValue(
"outputFileName",
"Output filename", outputFileName);
480 cmd.AddValue(
"simuTime",
"Total simulation time (sec)", simuTime);
481 cmd.AddValue(
"maxPower",
"Maximum available transmission level (dbm).", maxPower);
482 cmd.AddValue(
"minPower",
"Minimum available transmission level (dbm).", minPower);
483 cmd.AddValue(
"powerLevels",
484 "Number of transmission power levels available between "
485 "TxPowerStart and TxPowerEnd included.",
487 cmd.AddValue(
"AP1_x",
"Position of AP1 in x coordinate", ap1_x);
488 cmd.AddValue(
"AP1_y",
"Position of AP1 in y coordinate", ap1_y);
489 cmd.AddValue(
"STA1_x",
"Position of STA1 in x coordinate", sta1_x);
490 cmd.AddValue(
"STA1_y",
"Position of STA1 in y coordinate", sta1_y);
491 cmd.AddValue(
"AP2_x",
"Position of AP2 in x coordinate", ap2_x);
492 cmd.AddValue(
"AP2_y",
"Position of AP2 in y coordinate", ap2_y);
493 cmd.AddValue(
"STA2_x",
"Position of STA2 in x coordinate", sta2_x);
494 cmd.AddValue(
"STA2_y",
"Position of STA2 in y coordinate", sta2_y);
495 cmd.Parse(argc, argv);
518 wifi.SetRemoteStationManager(
"ns3::AarfWifiManager",
525 wifiMac.
SetType(
"ns3::StaWifiMac",
533 wifiMac.
SetType(
"ns3::StaWifiMac",
"Ssid", SsidValue(
ssid));
537 wifi.SetRemoteStationManager(manager,
538 "DefaultTxPowerLevel",
547 wifiMac.
SetType(
"ns3::ApWifiMac",
"Ssid", SsidValue(
ssid));
548 wifiApDevices.
Add(
wifi.Install(wifiPhy, wifiMac, wifiApNodes.
Get(0)));
551 wifiMac.
SetType(
"ns3::ApWifiMac",
556 wifiApDevices.
Add(
wifi.Install(wifiPhy, wifiMac, wifiApNodes.
Get(1)));
558 wifiDevices.
Add(wifiStaDevices);
559 wifiDevices.
Add(wifiApDevices);
564 positionAlloc->Add(Vector(ap1_x, ap1_y, 0.0));
565 positionAlloc->Add(Vector(sta1_x, sta1_y, 0.0));
566 positionAlloc->Add(Vector(ap2_x, ap2_y, 0.0));
567 positionAlloc->Add(Vector(sta2_x, sta2_y, 0.0));
568 mobility.SetPositionAllocator(positionAlloc);
569 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
577 stack.Install(wifiApNodes);
580 address.SetBase(
"10.1.1.0",
"255.255.255.0");
603 apps_source.
Add(onoff1.Install(wifiApNodes.
Get(1)));
623 Config::Connect(
"/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" +
624 manager +
"/PowerChange",
626 Config::Connect(
"/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" +
627 manager +
"/RateChange",
629 Config::Connect(
"/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" +
630 manager +
"/PowerChange",
632 Config::Connect(
"/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" +
633 manager +
"/RateChange",
636 Config::Connect(
"/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxBegin",
638 Config::Connect(
"/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxBegin",
643 "/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/State/State",
646 "/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/State/State",
653 Config::Connect(
"/NodeList/[0-1]/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" +
654 manager +
"/PowerChange",
656 Config::Connect(
"/NodeList/[0-1]/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" +
657 manager +
"/RateChange",
669 std::map<FlowId, FlowMonitor::FlowStats> stats = monitor->GetFlowStats();
670 for (
auto i = stats.begin(); i != stats.end(); ++i)
677 NS_LOG_INFO(
" Tx Bytes: " << i->second.txBytes <<
"\n");
678 NS_LOG_INFO(
" Rx Bytes: " << i->second.rxBytes <<
"\n");
680 << i->second.rxBytes * 8.0 /
681 (i->second.timeLastRxPacket.GetSeconds() -
682 i->second.timeFirstTxPacket.GetSeconds()) /
685 NS_LOG_INFO(
" Mean delay: " << i->second.delaySum.GetSeconds() / i->second.rxPackets
688 << i->second.jitterSum.GetSeconds() / (i->second.rxPackets - 1) <<
"\n");
695 NS_LOG_INFO(
" Tx Bytes: " << i->second.txBytes <<
"\n");
696 NS_LOG_INFO(
" Rx Bytes: " << i->second.rxBytes <<
"\n");
698 << i->second.rxBytes * 8.0 /
699 (i->second.timeLastRxPacket.GetSeconds() -
700 i->second.timeFirstTxPacket.GetSeconds()) /
703 NS_LOG_INFO(
" Mean delay: " << i->second.delaySum.GetSeconds() / i->second.rxPackets
706 << i->second.jitterSum.GetSeconds() / (i->second.rxPackets - 1) <<
"\n");
712 std::ofstream outfileTh0(
"throughput-" + outputFileName +
"-0.plt");
713 Gnuplot gnuplot =
Gnuplot(
"throughput-" + outputFileName +
"-0.eps",
"Throughput");
715 gnuplot.
SetLegend(
"Time (seconds)",
"Throughput (Mb/s)");
716 gnuplot.
SetTitle(
"Throughput (AP0 to STA) vs time");
720 if (manager ==
"ns3::ParfWifiManager" || manager ==
"ns3::AparfWifiManager" ||
721 manager ==
"ns3::RrpaaWifiManager")
723 std::ofstream outfilePower0(
"power-" + outputFileName +
"-0.plt");
724 gnuplot =
Gnuplot(
"power-" + outputFileName +
"-0.eps",
"Average Transmit Power");
726 gnuplot.
SetLegend(
"Time (seconds)",
"Power (mW)");
727 gnuplot.
SetTitle(
"Average transmit power (AP0 to STA) vs time");
732 std::ofstream outfileTx0(
"tx-" + outputFileName +
"-0.plt");
733 gnuplot =
Gnuplot(
"tx-" + outputFileName +
"-0.eps",
"Time in TX State");
735 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
736 gnuplot.
SetTitle(
"Percentage time AP0 in TX state vs time");
740 std::ofstream outfileRx0(
"rx-" + outputFileName +
"-0.plt");
741 gnuplot =
Gnuplot(
"rx-" + outputFileName +
"-0.eps",
"Time in RX State");
743 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
744 gnuplot.
SetTitle(
"Percentage time AP0 in RX state vs time");
748 std::ofstream outfileBusy0(
"busy-" + outputFileName +
"-0.plt");
749 gnuplot =
Gnuplot(
"busy-" + outputFileName +
"-0.eps",
"Time in Busy State");
751 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
752 gnuplot.
SetTitle(
"Percentage time AP0 in Busy state vs time");
756 std::ofstream outfileIdle0(
"idle-" + outputFileName +
"-0.plt");
757 gnuplot =
Gnuplot(
"idle-" + outputFileName +
"-0.eps",
"Time in Idle State");
759 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
760 gnuplot.
SetTitle(
"Percentage time AP0 in Idle state vs time");
765 std::ofstream outfileTh1(
"throughput-" + outputFileName +
"-1.plt");
766 gnuplot =
Gnuplot(
"throughput-" + outputFileName +
"-1.eps",
"Throughput");
768 gnuplot.
SetLegend(
"Time (seconds)",
"Throughput (Mb/s)");
769 gnuplot.
SetTitle(
"Throughput (AP1 to STA) vs time");
773 if (manager ==
"ns3::ParfWifiManager" || manager ==
"ns3::AparfWifiManager" ||
774 manager ==
"ns3::RrpaaWifiManager")
776 std::ofstream outfilePower1(
"power-" + outputFileName +
"-1.plt");
777 gnuplot =
Gnuplot(
"power-" + outputFileName +
"-1.eps",
"Average Transmit Power");
779 gnuplot.
SetLegend(
"Time (seconds)",
"Power (mW)");
780 gnuplot.
SetTitle(
"Average transmit power (AP1 to STA) vs time");
785 std::ofstream outfileTx1(
"tx-" + outputFileName +
"-1.plt");
786 gnuplot =
Gnuplot(
"tx-" + outputFileName +
"-1.eps",
"Time in TX State");
788 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
789 gnuplot.
SetTitle(
"Percentage time AP1 in TX state vs time");
793 std::ofstream outfileRx1(
"rx-" + outputFileName +
"-1.plt");
794 gnuplot =
Gnuplot(
"rx-" + outputFileName +
"-1.eps",
"Time in RX State");
796 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
797 gnuplot.
SetTitle(
"Percentage time AP1 in RX state vs time");
801 std::ofstream outfileBusy1(
"busy-" + outputFileName +
"-1.plt");
802 gnuplot =
Gnuplot(
"busy-" + outputFileName +
"-1.eps",
"Time in Busy State");
804 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
805 gnuplot.
SetTitle(
"Percentage time AP1 in Busy state vs time");
809 std::ofstream outfileIdle1(
"idle-" + outputFileName +
"-1.plt");
810 gnuplot =
Gnuplot(
"idle-" + outputFileName +
"-1.eps",
"Time in Idle State");
812 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
813 gnuplot.
SetTitle(
"Percentage time AP1 in Idle state vs time");
Class to collect node statistics.
Gnuplot2dDataset m_output_busy
BUSY output data.
double m_totalIdleTime
Total time in IDLE state.
double m_totalTxTime
Total time in TX state.
Gnuplot2dDataset GetPowerDatafile()
Get the Power output data.
void RateCallback(std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
Gnuplot2dDataset GetDatafile()
Get the Throughput output data.
void RxCallback(std::string path, Ptr< const Packet > packet, const Address &from)
Callback called by PacketSink/Rx.
NodeStatistics(NetDeviceContainer aps, NetDeviceContainer stas)
Constructor.
Gnuplot2dDataset GetTxDatafile()
Get the TX state output data.
double m_totalBusyTime
Total time in BUSY state.
Time GetCalcTxTime(DataRate rate)
Get the time at which a given datarate has been recorded.
double idleTime
IDLE time.
void PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest)
Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
Gnuplot2dDataset GetRxDatafile()
Get the RX state output data.
void SetupPhy(Ptr< WifiPhy > phy)
Setup the WifiPhy object.
std::vector< std::pair< Time, DataRate > > TxTime
Time, DataRate pair vector.
Gnuplot2dDataset m_output_tx
TX output data.
Gnuplot2dDataset GetBusyDatafile()
Get the BUSY state output data.
double m_totalRxTime
Total time in RX state.
void CheckStatistics(double time)
Collects the statistics at a given time.
double busyTime
BUSY time.
void StateCallback(std::string path, Time init, Time duration, WifiPhyState state)
Callback called by YansWifiPhy/State/State.
Gnuplot2dDataset m_output_rx
RX output data.
Gnuplot2dDataset m_output_idle
IDLE output data.
Gnuplot2dDataset GetIdleDatafile()
Get the IDLE state output data.
double GetBusyTime() const
Get the Busy time.
void PhyCallback(std::string path, Ptr< const Packet > packet, double powerW)
Callback called by WifiNetDevice/Phy/PhyTxBegin.
a polymophic address class
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
void Stop(Time stop) const
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container.
Parse command-line arguments.
Class for representing data rates.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Helper to enable IP flow monitoring on a set of Nodes.
Ptr< FlowClassifier > GetClassifier()
Retrieve the FlowClassifier object for IPv4 created by the Install* methods.
Ptr< FlowMonitor > InstallAll()
Enable flow monitoring on all nodes.
Class to represent a 2D points plot.
a simple class to generate gnuplot-ready plotting commands from a set of datasets.
void AddDataset(const GnuplotDataset &dataset)
void SetLegend(const std::string &xLegend, const std::string &yLegend)
void SetTerminal(const std::string &terminal)
void GenerateOutput(std::ostream &os)
Writes gnuplot commands and data values to a single output stream.
void SetTitle(const std::string &title)
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Ipv4 addresses are stored in host order in this class.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
uint32_t GetN() const
Get the number of Ptr<NetDevice> stored in this container.
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static Time Now()
Return the current simulation virtual time.
static void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
The IEEE 802.11 SSID Information Element.
Simulation virtual time values and global simulation resolution.
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Hold an unsigned integer type.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
void SetType(std::string type, Args &&... args)
Mac48Address GetAddress() const
Ptr< WifiMac > GetMac() const
Ptr< WifiPhy > GetPhy() const
void Set(std::string name, const AttributeValue &v)
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetChannelWidth(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
manage and create wifi channel objects for the YANS model.
static YansWifiChannelHelper Default()
Create a channel helper in a default working state.
Ptr< YansWifiChannel > Create() const
Make it easy to create and manage PHY objects for the YANS model.
void SetChannel(Ptr< YansWifiChannel > channel)
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
void Connect(std::string path, const CallbackBase &cb)
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionally.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Structure to classify a packet.
Ipv4Address sourceAddress
Source address.
Ipv4Address destinationAddress
Destination address.
WifiPhyState
The state of the PHY layer.
@ CCA_BUSY
The PHY layer has sense the medium busy through the CCA mechanism.
@ RX
The PHY layer is receiving a packet.
@ TX
The PHY layer is sending a packet.
@ IDLE
The PHY layer is IDLE.
void RateCallback(std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
static const uint32_t packetSize
Packet size generated at the AP.
void PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest)
Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
Ptr< PacketSink > sink
Pointer to the packet sink application.