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-animation.cc
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2010 Andrea Sacco
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: Andrea Sacco <andrea.sacco85@gmail.com>
19
*/
20
21
39
#include "
uan-animation.h
"
40
#include "ns3/core-module.h"
41
#include "ns3/network-module.h"
42
#include "ns3/netanim-module.h"
43
#include "ns3/mobility-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
NetAnimExperiment::NetAnimExperiment
()
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
{
66
}
67
68
void
69
NetAnimExperiment::ResetData
()
70
{
71
NS_LOG_DEBUG
(
Simulator::Now
().GetSeconds () <<
" Resetting data"
);
72
m_throughputs
.push_back (
m_bytesTotal
* 8.0 /
m_simTime
.
GetSeconds
());
73
m_bytesTotal
= 0;
74
}
75
76
void
77
NetAnimExperiment::IncrementCw
(uint32_t cw)
78
{
79
NS_ASSERT
(
m_throughputs
.size () ==
m_avgs
);
80
81
double
avgThroughput = 0.0;
82
for
(uint32_t i=0; i<
m_avgs
; i++)
83
{
84
avgThroughput +=
m_throughputs
[i];
85
}
86
avgThroughput /=
m_avgs
;
87
m_throughputs
.clear ();
88
89
Config::Set
(
"/NodeList/*/DeviceList/*/Mac/CW"
,
UintegerValue
(cw +
m_cwStep
));
90
91
SeedManager::SetRun (SeedManager::GetRun () + 1);
92
93
NS_LOG_DEBUG
(
"Average for cw="
<< cw <<
" over "
<< m_avgs <<
" runs: "
<< avgThroughput);
94
}
95
void
96
NetAnimExperiment::UpdatePositions
(
NodeContainer
&
nodes
)
97
{
98
99
NS_LOG_DEBUG
(
Simulator::Now
().GetSeconds () <<
" Updating positions"
);
100
NodeContainer::Iterator
it = nodes.
Begin
();
101
Ptr<UniformRandomVariable>
uv = CreateObject<UniformRandomVariable> ();
102
uv->
SetAttribute
(
"Min"
,
DoubleValue
(0.0));
103
uv->
SetAttribute
(
"Max"
,
DoubleValue
(
m_boundary
));
104
for
(; it != nodes.
End
(); it++)
105
{
106
Ptr<MobilityModel>
mp = (*it)->
GetObject
<
MobilityModel
> ();
107
mp->
SetPosition
(
Vector
(uv->
GetValue
(), uv->
GetValue
(), 70.0));
108
}
109
}
110
111
void
112
NetAnimExperiment::ReceivePacket
(
Ptr<Socket>
socket)
113
{
114
Ptr<Packet>
packet;
115
116
while
((packet = socket->
Recv
()))
117
{
118
m_bytesTotal
+= packet->
GetSize
();
119
}
120
packet = 0;
121
}
122
123
void
124
NetAnimExperiment::Run
(
UanHelper
&uan)
125
{
126
uan.
SetMac
(
"ns3::UanMacCw"
,
"CW"
,
UintegerValue
(
m_cwMin
),
"SlotTime"
,
TimeValue
(
m_slotTime
));
127
NodeContainer
nc =
NodeContainer
();
128
NodeContainer
sink =
NodeContainer
();
129
nc.
Create
(
m_numNodes
);
130
sink.
Create
(1);
131
132
PacketSocketHelper
socketHelper;
133
socketHelper.
Install
(nc);
134
socketHelper.
Install
(sink);
135
136
#ifdef UAN_PROP_BH_INSTALLED
137
Ptr<UanPropModelBh>
prop = CreateObjectWithAttributes<UanPropModelBh> (
"ConfigFile"
,
StringValue
(
"exbhconfig.cfg"
));
138
#else
139
Ptr<UanPropModelIdeal>
prop = CreateObjectWithAttributes<UanPropModelIdeal> ();
140
#endif //UAN_PROP_BH_INSTALLED
141
Ptr<UanChannel>
channel = CreateObjectWithAttributes<UanChannel> (
"PropagationModel"
,
PointerValue
(prop));
142
143
//Create net device and nodes with UanHelper
144
NetDeviceContainer
devices
= uan.
Install
(nc, channel);
145
NetDeviceContainer
sinkdev = uan.
Install
(sink, channel);
146
147
MobilityHelper
mobility;
148
Ptr<ListPositionAllocator>
pos = CreateObject<ListPositionAllocator> ();
149
150
{
151
Ptr<UniformRandomVariable>
urv = CreateObject<UniformRandomVariable> ();
152
urv->
SetAttribute
(
"Min"
,
DoubleValue
(0.0));
153
urv->
SetAttribute
(
"Max"
,
DoubleValue
(
m_boundary
));
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
();
161
double
y = urv->
GetValue
();
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
NS_LOG_DEBUG
(
"Mean range from gateway: "
<< rsum / m_numNodes
169
<<
" min. range "
<< minr);
170
171
mobility.
SetPositionAllocator
(pos);
172
mobility.
SetMobilityModel
(
"ns3::ConstantPositionMobilityModel"
);
173
mobility.
Install
(sink);
174
175
NS_LOG_DEBUG
(
"Position of sink: "
176
<< sink.
Get
(0)->
GetObject
<
MobilityModel
> ()->
GetPosition
());
177
mobility.
Install
(nc);
178
179
PacketSocketAddress
socket;
180
socket.
SetSingleDevice
(sinkdev.
Get
(0)->
GetIfIndex
());
181
socket.
SetPhysicalAddress
(sinkdev.
Get
(0)->
GetAddress
());
182
socket.
SetProtocol
(0);
183
184
OnOffHelper
app (
"ns3::PacketSocketFactory"
,
Address
(socket));
185
app.
SetAttribute
(
"OnTime"
,
StringValue
(
"ns3::ConstantRandomVariable[Constant=1.0]"
));
186
app.
SetAttribute
(
"OffTime"
,
StringValue
(
"ns3::ConstantRandomVariable[Constant=0.0]"
));
187
app.
SetAttribute
(
"DataRate"
,
DataRateValue
(
m_dataRate
));
188
app.
SetAttribute
(
"PacketSize"
,
UintegerValue
(
m_packetSize
));
189
190
ApplicationContainer
apps = app.
Install
(nc);
191
apps.
Start
(Seconds (0.5));
192
Time
nextEvent = Seconds (0.5);
193
194
195
for
(uint32_t cw =
m_cwMin
; cw <=
m_cwMax
; cw +=
m_cwStep
)
196
{
197
198
for
(uint32_t an = 0; an <
m_avgs
; an++)
199
{
200
nextEvent +=
m_simTime
;
201
Simulator::Schedule (nextEvent, &
NetAnimExperiment::ResetData
,
this
);
202
Simulator::Schedule (nextEvent, &
NetAnimExperiment::UpdatePositions
,
this
, nc);
203
}
204
Simulator::Schedule (nextEvent, &
NetAnimExperiment::IncrementCw
,
this
, cw);
205
}
206
apps.
Stop
(nextEvent +
m_simTime
);
207
208
Ptr<Node>
sinkNode = sink.
Get
(0);
209
TypeId
psfid = TypeId::LookupByName (
"ns3::PacketSocketFactory"
);
210
if
(sinkNode->
GetObject
<
SocketFactory
> (psfid) == 0)
211
{
212
Ptr<PacketSocketFactory>
psf = CreateObject<PacketSocketFactory> ();
213
sinkNode->
AggregateObject
(psf);
214
}
215
Ptr<Socket>
sinkSocket = Socket::CreateSocket (sinkNode, psfid);
216
sinkSocket->
Bind
(socket);
217
sinkSocket->
SetRecvCallback
(
MakeCallback
(&
NetAnimExperiment::ReceivePacket
,
this
));
218
219
m_bytesTotal
= 0;
220
221
std::string traceFileName =
"uan-animation.xml"
;
222
AnimationInterface
anim(traceFileName.c_str ());
223
224
Simulator::Run
();
225
sinkNode = 0;
226
sinkSocket = 0;
227
pos = 0;
228
channel = 0;
229
prop = 0;
230
for
(uint32_t i=0; i < nc.
GetN
(); i++)
231
{
232
nc.
Get
(i) = 0;
233
}
234
for
(uint32_t i=0; i < sink.
GetN
(); i++)
235
{
236
sink.
Get
(i) = 0;
237
}
238
239
for
(uint32_t i=0; i < devices.GetN (); i++)
240
{
241
devices.Get (i) = 0;
242
}
243
for
(uint32_t i=0; i < sinkdev.
GetN
(); i++)
244
{
245
sinkdev.
Get
(i) = 0;
246
}
247
248
Simulator::Destroy ();
249
}
250
}
251
252
int
253
main
(
int
argc,
char
**argv)
254
{
255
256
LogComponentEnable
(
"UanCwExample"
,
LOG_LEVEL_ALL
);
257
//LogComponentEnable ("AnimationInterface", LOG_LEVEL_ALL);
258
259
NetAnimExperiment
exp;
260
261
std::string perModel =
"ns3::UanPhyPerGenDefault"
;
262
std::string sinrModel =
"ns3::UanPhyCalcSinrDefault"
;
263
264
CommandLine
cmd;
265
cmd.
AddValue
(
"NumNodes"
,
"Number of transmitting nodes"
, exp.
m_numNodes
);
266
cmd.
AddValue
(
"Depth"
,
"Depth of transmitting and sink nodes"
, exp.
m_depth
);
267
cmd.
AddValue
(
"RegionSize"
,
"Size of boundary in meters"
, exp.
m_boundary
);
268
cmd.
AddValue
(
"PacketSize"
,
"Generated packet size in bytes"
, exp.
m_packetSize
);
269
cmd.
AddValue
(
"DataRate"
,
"DataRate in bps"
, exp.
m_dataRate
);
270
cmd.
AddValue
(
"CwMin"
,
"Min CW to simulate"
, exp.
m_cwMin
);
271
cmd.
AddValue
(
"CwMax"
,
"Max CW to simulate"
, exp.
m_cwMax
);
272
cmd.
AddValue
(
"SlotTime"
,
"Slot time duration"
, exp.
m_slotTime
);
273
cmd.
AddValue
(
"Averages"
,
"Number of topologies to test for each cw point"
, exp.
m_avgs
);
274
cmd.
AddValue
(
"PerModel"
,
"PER model name"
, perModel);
275
cmd.
AddValue
(
"SinrModel"
,
"SINR model name"
, sinrModel);
276
cmd.
Parse
(argc, argv);
277
278
ObjectFactory
obf;
279
obf.
SetTypeId
(perModel);
280
Ptr<UanPhyPer>
per = obf.
Create
<
UanPhyPer
> ();
281
obf.
SetTypeId
(sinrModel);
282
Ptr<UanPhyCalcSinr>
sinr = obf.
Create
<
UanPhyCalcSinr
> ();
283
284
UanHelper
uan;
285
UanTxMode
mode;
286
mode = UanTxModeFactory::CreateMode (UanTxMode::FSK, exp.
m_dataRate
,
287
exp.
m_dataRate
, 12000,
288
exp.
m_dataRate
, 2,
289
"Default mode"
);
290
UanModesList
myModes;
291
myModes.
AppendMode
(mode);
292
293
uan.SetPhy (
"ns3::UanPhyGen"
,
294
"PerModel"
,
PointerValue
(per),
295
"SinrModel"
,
PointerValue
(sinr),
296
"SupportedModes"
, UanModesListValue (myModes));
297
298
exp.
Run
(uan);
299
300
per = 0;
301
sinr = 0;
302
303
}
304
src
netanim
examples
uan-animation.cc
Generated on Fri Aug 30 2013 01:42:59 for ns-3 by
1.8.1.2