9#include "ns3/command-line.h"
10#include "ns3/gnuplot.h"
11#include "ns3/mobility-helper.h"
12#include "ns3/spectrum-analyzer-helper.h"
13#include "ns3/spectrum-channel.h"
14#include "ns3/spectrum-helper.h"
15#include "ns3/spectrum-wifi-helper.h"
17#include "ns3/string.h"
18#include "ns3/wifi-utils.h"
40 sourceDevice->Send(pkt, destination, 0);
44main(
int argc,
char** argv)
46 std::string standardStr =
"11a";
51 cmd.AddValue(
"standard",
52 "OFDM-based Wi-Fi standard [11a, 11p_10MHZ, 11p_5MHZ, 11n_2_4GHZ, 11n_5GHZ, 11ac, "
53 "11ax_2_4GHZ, 11ax_5GHZ]",
55 cmd.AddValue(
"bw",
"Bandwidth (consistent with standard, in MHz)", bw);
56 cmd.AddValue(
"txPower",
"Transmit power (dBm)", pow);
57 cmd.AddValue(
"verbose",
58 "Display log messages for WifiSpectrumValueHelper and SpectrumWifiPhy",
60 cmd.Parse(argc, argv);
70 WifiStandard standard{WifiStandard::WIFI_STANDARD_UNSPECIFIED};
72 std::string channelBand;
73 if (standardStr ==
"11a")
77 channelBand =
"BAND_5GHZ";
79 dataRate =
"OfdmRate6Mbps";
83 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
87 else if (standardStr ==
"11p_10MHZ")
91 channelBand =
"BAND_5GHZ";
93 dataRate =
"OfdmRate3MbpsBW10MHz";
99 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
103 else if (standardStr ==
"11p_5MHZ")
107 channelBand =
"BAND_5GHZ";
109 dataRate =
"OfdmRate1_5MbpsBW5MHz";
115 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
119 else if (standardStr ==
"11n_2_4GHZ")
123 channelBand =
"BAND_2_4GHZ";
126 freq =
MHz_u{2402} + (bw / 2);
131 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
135 else if (standardStr ==
"11n_5GHZ")
139 channelBand =
"BAND_5GHZ";
142 freq =
MHz_u{5170} + (bw / 2);
146 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
150 else if (standardStr ==
"11ac")
154 channelBand =
"BAND_5GHZ";
156 dataRate =
"VhtMcs0";
157 freq =
MHz_u{5170} + (bw / 2);
162 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
166 else if (standardStr ==
"11ax_2_4GHZ")
170 channelBand =
"BAND_2_4GHZ";
173 freq =
MHz_u{2402} + (bw / 2);
178 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
182 else if (standardStr ==
"11ax_5GHZ")
186 channelBand =
"BAND_5GHZ";
189 freq =
MHz_u{5170} + (bw / 2);
194 std::cout <<
"Bandwidth is not compatible with standard" << std::endl;
200 std::cout <<
"Unknown OFDM standard (please refer to the listed possible values)"
217 spectrumAnalyzerNodes.
Create(1);
218 allNodes.
Add(wifiNodes);
219 allNodes.
Add(spectrumAnalyzerNodes);
223 wifiStaNode.
Add(wifiNodes.
Get(1));
227 channelHelper.
SetChannel(
"ns3::MultiModelSpectrumChannel");
241 std::ostringstream channelSettings;
242 channelSettings <<
"{" << +channelNumber <<
", " << bw <<
", " << channelBand <<
", 0}";
243 spectrumPhy.
Set(
"ChannelSettings",
StringValue(channelSettings.str()));
246 wifi.SetStandard(standard);
247 wifi.SetRemoteStationManager(
"ns3::ConstantRateWifiManager",
255 mac.SetType(
"ns3::ApWifiMac",
258 "EnableBeaconJitter",
264 nodePositionList->Add(Vector(0.0, 1.0, 0.0));
265 nodePositionList->Add(Vector(1.0, 0.0, 0.0));
266 nodePositionList->Add(Vector(0.0, 0.0, 0.0));
267 mobility.SetPositionAllocator(nodePositionList);
268 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
278 staDevice.
Get(0)->GetAddress());
281 std::vector<double> freqs;
282 const MHz_u margin{2};
283 const auto band = (bw + margin);
284 freqs.reserve(4 * 10 * band);
285 const MHz_u scale{0.1};
286 for (
int i = 0; i < (4 * 10 * band); ++i)
288 freqs.push_back(
MHzToHz((i * scale) + (freq - 2 * band)));
300 std::ostringstream ossFileName;
301 ossFileName <<
"spectrum-analyzer-wifi-" << standardStr <<
"-" << bw <<
"MHz";
304 spectrumAnalyzerHelper.
Install(spectrumAnalyzerNodes);
313 ossFileName <<
"-2-0";
314 std::ostringstream ossPlt;
315 ossPlt << ossFileName.str() <<
".plt";
316 std::ofstream plotFile(ossPlt.str());
317 std::ostringstream ossPng;
318 ossPng << ossFileName.str() <<
".png";
321 std::ostringstream ossExtra;
322 ossExtra <<
"file = '" << ossFileName.str() <<
"'";
336 plot.
AppendExtra(
"set ylabel \"freq (MHz)\" offset 15,0,0");
337 plot.
AppendExtra(
"set zlabel \"PSD (dBW/Hz)\" offset 15,0,0");
343 plot.
AppendExtra(
"set grid ytics mytics ztics mztics");
350 plot.
AppendExtra(
"splot filename using ($1*1000.0):($2/1e6):(10*log10($3/refW))");
357 std::cout <<
"Simulation done!" << std::endl;
358 std::cout <<
"See spectrum analyzer output file: " << ossFileName.str() <<
".tr" << std::endl;
359 std::cout <<
"To generate plot simply execute the following command: gnuplot "
360 << ossFileName.str() <<
".plt" << std::endl;
a polymophic address class
AttributeValue implementation for Boolean.
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.
AttributeValue implementation for Ssid.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
AttributeValue implementation for Time.
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.
static ConstIterator FindFirst(uint8_t number, MHz_u frequency, MHz_u width, WifiStandard standard, WifiPhyBand band, ConstIterator start=m_frequencyChannels.begin())
Find the first frequency segment matching the specified parameters.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
WifiPhyBand
Identifies the PHY band.
@ WIFI_PHY_BAND_UNSPECIFIED
Unspecified.
@ WIFI_PHY_BAND_2_4GHZ
The 2.4 GHz band.
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
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.
Hz_u MHzToHz(MHz_u val)
Convert from MHz to Hz.
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...