A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
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
39
#include "
uan-cw-example.h
"
40
#include "ns3/core-module.h"
41
#include "ns3/network-module.h"
42
#include "ns3/mobility-module.h"
43
#include "ns3/tools-module.h"
44
#include "ns3/applications-module.h"
45
46
#include <fstream>
47
48
using namespace
ns3;
49
50
NS_LOG_COMPONENT_DEFINE
(
"UanCwExample"
);
51
52
Experiment::Experiment
()
53
: m_numNodes (15),
54
m_dataRate (80),
55
m_depth (70),
56
m_boundary (500),
57
m_packetSize (32),
58
m_bytesTotal (0),
59
m_cwMin (10),
60
m_cwMax (400),
61
m_cwStep (10),
62
m_avgs (3),
63
m_slotTime (
Seconds
(0.2)),
64
m_simTime (
Seconds
(1000)),
65
m_gnudatfile (
"uan-cw-example.gpl"
),
66
m_asciitracefile (
"uan-cw-example.asc"
),
67
m_bhCfgFile (
"uan-apps/dat/default.cfg"
)
68
{
69
}
70
71
void
72
Experiment::ResetData
()
73
{
74
NS_LOG_DEBUG
(
Simulator::Now
().GetSeconds () <<
" Resetting data"
);
75
m_throughputs
.push_back (
m_bytesTotal
* 8.0 /
m_simTime
.
GetSeconds
());
76
m_bytesTotal
= 0;
77
}
78
79
void
80
Experiment::IncrementCw
(uint32_t cw)
81
{
82
NS_ASSERT
(
m_throughputs
.size () ==
m_avgs
);
83
84
double
avgThroughput = 0.0;
85
for
(uint32_t i=0; i<
m_avgs
; i++)
86
{
87
avgThroughput +=
m_throughputs
[i];
88
}
89
avgThroughput /=
m_avgs
;
90
m_data
.
Add
(cw, avgThroughput);
91
m_throughputs
.clear ();
92
93
Config::Set
(
"/NodeList/*/DeviceList/*/Mac/CW"
,
UintegerValue
(cw +
m_cwStep
));
94
95
SeedManager::SetRun (SeedManager::GetRun () + 1);
96
97
NS_LOG_DEBUG
(
"Average for cw="
<< cw <<
" over "
<< m_avgs <<
" runs: "
<< avgThroughput);
98
}
99
void
100
Experiment::UpdatePositions
(
NodeContainer
&nodes)
101
{
102
103
NS_LOG_DEBUG
(
Simulator::Now
().GetSeconds () <<
" Updating positions"
);
104
NodeContainer::Iterator
it = nodes.
Begin
();
105
Ptr<UniformRandomVariable>
uv = CreateObject<UniformRandomVariable> ();
106
for
(; it != nodes.
End
(); it++)
107
{
108
Ptr<MobilityModel>
mp = (*it)->
GetObject
<
MobilityModel
> ();
109
mp->
SetPosition
(
Vector
(uv->
GetValue
(0,
m_boundary
), uv->
GetValue
(0,
m_boundary
), 70.0));
110
}
111
}
112
113
void
114
Experiment::ReceivePacket
(
Ptr<Socket>
socket)
115
{
116
Ptr<Packet>
packet;
117
118
while
((packet = socket->
Recv
()))
119
{
120
m_bytesTotal
+= packet->
GetSize
();
121
}
122
packet = 0;
123
}
124
125
Gnuplot2dDataset
126
Experiment::Run
(
UanHelper
&uan)
127
{
128
uan.
SetMac
(
"ns3::UanMacCw"
,
"CW"
,
UintegerValue
(
m_cwMin
),
"SlotTime"
,
TimeValue
(
m_slotTime
));
129
NodeContainer
nc =
NodeContainer
();
130
NodeContainer
sink =
NodeContainer
();
131
nc.
Create
(
m_numNodes
);
132
sink.
Create
(1);
133
134
PacketSocketHelper
socketHelper;
135
socketHelper.
Install
(nc);
136
socketHelper.
Install
(sink);
137
138
#ifdef UAN_PROP_BH_INSTALLED
139
Ptr<UanPropModelBh>
prop = CreateObjectWithAttributes<UanPropModelBh> (
"ConfigFile"
,
StringValue
(
"exbhconfig.cfg"
));
140
#else
141
Ptr<UanPropModelIdeal>
prop = CreateObjectWithAttributes<UanPropModelIdeal> ();
142
#endif //UAN_PROP_BH_INSTALLED
143
Ptr<UanChannel>
channel = CreateObjectWithAttributes<UanChannel> (
"PropagationModel"
,
PointerValue
(prop));
144
145
//Create net device and nodes with UanHelper
146
NetDeviceContainer
devices = uan.
Install
(nc, channel);
147
NetDeviceContainer
sinkdev = uan.
Install
(sink, channel);
148
149
MobilityHelper
mobility;
150
Ptr<ListPositionAllocator>
pos = CreateObject<ListPositionAllocator> ();
151
152
{
153
Ptr<UniformRandomVariable>
urv = CreateObject<UniformRandomVariable> ();
154
pos->
Add
(
Vector
(
m_boundary
/ 2.0,
m_boundary
/ 2.0,
m_depth
));
155
double
rsum = 0;
156
157
double
minr = 2 *
m_boundary
;
158
for
(uint32_t i = 0; i <
m_numNodes
; i++)
159
{
160
double
x
= urv->
GetValue
(0,
m_boundary
);
161
double
y = urv->
GetValue
(0,
m_boundary
);
162
double
newr = std::sqrt ((x -
m_boundary
/ 2.0) * (x -
m_boundary
/ 2.0)
163
+ (y -
m_boundary
/ 2.0) * (y -
m_boundary
/ 2.0));
164
rsum += newr;
165
minr = std::min (minr, newr);
166
pos->
Add
(
Vector
(x, y,
m_depth
));
167
168
}
169
NS_LOG_DEBUG
(
"Mean range from gateway: "
<< rsum / m_numNodes
170
<<
" min. range "
<< minr);
171
172
mobility.
SetPositionAllocator
(pos);
173
mobility.
SetMobilityModel
(
"ns3::ConstantPositionMobilityModel"
);
174
mobility.
Install
(sink);
175
176
NS_LOG_DEBUG
(
"Position of sink: "
177
<< sink.
Get
(0)->
GetObject
<
MobilityModel
> ()->
GetPosition
());
178
mobility.
Install
(nc);
179
180
PacketSocketAddress
socket;
181
socket.
SetSingleDevice
(sinkdev.
Get
(0)->
GetIfIndex
());
182
socket.
SetPhysicalAddress
(sinkdev.
Get
(0)->
GetAddress
());
183
socket.
SetProtocol
(0);
184
185
OnOffHelper
app (
"ns3::PacketSocketFactory"
,
Address
(socket));
186
app.
SetAttribute
(
"OnTime"
,
StringValue
(
"ns3::ConstantRandomVariable[Constant=1]"
));
187
app.
SetAttribute
(
"OffTime"
,
StringValue
(
"ns3::ConstantRandomVariable[Constant=0]"
));
188
app.
SetAttribute
(
"DataRate"
,
DataRateValue
(
m_dataRate
));
189
app.
SetAttribute
(
"PacketSize"
,
UintegerValue
(
m_packetSize
));
190
191
ApplicationContainer
apps = app.
Install
(nc);
192
apps.
Start
(
Seconds
(0.5));
193
Time
nextEvent =
Seconds
(0.5);
194
195
196
for
(uint32_t cw =
m_cwMin
; cw <=
m_cwMax
; cw +=
m_cwStep
)
197
{
198
199
for
(uint32_t an = 0; an <
m_avgs
; an++)
200
{
201
nextEvent +=
m_simTime
;
202
Simulator::Schedule (nextEvent, &
Experiment::ResetData
,
this
);
203
Simulator::Schedule (nextEvent, &
Experiment::UpdatePositions
,
this
, nc);
204
}
205
Simulator::Schedule (nextEvent, &
Experiment::IncrementCw
,
this
, cw);
206
}
207
apps.
Stop
(nextEvent +
m_simTime
);
208
209
Ptr<Node>
sinkNode = sink.
Get
(0);
210
TypeId
psfid = TypeId::LookupByName (
"ns3::PacketSocketFactory"
);
211
if
(sinkNode->
GetObject
<
SocketFactory
> (psfid) == 0)
212
{
213
Ptr<PacketSocketFactory>
psf = CreateObject<PacketSocketFactory> ();
214
sinkNode->
AggregateObject
(psf);
215
}
216
Ptr<Socket>
sinkSocket = Socket::CreateSocket (sinkNode, psfid);
217
sinkSocket->
Bind
(socket);
218
sinkSocket->
SetRecvCallback
(
MakeCallback
(&
Experiment::ReceivePacket
,
this
));
219
220
m_bytesTotal
= 0;
221
222
std::ofstream ascii (
m_asciitracefile
.c_str ());
223
if
(!ascii.is_open ())
224
{
225
NS_FATAL_ERROR
(
"Could not open ascii trace file: "
226
<<
m_asciitracefile
);
227
}
228
uan.
EnableAsciiAll
(ascii);
229
230
Simulator::Run
();
231
sinkNode = 0;
232
sinkSocket = 0;
233
pos = 0;
234
channel = 0;
235
prop = 0;
236
for
(uint32_t i=0; i < nc.
GetN
(); i++)
237
{
238
nc.
Get
(i) = 0;
239
}
240
for
(uint32_t i=0; i < sink.
GetN
(); i++)
241
{
242
sink.
Get
(i) = 0;
243
}
244
245
for
(uint32_t i=0; i < devices.GetN (); i++)
246
{
247
devices.Get (i) = 0;
248
}
249
for
(uint32_t i=0; i < sinkdev.
GetN
(); i++)
250
{
251
sinkdev.
Get
(i) = 0;
252
}
253
254
Simulator::Destroy ();
255
return
m_data
;
256
}
257
}
258
259
int
260
main
(
int
argc,
char
**argv)
261
{
262
263
LogComponentEnable
(
"UanCwExample"
,
LOG_LEVEL_ALL
);
264
265
Experiment
exp;
266
267
std::string gnudatfile (
"cwexpgnuout.dat"
);
268
std::string perModel =
"ns3::UanPhyPerGenDefault"
;
269
std::string sinrModel =
"ns3::UanPhyCalcSinrDefault"
;
270
271
CommandLine
cmd;
272
cmd.
AddValue
(
"NumNodes"
,
"Number of transmitting nodes"
, exp.
m_numNodes
);
273
cmd.
AddValue
(
"Depth"
,
"Depth of transmitting and sink nodes"
, exp.
m_depth
);
274
cmd.
AddValue
(
"RegionSize"
,
"Size of boundary in meters"
, exp.
m_boundary
);
275
cmd.
AddValue
(
"PacketSize"
,
"Generated packet size in bytes"
, exp.
m_packetSize
);
276
cmd.
AddValue
(
"DataRate"
,
"DataRate in bps"
, exp.
m_dataRate
);
277
cmd.
AddValue
(
"CwMin"
,
"Min CW to simulate"
, exp.
m_cwMin
);
278
cmd.
AddValue
(
"CwMax"
,
"Max CW to simulate"
, exp.
m_cwMax
);
279
cmd.
AddValue
(
"SlotTime"
,
"Slot time duration"
, exp.
m_slotTime
);
280
cmd.
AddValue
(
"Averages"
,
"Number of topologies to test for each cw point"
, exp.
m_avgs
);
281
cmd.
AddValue
(
"GnuFile"
,
"Name for GNU Plot output"
, exp.
m_gnudatfile
);
282
cmd.
AddValue
(
"PerModel"
,
"PER model name"
, perModel);
283
cmd.
AddValue
(
"SinrModel"
,
"SINR model name"
, sinrModel);
284
cmd.
Parse
(argc, argv);
285
286
ObjectFactory
obf;
287
obf.
SetTypeId
(perModel);
288
Ptr<UanPhyPer>
per = obf.
Create
<
UanPhyPer
> ();
289
obf.
SetTypeId
(sinrModel);
290
Ptr<UanPhyCalcSinr>
sinr = obf.
Create
<
UanPhyCalcSinr
> ();
291
292
UanHelper
uan;
293
UanTxMode
mode;
294
mode = UanTxModeFactory::CreateMode (UanTxMode::FSK, exp.
m_dataRate
,
295
exp.
m_dataRate
, 12000,
296
exp.
m_dataRate
, 2,
297
"Default mode"
);
298
UanModesList
myModes;
299
myModes.
AppendMode
(mode);
300
301
uan.SetPhy (
"ns3::UanPhyGen"
,
302
"PerModel"
,
PointerValue
(per),
303
"SinrModel"
,
PointerValue
(sinr),
304
"SupportedModes"
, UanModesListValue (myModes));
305
306
Gnuplot
gp;
307
Gnuplot2dDataset
ds;
308
ds = exp.
Run
(uan);
309
310
gp.
AddDataset
(ds);
311
312
std::ofstream of (exp.
m_gnudatfile
.c_str ());
313
if
(!of.is_open ())
314
{
315
NS_FATAL_ERROR
(
"Can not open GNU Plot outfile: "
<< exp.
m_gnudatfile
);
316
}
317
gp.
GenerateOutput
(of);
318
319
per = 0;
320
sinr = 0;
321
322
}
323
src
uan
examples
uan-cw-example.cc
Generated on Tue May 14 2013 11:08:33 for ns-3 by
1.8.1.2