27#include "ns3/command-line.h"
28#include "ns3/config.h"
29#include "ns3/string.h"
30#include "ns3/yans-wifi-helper.h"
31#include "ns3/spectrum-wifi-helper.h"
33#include "ns3/mobility-helper.h"
34#include "ns3/internet-stack-helper.h"
35#include "ns3/ipv4-address-helper.h"
36#include "ns3/udp-client-server-helper.h"
37#include "ns3/packet-sink-helper.h"
38#include "ns3/on-off-helper.h"
39#include "ns3/packet-sink.h"
40#include "ns3/yans-wifi-channel.h"
41#include "ns3/multi-model-spectrum-channel.h"
42#include "ns3/propagation-loss-model.h"
43#include "ns3/waveform-generator.h"
44#include "ns3/waveform-generator-helper.h"
45#include "ns3/non-communicating-net-device.h"
46#include "ns3/wifi-net-device.h"
107 uint16_t channelFreqMhz,
130 bandInfo.
fc = 5180e6;
131 bandInfo.
fl = 5180e6 - 10e6;
132 bandInfo.
fh = 5180e6 + 10e6;
135 bands.push_back (bandInfo);
149 bandInfo.
fc = 5190e6;
150 bandInfo.
fl = 5190e6 - 10e6;
151 bandInfo.
fh = 5190e6 + 10e6;
154 bands.push_back (bandInfo);
161int main (
int argc,
char *argv[])
164 double distance = 50;
165 double simulationTime = 10;
166 uint16_t index = 256;
167 std::string wifiType =
"ns3::SpectrumWifiPhy";
168 std::string errorModelType =
"ns3::NistErrorRateModel";
169 bool enablePcap =
false;
170 const uint32_t tcpPacketSize = 1448;
171 double waveformPower = 0;
174 cmd.AddValue (
"simulationTime",
"Simulation time in seconds", simulationTime);
175 cmd.AddValue (
"udp",
"UDP if set to 1, TCP otherwise", udp);
176 cmd.AddValue (
"distance",
"meters separation between nodes", distance);
177 cmd.AddValue (
"index",
"restrict index to single value between 0 and 31", index);
178 cmd.AddValue (
"wifiType",
"select ns3::SpectrumWifiPhy or ns3::YansWifiPhy", wifiType);
179 cmd.AddValue (
"errorModelType",
"select ns3::NistErrorRateModel or ns3::YansErrorRateModel", errorModelType);
180 cmd.AddValue (
"enablePcap",
"enable pcap output", enablePcap);
181 cmd.AddValue (
"waveformPower",
"Waveform power (linear W)", waveformPower);
182 cmd.Parse (argc,argv);
184 uint16_t startIndex = 0;
185 uint16_t stopIndex = 31;
192 std::cout <<
"wifiType: " << wifiType <<
" distance: " << distance <<
"m; time: " << simulationTime <<
"; TxPower: 16 dBm (40 mW)" << std::endl;
193 std::cout << std::setw (5) <<
"index" <<
194 std::setw (6) <<
"MCS" <<
195 std::setw (13) <<
"Rate (Mb/s)" <<
196 std::setw (12) <<
"Tput (Mb/s)" <<
197 std::setw (10) <<
"Received " <<
198 std::setw (12) <<
"Signal (dBm)" <<
199 std::setw (12) <<
"Noi+Inf(dBm)" <<
200 std::setw (9) <<
"SNR (dB)" <<
202 for (uint16_t i = startIndex; i <= stopIndex; i++)
220 interferingNode.
Create (1);
225 uint16_t frequency = (i <= 15 ? 5180 : 5190);
226 if (wifiType ==
"ns3::YansWifiPhy")
229 channel.AddPropagationLoss (
"ns3::FriisPropagationLossModel",
231 channel.SetPropagationDelay (
"ns3::ConstantSpeedPropagationDelayModel");
233 phy.Set (
"ChannelSettings",
StringValue (std::string (
"{") + (frequency == 5180 ?
"36" :
"38")
234 +
", 0, BAND_5GHZ, 0}"));
236 else if (wifiType ==
"ns3::SpectrumWifiPhy")
239 = CreateObject<MultiModelSpectrumChannel> ();
241 = CreateObject<FriisPropagationLossModel> ();
242 lossModel->SetFrequency (frequency * 1e6);
243 spectrumChannel->AddPropagationLossModel (lossModel);
246 = CreateObject<ConstantSpeedPropagationDelayModel> ();
247 spectrumChannel->SetPropagationDelayModel (delayModel);
252 spectrumPhy.
Set (
"ChannelSettings",
StringValue (std::string (
"{")
253 + (frequency == 5180 ?
"36" :
"38")
254 +
", 0, BAND_5GHZ, 0}"));
430 wifi.SetRemoteStationManager (
"ns3::ConstantRateWifiManager",
"DataMode",
DataRate,
436 if (wifiType ==
"ns3::YansWifiPhy")
438 mac.SetType (
"ns3::StaWifiMac",
440 staDevice =
wifi.Install (
phy,
mac, wifiStaNode);
441 mac.SetType (
"ns3::ApWifiMac",
446 else if (wifiType ==
"ns3::SpectrumWifiPhy")
448 mac.SetType (
"ns3::StaWifiMac",
450 staDevice =
wifi.Install (spectrumPhy,
mac, wifiStaNode);
451 mac.SetType (
"ns3::ApWifiMac",
458 Config::Set (
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported",
BooleanValue (
false));
460 else if (i > 7 && i <= 15)
462 Config::Set (
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported",
BooleanValue (
true));
464 else if (i > 15 && i <= 23)
466 Config::Set (
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported",
BooleanValue (
false));
470 Config::Set (
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported",
BooleanValue (
true));
477 positionAlloc->Add (
Vector (0.0, 0.0, 0.0));
478 positionAlloc->Add (
Vector (distance, 0.0, 0.0));
479 positionAlloc->Add (
Vector (distance, distance, 0.0));
480 mobility.SetPositionAllocator (positionAlloc);
482 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
491 stack.Install (wifiStaNode);
494 address.SetBase (
"192.168.1.0",
"255.255.255.0");
498 staNodeInterface =
address.Assign (staDevice);
499 apNodeInterface =
address.Assign (apDevice);
508 serverApp = server.Install (wifiStaNode.
Get (0));
513 client.SetAttribute (
"MaxPackets",
UintegerValue (4294967295u));
514 client.SetAttribute (
"Interval",
TimeValue (
Time (
"0.0001")));
515 client.SetAttribute (
"PacketSize",
UintegerValue (payloadSize));
523 uint16_t
port = 50000;
526 serverApp = packetSinkHelper.Install (wifiStaNode.
Get (0));
530 OnOffHelper onoff (
"ns3::TcpSocketFactory", Ipv4Address::GetAny ());
531 onoff.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
532 onoff.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
533 onoff.SetAttribute (
"PacketSize",
UintegerValue (payloadSize));
536 onoff.SetAttribute (
"Remote", remoteAddress);
545 *wgPsd = waveformPower / 20e6;
548 if (wifiType ==
"ns3::SpectrumWifiPhy")
551 waveformGeneratorHelper.
SetChannel (spectrumChannel);
558 Simulator::Schedule (
Seconds (0.002), &WaveformGenerator::Start,
566 phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
567 std::stringstream ss;
568 ss <<
"wifi-spectrum-per-example-" << i;
569 phy.EnablePcap (ss.str (), apDevice);
582 "Error: Channel width must be 20 MHz if MCS index <= 15");
584 "Error: Wi-Fi nodes must be tuned to 5180 MHz to match the waveform generator");
589 "Error: Channel width must be 40 MHz if MCS index > 15");
591 "Error: Wi-Fi nodes must be tuned to 5190 MHz to match the waveform generator");
594 Simulator::Stop (
Seconds (simulationTime + 1));
597 double throughput = 0;
598 uint64_t totalPacketsThrough = 0;
602 totalPacketsThrough = DynamicCast<UdpServer> (serverApp.
Get (0))->GetReceived ();
603 throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
608 uint64_t totalBytesRx = DynamicCast<PacketSink> (serverApp.
Get (0))->GetTotalRx ();
609 totalPacketsThrough = totalBytesRx / tcpPacketSize;
610 throughput = totalBytesRx * 8 / (simulationTime * 1000000.0);
612 std::cout << std::setw (5) << i <<
613 std::setw (6) << (i % 8) <<
614 std::setprecision (2) << std::fixed <<
615 std::setw (10) << datarate <<
616 std::setw (12) << throughput <<
617 std::setw (8) << totalPacketsThrough;
618 if (totalPacketsThrough > 0)
627 std::cout << std::setw (12) <<
"N/A" <<
628 std::setw (12) <<
"N/A" <<
629 std::setw (12) <<
"N/A" <<
632 Simulator::Destroy ();
a polymophic address class
AttributeValue implementation for Address.
holds a vector of ns3::Application pointers.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
AttributeValue implementation for Boolean.
Parse command-line arguments.
Class for representing data rates.
AttributeValue implementation for DataRate.
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.
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(void) 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.
Make it easy to create and manage PHY objects for the spectrum model.
void SetChannel(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.
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.
Vector3D Vector
Vector alias typedef for compatibility with mobility models.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
Hold together all Wifi-related objects.
void SetErrorRateModel(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
void Set(std::string name, const AttributeValue &v)
uint16_t GetChannelWidth(void) const
uint16_t GetFrequency(void) 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.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
double Integral(const SpectrumValue &arg)
std::vector< BandInfo > Bands
Container of BandInfo.
U * GetPointer(const Ptr< U > &p)
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
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
class static_SpectrumModelWifi5190MHz_initializer static_SpectrumModelWifi5190MHz_initializer_instance
class static_SpectrumModelWifi5180MHz_initializer static_SpectrumModelWifi5180MHz_initializer_instance
Ptr< SpectrumModel > SpectrumModelWifi5190MHz
void MonitorSniffRx(Ptr< const Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise, uint16_t staId)
Ptr< SpectrumModel > SpectrumModelWifi5180MHz