25 #include "ns3/command-line.h"
26 #include "ns3/config.h"
27 #include "ns3/internet-stack-helper.h"
28 #include "ns3/ipv4-address-helper.h"
29 #include "ns3/mobility-helper.h"
30 #include "ns3/multi-model-spectrum-channel.h"
31 #include "ns3/non-communicating-net-device.h"
32 #include "ns3/on-off-helper.h"
33 #include "ns3/packet-sink-helper.h"
34 #include "ns3/packet-sink.h"
35 #include "ns3/propagation-loss-model.h"
36 #include "ns3/spectrum-wifi-helper.h"
38 #include "ns3/string.h"
39 #include "ns3/udp-client-server-helper.h"
40 #include "ns3/udp-server.h"
41 #include "ns3/waveform-generator-helper.h"
42 #include "ns3/waveform-generator.h"
43 #include "ns3/wifi-net-device.h"
44 #include "ns3/yans-wifi-channel.h"
45 #include "ns3/yans-wifi-helper.h"
120 uint16_t channelFreqMhz,
144 bandInfo.
fc = 5180e6;
145 bandInfo.
fl = 5180e6 - 10e6;
146 bandInfo.
fh = 5180e6 + 10e6;
149 bands.push_back(bandInfo);
165 bandInfo.
fc = 5190e6;
166 bandInfo.
fl = 5190e6 - 10e6;
167 bandInfo.
fh = 5190e6 + 10e6;
170 bands.push_back(bandInfo);
180 main(
int argc,
char* argv[])
183 double distance = 50;
184 double simulationTime = 10;
185 uint16_t index = 256;
186 std::string wifiType =
"ns3::SpectrumWifiPhy";
187 std::string errorModelType =
"ns3::NistErrorRateModel";
188 bool enablePcap =
false;
189 const uint32_t tcpPacketSize = 1448;
190 double waveformPower = 0;
193 cmd.AddValue(
"simulationTime",
"Simulation time in seconds", simulationTime);
194 cmd.AddValue(
"udp",
"UDP if set to 1, TCP otherwise", udp);
195 cmd.AddValue(
"distance",
"meters separation between nodes", distance);
196 cmd.AddValue(
"index",
"restrict index to single value between 0 and 31", index);
197 cmd.AddValue(
"wifiType",
"select ns3::SpectrumWifiPhy or ns3::YansWifiPhy", wifiType);
198 cmd.AddValue(
"errorModelType",
199 "select ns3::NistErrorRateModel or ns3::YansErrorRateModel",
201 cmd.AddValue(
"enablePcap",
"enable pcap output", enablePcap);
202 cmd.AddValue(
"waveformPower",
"Waveform power (linear W)", waveformPower);
203 cmd.Parse(argc, argv);
205 uint16_t startIndex = 0;
206 uint16_t stopIndex = 31;
213 std::cout <<
"wifiType: " << wifiType <<
" distance: " << distance
214 <<
"m; time: " << simulationTime <<
"; TxPower: 16 dBm (40 mW)" << std::endl;
215 std::cout << std::setw(5) <<
"index" << std::setw(6) <<
"MCS" << std::setw(13) <<
"Rate (Mb/s)"
216 << std::setw(12) <<
"Tput (Mb/s)" << std::setw(10) <<
"Received " << std::setw(12)
217 <<
"Signal (dBm)" << std::setw(12) <<
"Noi+Inf(dBm)" << std::setw(9) <<
"SNR (dB)"
219 for (uint16_t i = startIndex; i <= stopIndex; i++)
221 uint32_t payloadSize;
237 interferingNode.
Create(1);
242 uint16_t frequency = (i <= 15 ? 5180 : 5190);
243 if (wifiType ==
"ns3::YansWifiPhy")
246 channel.AddPropagationLoss(
"ns3::FriisPropagationLossModel",
249 channel.SetPropagationDelay(
"ns3::ConstantSpeedPropagationDelayModel");
251 phy.Set(
"ChannelSettings",
252 StringValue(std::string(
"{") + (frequency == 5180 ?
"36" :
"38") +
253 ", 0, BAND_5GHZ, 0}"));
255 else if (wifiType ==
"ns3::SpectrumWifiPhy")
257 spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
259 lossModel->SetFrequency(frequency * 1e6);
260 spectrumChannel->AddPropagationLossModel(lossModel);
263 CreateObject<ConstantSpeedPropagationDelayModel>();
264 spectrumChannel->SetPropagationDelayModel(delayModel);
269 spectrumPhy.
Set(
"ChannelSettings",
270 StringValue(std::string(
"{") + (frequency == 5180 ?
"36" :
"38") +
271 ", 0, BAND_5GHZ, 0}"));
447 wifi.SetRemoteStationManager(
"ns3::ConstantRateWifiManager",
456 if (wifiType ==
"ns3::YansWifiPhy")
458 mac.SetType(
"ns3::StaWifiMac",
"Ssid", SsidValue(
ssid));
459 staDevice =
wifi.Install(
phy,
mac, wifiStaNode);
460 mac.SetType(
"ns3::ApWifiMac",
"Ssid", SsidValue(
ssid));
463 else if (wifiType ==
"ns3::SpectrumWifiPhy")
465 mac.SetType(
"ns3::StaWifiMac",
"Ssid", SsidValue(
ssid));
466 staDevice =
wifi.Install(spectrumPhy,
mac, wifiStaNode);
467 mac.SetType(
"ns3::ApWifiMac",
"Ssid", SsidValue(
ssid));
473 Config::Set(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/"
474 "ShortGuardIntervalSupported",
477 else if (i > 7 && i <= 15)
479 Config::Set(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/"
480 "ShortGuardIntervalSupported",
483 else if (i > 15 && i <= 23)
485 Config::Set(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/"
486 "ShortGuardIntervalSupported",
491 Config::Set(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/"
492 "ShortGuardIntervalSupported",
500 positionAlloc->Add(Vector(0.0, 0.0, 0.0));
501 positionAlloc->Add(Vector(distance, 0.0, 0.0));
502 positionAlloc->Add(Vector(distance, distance, 0.0));
503 mobility.SetPositionAllocator(positionAlloc);
505 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
514 stack.Install(wifiStaNode);
517 address.SetBase(
"192.168.1.0",
"255.255.255.0");
521 staNodeInterface =
address.Assign(staDevice);
522 apNodeInterface =
address.Assign(apDevice);
531 serverApp =
server.Install(wifiStaNode.
Get(0));
546 uint16_t
port = 50000;
554 onoff.SetAttribute(
"OnTime",
StringValue(
"ns3::ConstantRandomVariable[Constant=1]"));
555 onoff.SetAttribute(
"OffTime",
StringValue(
"ns3::ConstantRandomVariable[Constant=0]"));
557 onoff.SetAttribute(
"DataRate", DataRateValue(1000000000));
568 *wgPsd = waveformPower / 20e6;
572 if (wifiType ==
"ns3::SpectrumWifiPhy")
575 waveformGeneratorHelper.
SetChannel(spectrumChannel);
581 waveformGeneratorHelper.
Install(interferingNode);
585 waveformGeneratorDevices.
Get(0)
597 std::stringstream ss;
598 ss <<
"wifi-spectrum-per-example-" << i;
599 phy.EnablePcap(ss.str(), apDevice);
612 "Error: Channel width must be 20 MHz if MCS index <= 15");
615 "Error: Wi-Fi nodes must be tuned to 5180 MHz to match the waveform generator");
620 "Error: Channel width must be 40 MHz if MCS index > 15");
623 "Error: Wi-Fi nodes must be tuned to 5190 MHz to match the waveform generator");
630 uint64_t totalPacketsThrough = 0;
634 totalPacketsThrough = DynamicCast<UdpServer>(serverApp.
Get(0))->GetReceived();
636 totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
641 uint64_t totalBytesRx = DynamicCast<PacketSink>(serverApp.
Get(0))->GetTotalRx();
642 totalPacketsThrough = totalBytesRx / tcpPacketSize;
643 throughput = totalBytesRx * 8 / (simulationTime * 1000000.0);
645 std::cout << std::setw(5) << i << std::setw(6) << (i % 8) << std::setprecision(2)
646 << std::fixed << std::setw(10) << datarate << std::setw(12) <<
throughput
647 << std::setw(8) << totalPacketsThrough;
648 if (totalPacketsThrough > 0)
655 std::cout << std::setw(12) <<
"N/A" << std::setw(12) <<
"N/A" << std::setw(12) <<
"N/A"
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.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
void Stop(Time stop) const
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
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'.
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
static Ipv4Address GetAny()
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
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.
This class implements a device which does not communicate, in the sense that it does not interact wit...
Ptr< Object > GetPhy() const
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
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.
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.
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.
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
Create a server application which waits for input UDP packets and uses the information carried into t...
Hold an unsigned integer type.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
Hold together all Wifi-related objects.
void Set(std::string name, const AttributeValue &v)
void SetErrorRateModel(std::string type, Args &&... args)
Helper function used to set the error rate model.
@ DLT_IEEE802_11_RADIO
Include Radiotap link layer information.
uint16_t GetChannelWidth() const
uint16_t GetFrequency() const
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
manage and create wifi channel objects for the YANS model.
Make it easy to create and manage PHY objects for the YANS model.
Initializer for a static spectrum model centered around 5180 MHz.
static_SpectrumModelWifi5180MHz_initializer()
Initializer for a static spectrum model centered around 5190 MHz.
static_SpectrumModelWifi5190MHz_initializer()
void SetDefault(std::string name, const AttributeValue &value)
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
void Set(std::string path, const AttributeValue &value)
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#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 Seconds(double value)
Construct a Time in the indicated unit.
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
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...
double Integral(const SpectrumValue &arg)
std::vector< BandInfo > Bands
Container of BandInfo.
U * GetPointer(const Ptr< U > &p)
The building block of a SpectrumModel.
double fc
center frequency
double fl
lower limit of subband
double fh
upper limit of subband
SignalNoiseDbm structure.
double noise
noise power in dBm
double signal
signal strength in dBm
double g_signalDbmAvg
Average signal power [dBm].
double g_noiseDbmAvg
Average noise power [dBm].
Ptr< SpectrumModel > SpectrumModelWifi5190MHz
Spectrum model at 5190 MHz.
static_SpectrumModelWifi5180MHz_initializer static_SpectrumModelWifi5180MHz_initializer_instance
Static instance to initizlize the spectrum model around 5180 MHz.
uint32_t g_samples
Number of samples.
void MonitorSniffRx(Ptr< const Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise, uint16_t staId)
Monitor sniffer Rx trace.
static_SpectrumModelWifi5190MHz_initializer static_SpectrumModelWifi5190MHz_initializer_instance
Static instance to initizlize the spectrum model around 5190 MHz.
Ptr< SpectrumModel > SpectrumModelWifi5180MHz
Spectrum model at 5180 MHz.