A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
70 
72  : m_simMin (1),
73  m_simMax (1),
74  m_simStep (1),
75  m_numRates (1023),
76  m_totalRate (4096),
77  m_maxRange (3000),
78  m_numNodes (15),
79  m_pktSize (1000),
80  m_doNode (true),
81  m_sifs (Seconds (0.05)),
82  m_simTime (Seconds (5000)),
83  m_gnuplotfile ("uan-rc-example.gpl"),
84  m_bytesTotal (0)
85 {
86 }
87 
88 void
90 {
91  Ptr<Packet> packet;
92  while ((packet = socket->Recv ()))
93  {
94  m_bytesTotal += packet->GetSize ();
95  }
96 }
97 
99 Experiment::CreateMode (uint32_t kass,
100  uint32_t fc,
101  bool upperblock,
102  std::string name)
103 {
104 
105  std::ostringstream buf;
106  buf << name << " " << kass;
107 
108  uint32_t rate = m_totalRate/(m_numRates+1)* (kass);
109  uint32_t bw = kass * m_totalRate / (m_numRates+1);
110  uint32_t fcmode;
111  if(upperblock)
112  fcmode = (m_totalRate - bw)/2 + fc;
113  else
114  fcmode = (uint32_t)((-((double) m_totalRate ) + (double) bw)/2.0 + (double) fc);
115 
116 
117  uint32_t phyrate = m_totalRate;
118 
119  UanTxMode mode;
120  mode = UanTxModeFactory::CreateMode (UanTxMode::OTHER,
121  rate,
122  phyrate,
123  fcmode,
124  bw,
125  2,
126  buf.str ());
127  return mode;
128 }
129 
130 //Creates m_numRates different modes each dividing m_totalRate Hz (assumes 1 bit per hz)
131 //centered at frequency fc
132 void
134 {
135 
136 
137  for (uint32_t i=1; i < m_numRates+1; i++)
138  {
139  m_controlModes.AppendMode (CreateMode (i, fc, false, "control "));
140  }
141  for (uint32_t i=m_numRates; i > 0; i--)
142  {
143  m_dataModes.AppendMode (CreateMode (i, fc, true, "data "));
144  }
145 }
146 
147 uint32_t
148 Experiment::Run (uint32_t param)
149 {
150 
151  UanHelper uan;
152 
153  m_bytesTotal=0;
154 
155  uint32_t nNodes;
156  uint32_t a;
157  if(m_doNode)
158  {
159  a=0;
160  nNodes = param;
161  }
162  else
163  {
164  nNodes = m_numNodes;
165  a = param;
166  }
167  Time pDelay = Seconds ((double) m_maxRange / 1500.0);
168 
169  uan.SetPhy ("ns3::UanPhyDual",
170  "SupportedModesPhy1", UanModesListValue (m_dataModes),
171  "SupportedModesPhy2", UanModesListValue (m_controlModes));
172 
173  uan.SetMac ("ns3::UanMacRcGw",
174  "NumberOfRates", UintegerValue (m_numRates),
175  "NumberOfNodes", UintegerValue (nNodes),
176  "MaxReservations", UintegerValue (a),
177  "SIFS", TimeValue (m_sifs),
178  "MaxPropDelay", TimeValue (pDelay),
179  "FrameSize", UintegerValue (m_pktSize));
180  Ptr<UanChannel> chan = CreateObject<UanChannel>();
181 
182  NodeContainer sink;
183  sink.Create (1);
184  NetDeviceContainer sinkDev = uan.Install (sink, chan);
185 
186  uan.SetMac ("ns3::UanMacRc",
187  "NumberOfRates", UintegerValue (m_numRates),
188  "MaxPropDelay", TimeValue (pDelay));
190  nodes.Create (nNodes);
191  NetDeviceContainer devices = uan.Install (nodes, chan);
192 
193  MobilityHelper mobility;
194  uint32_t depth = 70;
195  Ptr<ListPositionAllocator> pos = CreateObject<ListPositionAllocator> ();
196 
197  Ptr<UniformRandomVariable> urv = CreateObject<UniformRandomVariable> ();
198  Ptr<UniformRandomVariable> utheta = CreateObject<UniformRandomVariable> ();
199  pos->Add (Vector (m_maxRange, m_maxRange, depth));
200 
201  for (uint32_t i=0; i<nNodes; i++)
202  {
203  double theta = utheta->GetValue (0, 2.0*M_PI);
204  double r = urv->GetValue (0,m_maxRange);
205 
206  double x = m_maxRange + r*std::cos (theta);
207  double y = m_maxRange + r*std::sin (theta);
208 
209  pos->Add (Vector (x, y, depth));
210 
211  }
212 
213  mobility.SetPositionAllocator (pos);
214  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
215  mobility.Install (sink);
216  mobility.Install (nodes);
217 
218  PacketSocketHelper pktskth;
219  pktskth.Install (nodes);
220  pktskth.Install (sink);
221 
222  PacketSocketAddress socket;
223  socket.SetSingleDevice (sinkDev.Get (0)->GetIfIndex ());
224  socket.SetPhysicalAddress (sinkDev.Get (0)->GetAddress ());
225  socket.SetProtocol (0);
226 
227  OnOffHelper app ("ns3::PacketSocketFactory", Address (socket));
228  app.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
229  app.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
230  app.SetAttribute ("DataRate", DataRateValue (m_totalRate));
231  app.SetAttribute ("PacketSize", UintegerValue (m_pktSize));
232 
233  ApplicationContainer apps = app.Install (nodes);
234 
235  apps.Start (Seconds (0.5));
236  apps.Stop (m_simTime + Seconds (0.5));
237 
238  Ptr<Node> sinkNode = sink.Get (0);
239  TypeId psfid = TypeId::LookupByName ("ns3::PacketSocketFactory");
240 
241  Ptr<Socket> sinkSocket = Socket::CreateSocket (sinkNode, psfid);
242  sinkSocket->Bind (socket);
244 
245  Simulator::Stop (m_simTime + Seconds (0.6));
246  Simulator::Run ();
247  Simulator::Destroy ();
248 
249  return m_bytesTotal;
250 }
251 int
252 main (int argc, char *argv[])
253 {
254 
255  LogComponentEnable ("UanRcExample", LOG_LEVEL_ALL);
256 
257  Experiment exp;
258 
259  CommandLine cmd;
260  cmd.AddValue ("TotalRate", "Total channel capacity", exp.m_totalRate);
261  cmd.AddValue ("NumberRates", "Number of divided rates ( (NumberRates+1)%TotalRate should be 0)", exp.m_numRates);
262  cmd.AddValue ("MaxRange", "Maximum range between gateway and acoustic node", exp.m_maxRange);
263  cmd.AddValue ("SimMin", "Minimum parameter to test (nodes if DoNode=1, \"a\" param otherwise)", exp.m_simMin);
264  cmd.AddValue ("SimMax", "Maximum parameter to test (nodes if DoNode=1, \"a\" param otherwise)", exp.m_simMax);
265  cmd.AddValue ("SimStep", "Amount to increment param per trial", exp.m_simStep);
266  cmd.AddValue ("DataFile", "Filename for GnuPlot", exp.m_gnuplotfile);
267  cmd.AddValue ("NumberNodes", "Number of nodes (invalid for doNode=1)", exp.m_numNodes);
268  cmd.AddValue ("SIFS", "SIFS time duration", exp.m_sifs);
269  cmd.AddValue ("PktSize", "Packet size in bytes", exp.m_pktSize);
270  cmd.AddValue ("SimTime", "Simulation time per trial", exp.m_simTime);
271  cmd.AddValue ("DoNode", "1 for do max nodes simulation (invalidates AMin and AMax values)", exp.m_doNode);
272  cmd.Parse (argc, argv);
273 
274 
275 
276  exp.CreateDualModes (12000);
277 
278  ;
279 
280  Gnuplot2dDataset ds;
281  for (uint32_t param=exp.m_simMin; param<=exp.m_simMax; param += exp.m_simStep)
282  {
283  uint32_t bytesRx = exp.Run (param);
284  NS_LOG_DEBUG ("param=" << param << ": Received " << bytesRx << " bytes at sink");
285 
286  double util = bytesRx*8.0/(exp.m_simTime.GetSeconds ()*exp.m_totalRate);
287 
288  ds.Add (param, util);
289 
290  SeedManager::SetRun (SeedManager::GetRun () + 1);
291  }
292 
293  Gnuplot gp;
294  gp.AddDataset (ds);
295  std::ofstream of (exp.m_gnuplotfile.c_str ());
296  if (!of.is_open ())
297  {
298  NS_FATAL_ERROR ("Can not open GNU Plot outfile: " << exp.m_gnuplotfile);
299  }
300  gp.GenerateOutput (of);
301 
302 }
UAN configuration helper.
Definition: uan-helper.h:39
Helper class for UAN CW MAC example.
Definition: multirate.cc:71
holds a vector of ns3::Application pointers.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:79
uint32_t m_bytesTotal
Total bytes received.
Definition: wifi-adhoc.cc:48
UanModesList m_controlModes
List of UanTxModes used for control channels.
tuple devices
Definition: first.py:32
Class to represent a 2D points plot.
Definition: gnuplot.h:113
hold variables of type string
Definition: string.h:18
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
an address for a packet socket
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:170
int main(int argc, char *argv[])
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:744
void AddDataset(const GnuplotDataset &dataset)
Definition: gnuplot.cc:756
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:95
void ReceivePacket(Ptr< Socket > socket)
Definition: multirate.cc:165
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:42
a 3d vector
Definition: vector.h:31
Give ns3::PacketSocket powers to ns3::Node.
void SetSingleDevice(uint32_t device)
Set the address to match only a specified NetDevice.
a polymophic address class
Definition: address.h:86
Time m_sifs
SIFS time duration.
tuple nodes
Definition: first.py:25
std::string m_gnuplotfile
Filename for GnuPlot.
double GetSeconds(void) const
Definition: nstime.h:272
UanModesList m_dataModes
List of UanTxModes used for data channels.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
a simple class to generate gnuplot-ready plotting commands from a set of datasets.
Definition: gnuplot.h:367
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:91
hold objects of type ns3::Time
Definition: nstime.h:1008
Hold an unsigned integer type.
Definition: uinteger.h:46
Gnuplot2dDataset Run(const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const NqosWifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel, const MobilityHelper &mobility)
Definition: multirate.cc:373
Abstraction of packet modulation information.
Definition: uan-tx-mode.h:41
holds a vector of ns3::NetDevice pointers
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1242
void GenerateOutput(std::ostream &os)
Writes gnuplot commands and data values to a single output stream.
Definition: gnuplot.cc:762
void Add(double x, double y)
Definition: gnuplot.cc:359
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
Definition: socket.cc:127
uint32_t m_totalRate
Total channel capacity.
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 arguments.
Definition: command-line.h:177
Time m_simTime
Simulation run time, default 1000 s.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
void SetPhysicalAddress(const Address address)
Set the destination address.
keep track of a set of node pointers.
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
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())
uint32_t m_simMin
Minimum parameter to test.
void Install(Ptr< Node > node) const
Aggregate an instance of a ns3::PacketSocketFactory onto the provided node.
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.
uint32_t m_pktSize
Packet size in bytes.
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...
uint32_t m_simMax
Maximum parameter to test.
hold objects of type ns3::DataRate
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
Definition: command-line.h:435
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:213
void AppendMode(UanTxMode mode)
Add mode to this list.
Definition: uan-tx-mode.cc:232
void SetProtocol(uint16_t protocol)
Set the protocol.
uint32_t m_numRates
Number of divided rates ( (NumberRates+1)TotalRate should be 0).
void Parse(int argc, char *argv[])
Parse the program arguments.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
bool m_doNode
1 for do max nodes simulation (invalidates AMin and AMax values).
NetDeviceContainer Install(NodeContainer c) const
This method creates a simple ns3::UanChannel (with a default ns3::UanNoiseModelDefault and ns3::UanPr...
Definition: uan-helper.cc:208
uint32_t m_simStep
Amount to increment param per trial.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::OnOffApplication on each node of the input container configured with all the attribut...
a unique identifier for an interface.
Definition: type-id.h:49
uint32_t m_maxRange
Maximum range between gateway and acoustic node.
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:114
void SetAttribute(std::string name, const AttributeValue &value)
Helper function used to set the underlying application attributes.
uint32_t m_numNodes
Number of transmitting nodes.
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:318
Attribute Value class for UanTxModes.