A Discrete-Event Network Simulator
API
uan-rc-example.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009 University of Washington
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Leonard Tracy <lentracy@gmail.com>
18  */
19 
53 #include "uan-rc-example.h"
54 
55 #include "ns3/applications-module.h"
56 #include "ns3/callback.h"
57 #include "ns3/config.h"
58 #include "ns3/core-module.h"
59 #include "ns3/log.h"
60 #include "ns3/mobility-module.h"
61 #include "ns3/network-module.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, uint32_t fc, bool upperblock, std::string name) const
99 {
100  std::ostringstream buf;
101  buf << name << " " << kass;
102 
103  uint32_t rate = m_totalRate / (m_numRates + 1) * (kass);
104  uint32_t bw = kass * m_totalRate / (m_numRates + 1);
105  uint32_t fcmode;
106  if (upperblock)
107  {
108  fcmode = (m_totalRate - bw) / 2 + fc;
109  }
110  else
111  {
112  fcmode = (uint32_t)((-((double)m_totalRate) + (double)bw) / 2.0 + (double)fc);
113  }
114 
115  uint32_t phyrate = m_totalRate;
116 
117  UanTxMode mode;
118  mode = UanTxModeFactory::CreateMode(UanTxMode::OTHER, rate, phyrate, fcmode, bw, 2, buf.str());
119  return mode;
120 }
121 
122 // Creates m_numRates different modes each dividing m_totalRate Hz (assumes 1 bit per hz)
123 // centered at frequency fc
124 void
126 {
127  for (uint32_t i = 1; i < m_numRates + 1; i++)
128  {
129  m_controlModes.AppendMode(CreateMode(i, fc, false, "control "));
130  }
131  for (uint32_t i = m_numRates; i > 0; i--)
132  {
133  m_dataModes.AppendMode(CreateMode(i, fc, true, "data "));
134  }
135 }
136 
137 uint32_t
138 Experiment::Run(uint32_t param)
139 {
140  UanHelper uan;
141 
142  m_bytesTotal = 0;
143 
144  uint32_t nNodes;
145  uint32_t a;
146  if (m_doNode)
147  {
148  a = 0;
149  nNodes = param;
150  }
151  else
152  {
153  nNodes = m_numNodes;
154  a = param;
155  }
156  Time pDelay = Seconds((double)m_maxRange / 1500.0);
157 
158  uan.SetPhy("ns3::UanPhyDual",
159  "SupportedModesPhy1",
161  "SupportedModesPhy2",
163 
164  uan.SetMac("ns3::UanMacRcGw",
165  "NumberOfRates",
167  "NumberOfNodes",
168  UintegerValue(nNodes),
169  "MaxReservations",
170  UintegerValue(a),
171  "SIFS",
172  TimeValue(m_sifs),
173  "MaxPropDelay",
174  TimeValue(pDelay),
175  "FrameSize",
177  Ptr<UanChannel> chan = CreateObject<UanChannel>();
178 
180  sink.Create(1);
181  NetDeviceContainer sinkDev = uan.Install(sink, chan);
182 
183  uan.SetMac("ns3::UanMacRc",
184  "NumberOfRates",
186  "MaxPropDelay",
187  TimeValue(pDelay));
189  nodes.Create(nNodes);
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  mobility.SetPositionAllocator(pos);
212  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
213  mobility.Install(sink);
214  mobility.Install(nodes);
215 
216  PacketSocketHelper pktskth;
217  pktskth.Install(nodes);
218  pktskth.Install(sink);
219 
220  PacketSocketAddress socket;
221  socket.SetSingleDevice(sinkDev.Get(0)->GetIfIndex());
222  socket.SetPhysicalAddress(sinkDev.Get(0)->GetAddress());
223  socket.SetProtocol(0);
224 
225  OnOffHelper app("ns3::PacketSocketFactory", Address(socket));
226  app.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
227  app.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=0]"));
228  app.SetAttribute("DataRate", DataRateValue(m_totalRate));
229  app.SetAttribute("PacketSize", UintegerValue(m_pktSize));
230 
231  ApplicationContainer apps = app.Install(nodes);
232 
233  apps.Start(Seconds(0.5));
234  apps.Stop(m_simTime + Seconds(0.5));
235 
236  Ptr<Node> sinkNode = sink.Get(0);
237  TypeId psfid = TypeId::LookupByName("ns3::PacketSocketFactory");
238 
239  Ptr<Socket> sinkSocket = Socket::CreateSocket(sinkNode, psfid);
240  sinkSocket->Bind(socket);
242 
243  Simulator::Stop(m_simTime + Seconds(0.6));
244  Simulator::Run();
245  Simulator::Destroy();
246 
247  return m_bytesTotal;
248 }
249 
250 int
251 main(int argc, char* argv[])
252 {
253  Experiment exp;
254  bool quiet = false;
255 
256  CommandLine cmd(__FILE__);
257  cmd.AddValue("TotalRate", "Total channel capacity", exp.m_totalRate);
258  cmd.AddValue("NumberRates",
259  "Number of divided rates ( (NumberRates+1)%TotalRate should be 0)",
260  exp.m_numRates);
261  cmd.AddValue("MaxRange", "Maximum range between gateway and acoustic node", exp.m_maxRange);
262  cmd.AddValue("SimMin",
263  "Minimum parameter to test (nodes if DoNode=1, \"a\" param otherwise)",
264  exp.m_simMin);
265  cmd.AddValue("SimMax",
266  "Maximum parameter to test (nodes if DoNode=1, \"a\" param otherwise)",
267  exp.m_simMax);
268  cmd.AddValue("SimStep", "Amount to increment param per trial", exp.m_simStep);
269  cmd.AddValue("DataFile", "Filename for GnuPlot", exp.m_gnuplotfile);
270  cmd.AddValue("NumberNodes", "Number of nodes (invalid for doNode=1)", exp.m_numNodes);
271  cmd.AddValue("SIFS", "SIFS time duration", exp.m_sifs);
272  cmd.AddValue("PktSize", "Packet size in bytes", exp.m_pktSize);
273  cmd.AddValue("SimTime", "Simulation time per trial", exp.m_simTime);
274  cmd.AddValue("DoNode",
275  "1 for do max nodes simulation (invalidates AMin and AMax values)",
276  exp.m_doNode);
277  cmd.AddValue("Quiet", "Run in quiet mode (disable logging)", quiet);
278  cmd.Parse(argc, argv);
279 
280  if (!quiet)
281  {
282  LogComponentEnable("UanRcExample", LOG_LEVEL_ALL);
283  }
284 
285  exp.CreateDualModes(12000);
286 
287  ;
288 
289  Gnuplot2dDataset ds;
290  for (uint32_t param = exp.m_simMin; param <= exp.m_simMax; param += exp.m_simStep)
291  {
292  uint32_t bytesRx = exp.Run(param);
293  NS_LOG_DEBUG("param=" << param << ": Received " << bytesRx << " bytes at sink");
294 
295  double util = bytesRx * 8.0 / (exp.m_simTime.GetSeconds() * exp.m_totalRate);
296 
297  ds.Add(param, util);
298 
299  SeedManager::SetRun(SeedManager::GetRun() + 1);
300  }
301 
302  Gnuplot gp;
303  gp.AddDataset(ds);
304  std::ofstream of(exp.m_gnuplotfile);
305  if (!of.is_open())
306  {
307  NS_FATAL_ERROR("Can not open GNU Plot outfile: " << exp.m_gnuplotfile);
308  }
309  gp.GenerateOutput(of);
310 
311  return 0;
312 }
WiFi adhoc experiment class.
Definition: wifi-adhoc.cc:45
Gnuplot2dDataset Run(const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel)
Run an experiment.
Definition: wifi-adhoc.cc:162
uint32_t m_simMin
Minimum parameter to test.
uint32_t m_bytesTotal
The number of received bytes.
Definition: wifi-adhoc.cc:97
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.
UanTxMode CreateMode(uint32_t kass, uint32_t fc, bool upperblock, std::string name) const
Create a UanTxMode.
void ReceivePacket(Ptr< Socket > socket)
Receive a packet.
Definition: wifi-adhoc.cc:142
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.
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:100
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
void Stop(Time stop) const
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:232
AttributeValue implementation for DataRate.
Class to represent a 2D points plot.
Definition: gnuplot.h:116
void Add(double x, double y)
Definition: gnuplot.cc:377
a simple class to generate gnuplot-ready plotting commands from a set of datasets.
Definition: gnuplot.h:370
void AddDataset(const GnuplotDataset &dataset)
Definition: gnuplot.cc:796
void GenerateOutput(std::ostream &os)
Writes gnuplot commands and data values to a single output stream.
Definition: gnuplot.cc:802
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.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:44
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() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:863
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.
void SetRecvCallback(Callback< void, Ptr< Socket >> receivedData)
Notify application when new data is available to be read.
Definition: socket.cc:126
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Hold variables of type string.
Definition: string.h:56
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:402
AttributeValue implementation for Time.
Definition: nstime.h:1423
a unique identifier for an interface.
Definition: type-id.h:60
UAN configuration helper.
Definition: uan-helper.h:42
void SetPhy(std::string phyType, Ts &&... args)
Set PHY attributes.
Definition: uan-helper.h:204
void SetMac(std::string type, Ts &&... args)
Set MAC attributes.
Definition: uan-helper.h:197
NetDeviceContainer Install(NodeContainer c) const
This method creates a simple ns3::UanChannel (with a default ns3::UanNoiseModelDefault and ns3::UanPr...
Definition: uan-helper.cc:145
void AppendMode(UanTxMode mode)
Add mode to this list.
Definition: uan-tx-mode.cc:230
AttributeValue implementation for UanModesList.
Abstraction of packet modulation information.
Definition: uan-tx-mode.h:43
Hold an unsigned integer type.
Definition: uinteger.h:45
double GetValue(double min, double max)
Get the next random value drawn from the distribution.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:268
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1336
NodeContainer nodes
devices
Definition: first.py:35
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void LogComponentEnable(const std::string &name, LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:305
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:707
@ LOG_LEVEL_ALL
Print everything.
Definition: log.h:116
cmd
Definition: second.py:33
mobility
Definition: third.py:96
Ptr< PacketSink > sink
Pointer to the packet sink application.
Definition: wifi-tcp.cc:55