A Discrete-Event Network Simulator
API
uan-rc-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 
54 #include "uan-rc-example.h"
55 #include "ns3/core-module.h"
56 #include "ns3/network-module.h"
57 #include "ns3/applications-module.h"
58 #include "ns3/mobility-module.h"
59 #include "ns3/log.h"
60 #include "ns3/config.h"
61 #include "ns3/callback.h"
62 #include "ns3/stats-module.h"
63 
64 #include <fstream>
65 
66 using namespace ns3;
67 
68 NS_LOG_COMPONENT_DEFINE ("UanRcExample");
69 
71  : m_simMin (1),
72  m_simMax (1),
73  m_simStep (1),
74  m_numRates (1023),
75  m_totalRate (4096),
76  m_maxRange (3000),
77  m_numNodes (15),
78  m_pktSize (1000),
79  m_doNode (true),
80  m_sifs (Seconds (0.05)),
81  m_simTime (Seconds (5000)),
82  m_gnuplotfile ("uan-rc-example.gpl"),
83  m_bytesTotal (0)
84 {
85 }
86 
87 void
89 {
90  Ptr<Packet> packet;
91  while ((packet = socket->Recv ()))
92  {
93  m_bytesTotal += packet->GetSize ();
94  }
95 }
96 
98 Experiment::CreateMode (uint32_t kass,
99  uint32_t fc,
100  bool upperblock,
101  std::string name)
102 {
103 
104  std::ostringstream buf;
105  buf << name << " " << kass;
106 
107  uint32_t rate = m_totalRate/(m_numRates+1)* (kass);
108  uint32_t bw = kass * m_totalRate / (m_numRates+1);
109  uint32_t fcmode;
110  if(upperblock)
111  fcmode = (m_totalRate - bw)/2 + fc;
112  else
113  fcmode = (uint32_t)((-((double) m_totalRate ) + (double) bw)/2.0 + (double) fc);
114 
115 
116  uint32_t phyrate = m_totalRate;
117 
118  UanTxMode mode;
119  mode = UanTxModeFactory::CreateMode (UanTxMode::OTHER,
120  rate,
121  phyrate,
122  fcmode,
123  bw,
124  2,
125  buf.str ());
126  return mode;
127 }
128 
129 //Creates m_numRates different modes each dividing m_totalRate Hz (assumes 1 bit per hz)
130 //centered at frequency fc
131 void
133 {
134 
135 
136  for (uint32_t i=1; i < m_numRates+1; i++)
137  {
138  m_controlModes.AppendMode (CreateMode (i, fc, false, "control "));
139  }
140  for (uint32_t i=m_numRates; i > 0; i--)
141  {
142  m_dataModes.AppendMode (CreateMode (i, fc, true, "data "));
143  }
144 }
145 
146 uint32_t
147 Experiment::Run (uint32_t param)
148 {
149 
150  UanHelper uan;
151 
152  m_bytesTotal=0;
153 
154  uint32_t nNodes;
155  uint32_t a;
156  if(m_doNode)
157  {
158  a=0;
159  nNodes = param;
160  }
161  else
162  {
163  nNodes = m_numNodes;
164  a = param;
165  }
166  Time pDelay = Seconds ((double) m_maxRange / 1500.0);
167 
168  uan.SetPhy ("ns3::UanPhyDual",
169  "SupportedModesPhy1", UanModesListValue (m_dataModes),
170  "SupportedModesPhy2", UanModesListValue (m_controlModes));
171 
172  uan.SetMac ("ns3::UanMacRcGw",
173  "NumberOfRates", UintegerValue (m_numRates),
174  "NumberOfNodes", UintegerValue (nNodes),
175  "MaxReservations", UintegerValue (a),
176  "SIFS", TimeValue (m_sifs),
177  "MaxPropDelay", TimeValue (pDelay),
178  "FrameSize", UintegerValue (m_pktSize));
179  Ptr<UanChannel> chan = CreateObject<UanChannel>();
180 
182  sink.Create (1);
183  NetDeviceContainer sinkDev = uan.Install (sink, chan);
184 
185  uan.SetMac ("ns3::UanMacRc",
186  "NumberOfRates", UintegerValue (m_numRates),
187  "MaxPropDelay", TimeValue (pDelay));
189  nodes.Create (nNodes);
190  NetDeviceContainer devices = uan.Install (nodes, chan);
191 
193  uint32_t depth = 70;
194  Ptr<ListPositionAllocator> pos = CreateObject<ListPositionAllocator> ();
195 
196  Ptr<UniformRandomVariable> urv = CreateObject<UniformRandomVariable> ();
197  Ptr<UniformRandomVariable> utheta = CreateObject<UniformRandomVariable> ();
198  pos->Add (Vector (m_maxRange, m_maxRange, depth));
199 
200  for (uint32_t i=0; i<nNodes; i++)
201  {
202  double theta = utheta->GetValue (0, 2.0*M_PI);
203  double r = urv->GetValue (0,m_maxRange);
204 
205  double x = m_maxRange + r*std::cos (theta);
206  double y = m_maxRange + r*std::sin (theta);
207 
208  pos->Add (Vector (x, y, depth));
209 
210  }
211 
212  mobility.SetPositionAllocator (pos);
213  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
214  mobility.Install (sink);
215  mobility.Install (nodes);
216 
217  PacketSocketHelper pktskth;
218  pktskth.Install (nodes);
219  pktskth.Install (sink);
220 
221  PacketSocketAddress socket;
222  socket.SetSingleDevice (sinkDev.Get (0)->GetIfIndex ());
223  socket.SetPhysicalAddress (sinkDev.Get (0)->GetAddress ());
224  socket.SetProtocol (0);
225 
226  OnOffHelper app ("ns3::PacketSocketFactory", Address (socket));
227  app.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
228  app.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
229  app.SetAttribute ("DataRate", DataRateValue (m_totalRate));
230  app.SetAttribute ("PacketSize", UintegerValue (m_pktSize));
231 
232  ApplicationContainer apps = app.Install (nodes);
233 
234  apps.Start (Seconds (0.5));
235  apps.Stop (m_simTime + Seconds (0.5));
236 
237  Ptr<Node> sinkNode = sink.Get (0);
238  TypeId psfid = TypeId::LookupByName ("ns3::PacketSocketFactory");
239 
240  Ptr<Socket> sinkSocket = Socket::CreateSocket (sinkNode, psfid);
241  sinkSocket->Bind (socket);
243 
244  Simulator::Stop (m_simTime + Seconds (0.6));
245  Simulator::Run ();
246  Simulator::Destroy ();
247 
248  return m_bytesTotal;
249 }
250 int
251 main (int argc, char *argv[])
252 {
253 
254  Experiment exp;
255  bool quiet = false;
256 
257  CommandLine cmd (__FILE__);
258  cmd.AddValue ("TotalRate", "Total channel capacity", exp.m_totalRate);
259  cmd.AddValue ("NumberRates", "Number of divided rates ( (NumberRates+1)%TotalRate should be 0)", exp.m_numRates);
260  cmd.AddValue ("MaxRange", "Maximum range between gateway and acoustic node", exp.m_maxRange);
261  cmd.AddValue ("SimMin", "Minimum parameter to test (nodes if DoNode=1, \"a\" param otherwise)", exp.m_simMin);
262  cmd.AddValue ("SimMax", "Maximum parameter to test (nodes if DoNode=1, \"a\" param otherwise)", exp.m_simMax);
263  cmd.AddValue ("SimStep", "Amount to increment param per trial", exp.m_simStep);
264  cmd.AddValue ("DataFile", "Filename for GnuPlot", exp.m_gnuplotfile);
265  cmd.AddValue ("NumberNodes", "Number of nodes (invalid for doNode=1)", exp.m_numNodes);
266  cmd.AddValue ("SIFS", "SIFS time duration", exp.m_sifs);
267  cmd.AddValue ("PktSize", "Packet size in bytes", exp.m_pktSize);
268  cmd.AddValue ("SimTime", "Simulation time per trial", exp.m_simTime);
269  cmd.AddValue ("DoNode", "1 for do max nodes simulation (invalidates AMin and AMax values)", exp.m_doNode);
270  cmd.AddValue ("Quiet", "Run in quiet mode (disable logging)", quiet);
271  cmd.Parse (argc, argv);
272 
273  if (!quiet)
274  {
275  LogComponentEnable ("UanRcExample", LOG_LEVEL_ALL);
276  }
277 
278  exp.CreateDualModes (12000);
279 
280  ;
281 
282  Gnuplot2dDataset ds;
283  for (uint32_t param=exp.m_simMin; param<=exp.m_simMax; param += exp.m_simStep)
284  {
285  uint32_t bytesRx = exp.Run (param);
286  NS_LOG_DEBUG ("param=" << param << ": Received " << bytesRx << " bytes at sink");
287 
288  double util = bytesRx*8.0/(exp.m_simTime.GetSeconds ()*exp.m_totalRate);
289 
290  ds.Add (param, util);
291 
292  SeedManager::SetRun (SeedManager::GetRun () + 1);
293  }
294 
295  Gnuplot gp;
296  gp.AddDataset (ds);
297  std::ofstream of (exp.m_gnuplotfile.c_str ());
298  if (!of.is_open ())
299  {
300  NS_FATAL_ERROR ("Can not open GNU Plot outfile: " << exp.m_gnuplotfile);
301  }
302  gp.GenerateOutput (of);
303 
304 }
Helper class for UAN CW MAC example.
Definition: wifi-adhoc.cc:41
Gnuplot2dDataset Run(const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel)
Definition: wifi-adhoc.cc:119
uint32_t m_simMin
Minimum parameter to test.
uint32_t m_bytesTotal
Total bytes received.
Definition: wifi-adhoc.cc:54
Time m_simTime
Simulation run time, default 1000 s.
uint32_t m_simStep
Amount to increment param per trial.
UanModesList m_dataModes
List of UanTxModes used for data channels.
Time m_sifs
SIFS time duration.
uint32_t m_totalRate
Total channel capacity.
void ReceivePacket(Ptr< Socket > socket)
Definition: wifi-adhoc.cc:99
bool m_doNode
1 for do max nodes simulation (invalidates AMin and AMax values).
uint32_t m_simMax
Maximum parameter to test.
void CreateDualModes(uint32_t fc)
Create m_numRates matching control and data modes.
UanTxMode CreateMode(uint32_t kass, uint32_t fc, bool upperblock, std::string name)
Create a UanTxMode.
UanModesList m_controlModes
List of UanTxModes used for control channels.
uint32_t m_numRates
Number of divided rates ( (NumberRates+1)TotalRate should be 0).
uint32_t m_numNodes
Number of transmitting nodes.
uint32_t m_maxRange
Maximum range between gateway and acoustic node.
uint32_t m_pktSize
Packet size in bytes.
std::string m_gnuplotfile
Filename for GnuPlot.
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.
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.
virtual Address GetAddress(void) const =0
virtual uint32_t GetIfIndex(void) const =0
keep track of a set of node pointers.
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.
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
void SetPhy(std::string phyType, 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 PHY attributes.
Definition: uan-helper.cc:118
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
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
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_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 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
mobility
Definition: third.py:108
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:56