A Discrete-Event Network Simulator
API
uan-cw-example.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 University of Washington
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: Leonard Tracy <lentracy@gmail.com>
19  */
20 
21 
45 #include "uan-cw-example.h"
46 #include "ns3/core-module.h"
47 #include "ns3/network-module.h"
48 #include "ns3/mobility-module.h"
49 #include "ns3/stats-module.h"
50 #include "ns3/applications-module.h"
51 
52 #include <fstream>
53 
54 using namespace ns3;
55 
56 NS_LOG_COMPONENT_DEFINE ("UanCwExample");
57 
59  : m_numNodes (15),
60  m_dataRate (80),
61  m_depth (70),
62  m_boundary (500),
63  m_packetSize (32),
64  m_bytesTotal (0),
65  m_cwMin (10),
66  m_cwMax (400),
67  m_cwStep (10),
68  m_avgs (3),
69  m_slotTime (Seconds (0.2)),
70  m_simTime (Seconds (1000)),
71  m_gnudatfile ("uan-cw-example.gpl"),
72  m_asciitracefile ("uan-cw-example.asc"),
73  m_bhCfgFile ("uan-apps/dat/default.cfg")
74 {
75 }
76 
77 void
79 {
80  NS_LOG_DEBUG (Now ().As (Time::S) << " Resetting data");
81  m_throughputs.push_back (m_bytesTotal * 8.0 / m_simTime.GetSeconds ());
82  m_bytesTotal = 0;
83 }
84 
85 void
87 {
88  NS_ASSERT (m_throughputs.size () == m_avgs);
89 
90  double avgThroughput = 0.0;
91  for (uint32_t i=0; i<m_avgs; i++)
92  {
93  avgThroughput += m_throughputs[i];
94  }
95  avgThroughput /= m_avgs;
96  m_data.Add (cw, avgThroughput);
97  m_throughputs.clear ();
98 
99  Config::Set ("/NodeList/*/DeviceList/*/Mac/CW", UintegerValue (cw + m_cwStep));
100 
101  SeedManager::SetRun (SeedManager::GetRun () + 1);
102 
103  NS_LOG_DEBUG ("Average for cw=" << cw << " over " << m_avgs << " runs: " << avgThroughput);
104 }
105 void
107 {
108 
109  NS_LOG_DEBUG (Now ().As (Time::S) << " Updating positions");
110  NodeContainer::Iterator it = nodes.Begin ();
111  Ptr<UniformRandomVariable> uv = CreateObject<UniformRandomVariable> ();
112  for (; it != nodes.End (); it++)
113  {
115  mp->SetPosition (Vector (uv->GetValue (0, m_boundary), uv->GetValue (0, m_boundary), 70.0));
116  }
117 }
118 
119 void
121 {
122  Ptr<Packet> packet;
123 
124  while ((packet = socket->Recv ()))
125  {
126  m_bytesTotal += packet->GetSize ();
127  }
128  packet = 0;
129 }
130 
133 {
134  uan.SetMac ("ns3::UanMacCw", "CW", UintegerValue (m_cwMin), "SlotTime", TimeValue (m_slotTime));
137  nc.Create (m_numNodes);
138  sink.Create (1);
139 
140  PacketSocketHelper socketHelper;
141  socketHelper.Install (nc);
142  socketHelper.Install (sink);
143 
144 #ifdef UAN_PROP_BH_INSTALLED
145  Ptr<UanPropModelBh> prop = CreateObjectWithAttributes<UanPropModelBh> ("ConfigFile", StringValue ("exbhconfig.cfg"));
146 #else
147  Ptr<UanPropModelIdeal> prop = CreateObjectWithAttributes<UanPropModelIdeal> ();
148 #endif //UAN_PROP_BH_INSTALLED
149  Ptr<UanChannel> channel = CreateObjectWithAttributes<UanChannel> ("PropagationModel", PointerValue (prop));
150 
151  //Create net device and nodes with UanHelper
153  NetDeviceContainer sinkdev = uan.Install (sink, channel);
154 
156  Ptr<ListPositionAllocator> pos = CreateObject<ListPositionAllocator> ();
157 
158  {
159  Ptr<UniformRandomVariable> urv = CreateObject<UniformRandomVariable> ();
160  pos->Add (Vector (m_boundary / 2.0, m_boundary / 2.0, m_depth));
161  double rsum = 0;
162 
163  double minr = 2 * m_boundary;
164  for (uint32_t i = 0; i < m_numNodes; i++)
165  {
166  double x = urv->GetValue (0, m_boundary);
167  double y = urv->GetValue (0, m_boundary);
168  double newr = std::sqrt ((x - m_boundary / 2.0) * (x - m_boundary / 2.0)
169  + (y - m_boundary / 2.0) * (y - m_boundary / 2.0));
170  rsum += newr;
171  minr = std::min (minr, newr);
172  pos->Add (Vector (x, y, m_depth));
173 
174  }
175  NS_LOG_DEBUG ("Mean range from gateway: " << rsum / m_numNodes
176  << " min. range " << minr);
177 
178  mobility.SetPositionAllocator (pos);
179  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
180  mobility.Install (sink);
181 
182  NS_LOG_DEBUG ("Position of sink: "
183  << sink.Get (0)->GetObject<MobilityModel> ()->GetPosition ());
184  mobility.Install (nc);
185 
186  PacketSocketAddress socket;
187  socket.SetSingleDevice (sinkdev.Get (0)->GetIfIndex ());
188  socket.SetPhysicalAddress (sinkdev.Get (0)->GetAddress ());
189  socket.SetProtocol (0);
190 
191  OnOffHelper app ("ns3::PacketSocketFactory", Address (socket));
192  app.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
193  app.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
194  app.SetAttribute ("DataRate", DataRateValue (m_dataRate));
195  app.SetAttribute ("PacketSize", UintegerValue (m_packetSize));
196 
197  ApplicationContainer apps = app.Install (nc);
198  apps.Start (Seconds (0.5));
199  Time nextEvent = Seconds (0.5);
200 
201 
202  for (uint32_t cw = m_cwMin; cw <= m_cwMax; cw += m_cwStep)
203  {
204 
205  for (uint32_t an = 0; an < m_avgs; an++)
206  {
207  nextEvent += m_simTime;
208  Simulator::Schedule (nextEvent, &Experiment::ResetData, this);
209  Simulator::Schedule (nextEvent, &Experiment::UpdatePositions, this, nc);
210  }
211  Simulator::Schedule (nextEvent, &Experiment::IncrementCw, this, cw);
212  }
213  apps.Stop (nextEvent + m_simTime);
214 
215  Ptr<Node> sinkNode = sink.Get (0);
216  TypeId psfid = TypeId::LookupByName ("ns3::PacketSocketFactory");
217  if (sinkNode->GetObject<SocketFactory> (psfid) == 0)
218  {
219  Ptr<PacketSocketFactory> psf = CreateObject<PacketSocketFactory> ();
220  sinkNode->AggregateObject (psf);
221  }
222  Ptr<Socket> sinkSocket = Socket::CreateSocket (sinkNode, psfid);
223  sinkSocket->Bind (socket);
225 
226  m_bytesTotal = 0;
227 
228  std::ofstream ascii (m_asciitracefile.c_str ());
229  if (!ascii.is_open ())
230  {
231  NS_FATAL_ERROR ("Could not open ascii trace file: "
232  << m_asciitracefile);
233  }
234  uan.EnableAsciiAll (ascii);
235 
236  Simulator::Run ();
237  sinkNode = 0;
238  sinkSocket = 0;
239  pos = 0;
240  channel = 0;
241  prop = 0;
242  for (uint32_t i=0; i < nc.GetN (); i++)
243  {
244  nc.Get (i) = 0;
245  }
246  for (uint32_t i=0; i < sink.GetN (); i++)
247  {
248  sink.Get (i) = 0;
249  }
250 
251  for (uint32_t i=0; i < devices.GetN (); i++)
252  {
253  devices.Get (i) = 0;
254  }
255  for (uint32_t i=0; i < sinkdev.GetN (); i++)
256  {
257  sinkdev.Get (i) = 0;
258  }
259 
260  Simulator::Destroy ();
261  return m_data;
262  }
263 }
264 
265 int
266 main (int argc, char **argv)
267 {
268 
269  Experiment exp;
270  bool quiet = false;
271 
272  std::string gnudatfile ("cwexpgnuout.dat");
273  std::string perModel = "ns3::UanPhyPerGenDefault";
274  std::string sinrModel = "ns3::UanPhyCalcSinrDefault";
275 
276  CommandLine cmd (__FILE__);
277  cmd.AddValue ("NumNodes", "Number of transmitting nodes", exp.m_numNodes);
278  cmd.AddValue ("Depth", "Depth of transmitting and sink nodes", exp.m_depth);
279  cmd.AddValue ("RegionSize", "Size of boundary in meters", exp.m_boundary);
280  cmd.AddValue ("PacketSize", "Generated packet size in bytes", exp.m_packetSize);
281  cmd.AddValue ("DataRate", "DataRate in bps", exp.m_dataRate);
282  cmd.AddValue ("CwMin", "Min CW to simulate", exp.m_cwMin);
283  cmd.AddValue ("CwMax", "Max CW to simulate", exp.m_cwMax);
284  cmd.AddValue ("SlotTime", "Slot time duration", exp.m_slotTime);
285  cmd.AddValue ("Averages", "Number of topologies to test for each cw point", exp.m_avgs);
286  cmd.AddValue ("GnuFile", "Name for GNU Plot output", exp.m_gnudatfile);
287  cmd.AddValue ("PerModel", "PER model name", perModel);
288  cmd.AddValue ("SinrModel", "SINR model name", sinrModel);
289  cmd.AddValue ("Quiet", "Run in quiet mode (disable logging)", quiet);
290  cmd.Parse (argc, argv);
291 
292  if (!quiet)
293  {
294  LogComponentEnable ("UanCwExample", LOG_LEVEL_ALL);
295  }
296 
297  ObjectFactory obf;
298  obf.SetTypeId (perModel);
299  Ptr<UanPhyPer> per = obf.Create<UanPhyPer> ();
300  obf.SetTypeId (sinrModel);
302 
303  UanHelper uan;
304  UanTxMode mode;
305  mode = UanTxModeFactory::CreateMode (UanTxMode::FSK, exp.m_dataRate,
306  exp.m_dataRate, 12000,
307  exp.m_dataRate, 2,
308  "Default mode");
309  UanModesList myModes;
310  myModes.AppendMode (mode);
311 
312  uan.SetPhy ("ns3::UanPhyGen",
313  "PerModel", PointerValue (per),
314  "SinrModel", PointerValue (sinr),
315  "SupportedModes", UanModesListValue (myModes));
316 
317  Gnuplot gp;
318  Gnuplot2dDataset ds;
319  ds = exp.Run (uan);
320 
321  gp.AddDataset (ds);
322 
323  std::ofstream of (exp.m_gnudatfile.c_str ());
324  if (!of.is_open ())
325  {
326  NS_FATAL_ERROR ("Can not open GNU Plot outfile: " << exp.m_gnudatfile);
327  }
328  gp.GenerateOutput (of);
329 
330  per = 0;
331  sinr = 0;
332 
333 }
334 
#define min(a, b)
Definition: 80211b.c:42
Helper class for UAN CW MAC example.
Definition: wifi-adhoc.cc:41
uint32_t m_packetSize
Generated packet size in bytes.
double m_depth
Depth of transmitting and sink nodes.
Gnuplot2dDataset Run(const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel)
Definition: wifi-adhoc.cc:119
std::string m_asciitracefile
Name for ascii trace file, default uan-cw-example.asc.
void UpdatePositions(NodeContainer &nodes)
Assign new random positions to a set of nodes.
uint32_t m_cwMin
Min CW to simulate.
uint32_t m_bytesTotal
Total bytes received.
Definition: wifi-adhoc.cc:54
Time m_simTime
Simulation run time, default 1000 s.
uint32_t m_cwMax
Max CW to simulate.
uint32_t m_avgs
Number of topologies to test for each cw point.
void ResetData()
Save the throughput from a single run.
uint32_t m_dataRate
DataRate in bps.
Gnuplot2dDataset m_data
Container for the simulation data.
void ReceivePacket(Ptr< Socket > socket)
Definition: wifi-adhoc.cc:99
Time m_slotTime
Slot time duration.
std::string m_gnudatfile
Name for GNU Plot output, default uan-cw-example.gpl.
std::vector< double > m_throughputs
Throughput for each run.
void IncrementCw(uint32_t cw)
Compute average throughput for a set of runs, then increment CW.
uint32_t m_numNodes
Number of transmitting nodes.
double m_boundary
Size of boundary in meters.
uint32_t m_cwStep
CW step size, default 10.
a polymophic address class
Definition: address.h:91
holds a vector of ns3::Application pointers.
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.
Parse command-line arguments.
Definition: command-line.h:229
AttributeValue implementation for DataRate.
Definition: data-rate.h:298
Class to represent a 2D points plot.
Definition: gnuplot.h:118
void Add(double x, double y)
Definition: gnuplot.cc:363
a simple class to generate gnuplot-ready plotting commands from a set of datasets.
Definition: gnuplot.h:373
void AddDataset(const GnuplotDataset &dataset)
Definition: gnuplot.cc:760
void GenerateOutput(std::ostream &os)
Writes gnuplot commands and data values to a single output stream.
Definition: gnuplot.cc:766
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
void SetPosition(const Vector &position)
Vector GetPosition(void) const
holds a vector of ns3::NetDevice pointers
uint32_t GetN(void) const
Get the number of Ptr<NetDevice> stored in this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
virtual Address GetAddress(void) const =0
virtual uint32_t GetIfIndex(void) const =0
keep track of a set of node pointers.
uint32_t GetN(void) const
Get the number of Ptr<Node> stored in this container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Instantiate subclasses of ns3::Object.
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
Definition: object.cc:252
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:43
ApplicationContainer Install(NodeContainer c) const
Install an ns3::OnOffApplication on each node of the input container configured with all the attribut...
void SetAttribute(std::string name, const AttributeValue &value)
Helper function used to set the underlying application attributes.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:856
an address for a packet socket
void SetProtocol(uint16_t protocol)
Set the protocol.
void SetPhysicalAddress(const Address address)
Set the destination address.
void SetSingleDevice(uint32_t device)
Set the address to match only a specified NetDevice.
Give ns3::PacketSocket powers to ns3::Node.
void Install(Ptr< Node > node) const
Aggregate an instance of a ns3::PacketSocketFactory onto the provided node.
Hold objects of type Ptr<T>.
Definition: pointer.h:37
Object to create transport layer instances that provide a socket API to applications.
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
Definition: socket.cc:128
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Hold variables of type string.
Definition: string.h:41
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:379
AttributeValue implementation for Time.
Definition: nstime.h:1308
a unique identifier for an interface.
Definition: type-id.h:59
UAN configuration helper.
Definition: uan-helper.h:41
void SetMac(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())
Set MAC attributes.
Definition: uan-helper.cc:95
NetDeviceContainer Install(NodeContainer c) const
This method creates a simple ns3::UanChannel (with a default ns3::UanNoiseModelDefault and ns3::UanPr...
Definition: uan-helper.cc:212
static void EnableAsciiAll(std::ostream &os)
Enable ascii output on each device which is of the ns3::UanNetDevice type and dump that to the specif...
Definition: uan-helper.cc:206
Container for UanTxModes.
Definition: uan-tx-mode.h:258
void AppendMode(UanTxMode mode)
Add mode to this list.
Definition: uan-tx-mode.cc:232
AttributeValue implementation for UanModesList.
Definition: uan-tx-mode.h:314
Class used for calculating SINR of packet in UanPhy.
Definition: uan-phy.h:45
Calculate packet error probability, based on received SINR and modulation (mode).
Definition: uan-phy.h:111
Abstraction of packet modulation information.
Definition: uan-tx-mode.h:42
Hold an unsigned integer type.
Definition: uinteger.h:44
double GetValue(double min, double max)
Get the next random value, as a double in the specified range .
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
void Set(std::string path, const AttributeValue &value)
Definition: config.cc:839
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
devices
Definition: first.py:39
nodes
Definition: first.py:32
Every class exported by the ns3 library is enclosed in the ns3 namespace.
@ LOG_LEVEL_ALL
Print everything.
Definition: log.h:116
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:361
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...
Definition: callback.h:1648
list x
Random number samples.
cmd
Definition: second.py:35
channel
Definition: third.py:92
mobility
Definition: third.py:108
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:56