A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2010 CTTC
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Nicola Baldo <nbaldo@cttc.es>
19  */
20 
21 
22 
23 #include <iostream>
24 
25 #include <ns3/core-module.h>
26 #include <ns3/network-module.h>
27 #include <ns3/spectrum-model-ism2400MHz-res1MHz.h>
28 #include <ns3/spectrum-model-300kHz-300GHz-log.h>
29 #include <ns3/wifi-spectrum-value-helper.h>
30 #include <ns3/single-model-spectrum-channel.h>
31 #include <ns3/waveform-generator.h>
32 #include <ns3/spectrum-analyzer.h>
33 #include <ns3/log.h>
34 #include <string>
35 #include <iomanip>
36 #include <ns3/friis-spectrum-propagation-loss.h>
37 #include <ns3/propagation-delay-model.h>
38 #include <ns3/mobility-module.h>
39 #include <ns3/spectrum-helper.h>
40 #include <ns3/applications-module.h>
41 #include <ns3/adhoc-aloha-noack-ideal-phy-helper.h>
42 
43 
44 NS_LOG_COMPONENT_DEFINE ("TestAdhocOfdmAloha");
45 
46 using namespace ns3;
47 
48 static bool g_verbose = false;
49 static uint64_t g_rxBytes;
50 
51 void
52 PhyRxEndOkTrace (std::string context, Ptr<const Packet> p)
53 {
54  if (g_verbose)
55  {
56  std::cout << context << " PHY RX END OK p:" << p << std::endl;
57  }
58  g_rxBytes += p->GetSize ();
59 }
60 
61 
62 
70 {
71 public:
72 
81  void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb);
82 
87  void Print ();
88 
89 private:
90  std::map<uint32_t, std::map<uint32_t, double> > m_pathlossMap;
91 };
92 
93 void
95  Ptr<SpectrumPhy> txPhy,
96  Ptr<SpectrumPhy> rxPhy,
97  double lossDb)
98 {
99  uint32_t txNodeId = txPhy->GetMobility ()->GetObject<Node> ()->GetId ();
100  uint32_t rxNodeId = rxPhy->GetMobility ()->GetObject<Node> ()->GetId ();
101  m_pathlossMap[txNodeId][rxNodeId] = lossDb;
102 }
103 
104 void
106 {
107  for (std::map<uint32_t, std::map<uint32_t, double> >::const_iterator txit = m_pathlossMap.begin ();
108  txit != m_pathlossMap.end ();
109  ++txit)
110  {
111  for (std::map<uint32_t, double>::const_iterator rxit = txit->second.begin ();
112  rxit != txit->second.end ();
113  ++rxit)
114  {
115  std::cout << txit->first << " --> " << rxit->first << " : " << rxit->second << " dB" << std::endl;
116  }
117  }
118 }
119 
120 
121 
122 int main (int argc, char** argv)
123 {
124  CommandLine cmd;
125  double lossDb = 130;
126  double txPowerW = 0.1;
127  uint64_t phyRate = 500000;
128  uint32_t pktSize = 1000;
129  double simDuration = 0.5;
130  std::string channelType ("ns3::SingleModelSpectrumChannel");
131  cmd.AddValue ("verbose", "Print trace information if true", g_verbose);
132  cmd.AddValue ("lossDb", "link loss in dB", lossDb);
133  cmd.AddValue ("txPowerW", "txPower in Watts", txPowerW);
134  cmd.AddValue ("phyRate", "PHY rate in bps", phyRate);
135  cmd.AddValue ("pktSize", "packet size in bytes", pktSize);
136  cmd.AddValue ("simDuration", "duration of the simulation in seconds", simDuration);
137  cmd.AddValue ("channelType", "which SpectrumChannel implementation to be used", channelType);
138  cmd.Parse (argc, argv);
139 
140  NodeContainer c;
141  c.Create (2);
142 
143  MobilityHelper mobility;
144  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
145  mobility.Install (c);
146  // the actual positions are irrelevant, since we use MatrixPropagationLossModel
147 
148 
149  SpectrumChannelHelper channelHelper;
150  channelHelper.SetChannel (channelType);
151  channelHelper.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
152  Ptr<MatrixPropagationLossModel> propLoss = CreateObject<MatrixPropagationLossModel> ();
153  propLoss->SetLoss (c.Get (0)->GetObject<MobilityModel> (), c.Get (1)->GetObject<MobilityModel> (), lossDb, true);
154  channelHelper.AddPropagationLoss (propLoss);
155  Ptr<SpectrumChannel> channel = channelHelper.Create ();
156 
157 
159 
160  uint32_t channelNumber = 1;
161  Ptr<SpectrumValue> txPsd = sf.CreateTxPowerSpectralDensity (txPowerW, channelNumber);
162 
163  // for the noise, we use the Power Spectral Density of thermal noise
164  // at room temperature. The value of the PSD will be constant over the band of interest.
165  const double k = 1.381e-23; //Boltzmann's constant
166  const double T = 290; // temperature in Kelvin
167  double noisePsdValue = k * T; // watts per hertz
168  Ptr<SpectrumValue> noisePsd = sf.CreateConstant (noisePsdValue);
169 
170  AdhocAlohaNoackIdealPhyHelper deviceHelper;
171  deviceHelper.SetChannel (channel);
172  deviceHelper.SetTxPowerSpectralDensity (txPsd);
173  deviceHelper.SetNoisePowerSpectralDensity (noisePsd);
174  deviceHelper.SetPhyAttribute ("Rate", DataRateValue (DataRate (phyRate)));
175  NetDeviceContainer devices = deviceHelper.Install (c);
176 
177  PacketSocketHelper packetSocket;
178  packetSocket.Install (c);
179 
180  PacketSocketAddress socket;
181  socket.SetSingleDevice (devices.Get (0)->GetIfIndex ());
182  socket.SetPhysicalAddress (devices.Get (1)->GetAddress ());
183  socket.SetProtocol (1);
184 
185  OnOffHelper onoff ("ns3::PacketSocketFactory", Address (socket));
186  onoff.SetConstantRate (DataRate (2*phyRate));
187  onoff.SetAttribute ("PacketSize", UintegerValue (pktSize));
188 
189  ApplicationContainer apps = onoff.Install (c.Get (0));
190  apps.Start (Seconds (0.0));
191  apps.Stop (Seconds (simDuration));
192 
193  Config::Connect ("/NodeList/*/DeviceList/*/Phy/RxEndOk", MakeCallback (&PhyRxEndOkTrace));
194 
195  GlobalPathlossDatabase globalPathlossDatabase;
196  Config::Connect ("/ChannelList/*/PropagationLoss",
197  MakeCallback (&GlobalPathlossDatabase::UpdatePathloss, &globalPathlossDatabase));
198 
199  g_rxBytes = 0;
200  Simulator::Stop (Seconds (simDuration + 0.000001));
201  Simulator::Run ();
202 
203  if (g_verbose)
204  {
205  globalPathlossDatabase.Print ();
206 
207  double throughputBps = (g_rxBytes * 8.0) / simDuration;
208  std::cout << "throughput: " << throughputBps << std::endl;
209  std::cout << "throughput: " << std::setw (20) << std::fixed << throughputBps << " bps" << std::endl;
210  std::cout << "phy rate : " << std::setw (20) << std::fixed << phyRate*1.0 << " bps" << std::endl;
211  double rxPowerW = txPowerW / (std::pow (10.0, lossDb/10.0));
212  double capacity = 20e6*log2 (1.0 + (rxPowerW/20.0e6)/noisePsdValue);
213  std::cout << "shannon capacity: " << std::setw (20) << std::fixed << capacity << " bps" << std::endl;
214 
215  }
216 
217 
218 
220  return 0;
221 }
holds a vector of ns3::Application pointers.
void SetTxPowerSpectralDensity(Ptr< SpectrumValue > txPsd)
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
void SetPhyAttribute(std::string name, const AttributeValue &v)
an address for a packet socket
static void Run(void)
Definition: simulator.cc:157
#define NS_LOG_COMPONENT_DEFINE(name)
Definition: log.h:122
Ptr< SpectrumChannel > Create(void) const
uint32_t GetSize(void) const
Definition: packet.h:620
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:728
virtual Ptr< MobilityModel > GetMobility()=0
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:41
Give ns3::PacketSocket powers to ns3::Node.
a polymophic address class
Definition: address.h:86
Class for representing data rates.
Definition: data-rate.h:71
Keep track of the current position and velocity of an object.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void AddPropagationLoss(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())
Hold an unsigned integer type.
Definition: uinteger.h:46
void UpdatePathloss(std::string context, Ptr< SpectrumPhy > txPhy, Ptr< SpectrumPhy > rxPhy, double lossDb)
holds a vector of ns3::NetDevice pointers
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:502
void SetPropagationDelay(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 Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
parse command-line argumentsInstances of this class can be used to parse command-line arguments: user...
Definition: command-line.h:50
static void Destroy(void)
Definition: simulator.cc:121
keep track of a set of node pointers.
void SetMobilityModel(std::string type, 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(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void SetChannel(std::string type, 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 Install(Ptr< Node > node) const
Helper class used to assign positions and mobility models to nodes.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
Definition: nstime.h:586
hold objects of type ns3::DataRate
void AddValue(const std::string &name, const std::string &help, T &value)
Definition: command-line.h:134
static void Stop(void)
Definition: simulator.cc:164
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A network Node.
Definition: node.h:56
void Parse(int argc, char *argv[]) const
Definition: command-line.cc:84
void SetLoss(Ptr< MobilityModel > a, Ptr< MobilityModel > b, double loss, bool symmetric=true)
Set loss (in dB, positive) between pair of ns-3 objects (typically, nodes).
void SetChannel(Ptr< SpectrumChannel > channel)
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
NetDeviceContainer Install(NodeContainer c) const
Ptr< T > GetObject(void) const
Definition: object.h:332
void SetNoisePowerSpectralDensity(Ptr< SpectrumValue > noisePsd)