20 #include "ns3/command-line.h"
21 #include "ns3/gnuplot.h"
22 #include "ns3/mobility-helper.h"
23 #include "ns3/spectrum-analyzer-helper.h"
24 #include "ns3/spectrum-channel.h"
25 #include "ns3/spectrum-helper.h"
26 #include "ns3/spectrum-wifi-helper.h"
28 #include "ns3/string.h"
50 sourceDevice->Send(pkt, destination, 0);
54 main(
int argc,
char** argv)
56 std::string standard =
"11a";
61 cmd.AddValue(
"standard",
62 "OFDM-based Wi-Fi standard [11a, 11p_10MHZ, 11p_5MHZ, 11n_2_4GHZ, 11n_5GHZ, 11ac, "
63 "11ax_2_4GHZ, 11ax_5GHZ]",
65 cmd.AddValue(
"bw",
"Bandwidth (consistent with standard, in MHz)", bw);
66 cmd.AddValue(
"txPower",
"Transmit power (dBm)", pow);
67 cmd.AddValue(
"verbose",
68 "Display log messages for WifiSpectrumValueHelper and SpectrumWifiPhy",
70 cmd.Parse(argc, argv);
80 if (standard ==
"11a")
84 dataRate =
"OfdmRate6Mbps";
88 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
92 else if (standard ==
"11p_10MHZ")
96 dataRate =
"OfdmRate3MbpsBW10MHz";
102 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
106 else if (standard ==
"11p_5MHZ")
110 dataRate =
"OfdmRate1_5MbpsBW5MHz";
116 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
120 else if (standard ==
"11n_2_4GHZ")
125 freq = 2402 + (bw / 2);
128 if (bw != 20 && bw != 40)
130 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
134 else if (standard ==
"11n_5GHZ")
139 freq = 5170 + (bw / 2);
141 if (bw != 20 && bw != 40)
143 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
147 else if (standard ==
"11ac")
151 dataRate =
"VhtMcs0";
152 freq = 5170 + (bw / 2);
155 if (bw != 20 && bw != 40 && bw != 80 && bw != 160)
157 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
161 else if (standard ==
"11ax_2_4GHZ")
166 freq = 2402 + (bw / 2);
169 if (bw != 20 && bw != 40 && bw != 80)
171 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
175 else if (standard ==
"11ax_5GHZ")
180 freq = 5170 + (bw / 2);
183 if (bw != 20 && bw != 40 && bw != 80 && bw != 160)
185 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
191 std::cout <<
"Unknown OFDM standard (please refer to the listed possible values)"
208 spectrumAnalyzerNodes.
Create(1);
209 allNodes.
Add(wifiNodes);
210 allNodes.
Add(spectrumAnalyzerNodes);
214 wifiStaNode.
Add(wifiNodes.
Get(1));
218 channelHelper.
SetChannel(
"ns3::MultiModelSpectrumChannel");
235 wifi.SetRemoteStationManager(
"ns3::ConstantRateWifiManager",
241 mac.SetType(
"ns3::StaWifiMac",
"Ssid", SsidValue(
ssid),
"ActiveProbing",
BooleanValue(
false));
243 mac.SetType(
"ns3::ApWifiMac",
246 "EnableBeaconJitter",
252 nodePositionList->Add(Vector(0.0, 1.0, 0.0));
253 nodePositionList->Add(Vector(1.0, 0.0, 0.0));
254 nodePositionList->Add(Vector(0.0, 0.0, 0.0));
255 mobility.SetPositionAllocator(nodePositionList);
256 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
266 staDevice.
Get(0)->GetAddress());
269 std::vector<double> freqs;
271 int band = (bw + margin);
272 freqs.reserve(4 * 10 * band);
273 for (
int i = 0; i < (4 * 10 * band); ++i)
275 freqs.push_back(i * 1e5 + (freq - 2 * band) * 1e6);
287 std::ostringstream ossFileName;
288 ossFileName <<
"spectrum-analyzer-wifi-" << standard <<
"-" << bw <<
"MHz";
291 spectrumAnalyzerHelper.
Install(spectrumAnalyzerNodes);
300 ossFileName <<
"-2-0";
301 std::ostringstream ossPlt;
302 ossPlt << ossFileName.str() <<
".plt";
303 std::ofstream plotFile(ossPlt.str());
304 std::ostringstream ossPng;
305 ossPng << ossFileName.str() <<
".png";
308 std::ostringstream ossExtra;
309 ossExtra <<
"file = '" << ossFileName.str() <<
"'";
323 plot.
AppendExtra(
"set ylabel \"freq (MHz)\" offset 15,0,0");
324 plot.
AppendExtra(
"set zlabel \"PSD (dBW/Hz)\" offset 15,0,0");
330 plot.
AppendExtra(
"set grid ytics mytics ztics mztics");
337 plot.
AppendExtra(
"splot filename using ($1*1000.0):($2/1e6):(10*log10($3/refW))");
344 std::cout <<
"Simulation done!" << std::endl;
345 std::cout <<
"See spectrum analyzer output file: " << ossFileName.str() <<
".tr" << std::endl;
346 std::cout <<
"To generate plot simply execute the following command: gnuplot "
347 << ossFileName.str() <<
".plt" << std::endl;
a polymophic address class
Parse command-line arguments.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
a simple class to generate gnuplot-ready plotting commands from a set of datasets.
void AppendExtra(const std::string &extra)
void GenerateOutput(std::ostream &os)
Writes gnuplot commands and data values to a single output stream.
void SetExtra(const std::string &extra)
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
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.
void Add(const NodeContainer &nc)
Append the contents of another NodeContainer to the end of this container.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
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 void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Class to allow the Spectrum Analysis.
NetDeviceContainer Install(NodeContainer c) const
void SetPhyAttribute(std::string name, const AttributeValue &v)
void SetChannel(Ptr< SpectrumChannel > channel)
Set the SpectrumChannel that will be used by SpectrumPhy instances created by this helper.
void EnableAsciiAll(std::string prefix)
Enable ASCII output.
void SetRxSpectrumModel(Ptr< SpectrumModel > m)
Set the spectrum model used by the created SpectrumAnalyzer instances to represent incoming signals.
Ptr< SpectrumChannel > Create() const
static SpectrumChannelHelper Default()
Setup a default SpectrumChannel.
void AddSpectrumPropagationLoss(std::string name, Ts &&... args)
void SetChannel(std::string type, Ts &&... args)
Make it easy to create and manage PHY objects for the spectrum model.
void SetChannel(const Ptr< SpectrumChannel > channel)
The IEEE 802.11 SSID Information Element.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
Hold an unsigned integer type.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
void Set(std::string name, const AttributeValue &v)
void SetErrorRateModel(std::string type, Args &&... args)
Helper function used to set the error rate model.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void LogComponentEnable(const std::string &name, LogLevel level)
Enable the logging output associated with that log component.
@ LOG_LEVEL_ALL
Print everything.
@ LOG_PREFIX_ALL
All prefixes.
void LogComponentEnableAll(LogLevel level)
Enable the logging output for all registered log components.
void SendPacket(Ptr< NetDevice > sourceDevice, Address &destination)
This example (inspired from tv-trans-example) enables to generate the transmitted spectra of Wi-Fi st...