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"
196 typedef std::vector<std::pair<Time, DataRate>>
TxTime;
239 DataRate dataRate =
DataRate(phy->GetDefaultMode().GetDataRate(phy->GetChannelWidth()));
240 double power = phy->GetTxPowerEnd();
245 Mac48Address addr = wifiStaDevice->GetMac()->GetAddress();
271 for (
const auto& mode :
phy->GetModeList())
289 if (rate == i->second)
302 packet->PeekHeader(head);
331 if (state == WifiPhyState::CCA_BUSY)
336 else if (state == WifiPhyState::IDLE)
341 else if (state == WifiPhyState::TX)
346 else if (state == WifiPhyState::RX)
436 <<
" " << dest <<
" Old power=" << oldPower <<
" New power=" << newPower);
451 <<
" " << dest <<
" Old rate=" << oldRate <<
" New rate=" << newRate);
455main(
int argc,
char* argv[])
459 double maxPower = 17;
464 std::string manager =
"ns3::ParfWifiManager";
465 std::string outputFileName =
"parf";
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",
537 wifi.SetRemoteStationManager(manager,
538 "DefaultTxPowerLevel",
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);
578 stack.Install(wifiStaNodes);
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 (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin();
679 NS_LOG_INFO(
" Tx Bytes: " << i->second.txBytes <<
"\n");
680 NS_LOG_INFO(
" Rx Bytes: " << i->second.rxBytes <<
"\n");
682 << i->second.rxBytes * 8.0 /
683 (i->second.timeLastRxPacket.GetSeconds() -
684 i->second.timeFirstTxPacket.GetSeconds()) /
687 NS_LOG_INFO(
" Mean delay: " << i->second.delaySum.GetSeconds() / i->second.rxPackets
690 << i->second.jitterSum.GetSeconds() / (i->second.rxPackets - 1) <<
"\n");
697 NS_LOG_INFO(
" Tx Bytes: " << i->second.txBytes <<
"\n");
698 NS_LOG_INFO(
" Rx Bytes: " << i->second.rxBytes <<
"\n");
700 << i->second.rxBytes * 8.0 /
701 (i->second.timeLastRxPacket.GetSeconds() -
702 i->second.timeFirstTxPacket.GetSeconds()) /
705 NS_LOG_INFO(
" Mean delay: " << i->second.delaySum.GetSeconds() / i->second.rxPackets
708 << i->second.jitterSum.GetSeconds() / (i->second.rxPackets - 1) <<
"\n");
714 std::ofstream outfileTh0(
"throughput-" + outputFileName +
"-0.plt");
715 Gnuplot gnuplot =
Gnuplot(
"throughput-" + outputFileName +
"-0.eps",
"Throughput");
717 gnuplot.
SetLegend(
"Time (seconds)",
"Throughput (Mb/s)");
718 gnuplot.
SetTitle(
"Throughput (AP0 to STA) vs time");
722 if (manager ==
"ns3::ParfWifiManager" || manager ==
"ns3::AparfWifiManager" ||
723 manager ==
"ns3::RrpaaWifiManager")
725 std::ofstream outfilePower0(
"power-" + outputFileName +
"-0.plt");
726 gnuplot =
Gnuplot(
"power-" + outputFileName +
"-0.eps",
"Average Transmit Power");
728 gnuplot.
SetLegend(
"Time (seconds)",
"Power (mW)");
729 gnuplot.
SetTitle(
"Average transmit power (AP0 to STA) vs time");
734 std::ofstream outfileTx0(
"tx-" + outputFileName +
"-0.plt");
735 gnuplot =
Gnuplot(
"tx-" + outputFileName +
"-0.eps",
"Time in TX State");
737 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
738 gnuplot.
SetTitle(
"Percentage time AP0 in TX state vs time");
742 std::ofstream outfileRx0(
"rx-" + outputFileName +
"-0.plt");
743 gnuplot =
Gnuplot(
"rx-" + outputFileName +
"-0.eps",
"Time in RX State");
745 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
746 gnuplot.
SetTitle(
"Percentage time AP0 in RX state vs time");
750 std::ofstream outfileBusy0(
"busy-" + outputFileName +
"-0.plt");
751 gnuplot =
Gnuplot(
"busy-" + outputFileName +
"-0.eps",
"Time in Busy State");
753 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
754 gnuplot.
SetTitle(
"Percentage time AP0 in Busy state vs time");
758 std::ofstream outfileIdle0(
"idle-" + outputFileName +
"-0.plt");
759 gnuplot =
Gnuplot(
"idle-" + outputFileName +
"-0.eps",
"Time in Idle State");
761 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
762 gnuplot.
SetTitle(
"Percentage time AP0 in Idle state vs time");
767 std::ofstream outfileTh1(
"throughput-" + outputFileName +
"-1.plt");
768 gnuplot =
Gnuplot(
"throughput-" + outputFileName +
"-1.eps",
"Throughput");
770 gnuplot.
SetLegend(
"Time (seconds)",
"Throughput (Mb/s)");
771 gnuplot.
SetTitle(
"Throughput (AP1 to STA) vs time");
775 if (manager ==
"ns3::ParfWifiManager" || manager ==
"ns3::AparfWifiManager" ||
776 manager ==
"ns3::RrpaaWifiManager")
778 std::ofstream outfilePower1(
"power-" + outputFileName +
"-1.plt");
779 gnuplot =
Gnuplot(
"power-" + outputFileName +
"-1.eps",
"Average Transmit Power");
781 gnuplot.
SetLegend(
"Time (seconds)",
"Power (mW)");
782 gnuplot.
SetTitle(
"Average transmit power (AP1 to STA) vs time");
787 std::ofstream outfileTx1(
"tx-" + outputFileName +
"-1.plt");
788 gnuplot =
Gnuplot(
"tx-" + outputFileName +
"-1.eps",
"Time in TX State");
790 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
791 gnuplot.
SetTitle(
"Percentage time AP1 in TX state vs time");
795 std::ofstream outfileRx1(
"rx-" + outputFileName +
"-1.plt");
796 gnuplot =
Gnuplot(
"rx-" + outputFileName +
"-1.eps",
"Time in RX State");
798 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
799 gnuplot.
SetTitle(
"Percentage time AP1 in RX state vs time");
803 std::ofstream outfileBusy1(
"busy-" + outputFileName +
"-1.plt");
804 gnuplot =
Gnuplot(
"busy-" + outputFileName +
"-1.eps",
"Time in Busy State");
806 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
807 gnuplot.
SetTitle(
"Percentage time AP1 in Busy state vs time");
811 std::ofstream outfileIdle1(
"idle-" + outputFileName +
"-1.plt");
812 gnuplot =
Gnuplot(
"idle-" + outputFileName +
"-1.eps",
"Time in Idle State");
814 gnuplot.
SetLegend(
"Time (seconds)",
"Percent");
815 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.
Gnuplot2dDataset m_output_power
Power output data.
double m_totalTxTime
Total time in TX state.
Gnuplot2dDataset GetPowerDatafile()
Get the Power output data.
TxTime m_timeTable
Time, DataRate table.
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.
double m_totalTime
Time spent on a given state.
uint32_t m_bytesTotal
Number of received bytes on a given state.
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.
std::map< Mac48Address, double > m_currentPower
Current Tx power for each sender.
double m_totalEnergy
Energy used on a given state.
Gnuplot2dDataset m_output
Throughput output data.
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.
std::map< Mac48Address, DataRate > m_currentRate
Current Tx rate for each sender.
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.
void Add(double x, double y)
void SetTitle(const std::string &title)
Change line title.
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.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
Smart pointer class similar to boost::intrusive_ptr.
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.
AttributeValue implementation for Ssid.
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.
AttributeValue implementation for Time.
Hold an unsigned integer type.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
void SetType(std::string type, Args &&... args)
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.
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.
static const uint32_t packetSize
Packet size generated at the AP.
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.