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
energy-model-example.cc
Go to the documentation of this file.
1
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
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: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
19
*/
20
21
#include "ns3/core-module.h"
22
#include "ns3/network-module.h"
23
#include "ns3/mobility-module.h"
24
#include "ns3/config-store-module.h"
25
#include "ns3/wifi-module.h"
26
#include "ns3/energy-module.h"
27
#include "ns3/internet-module.h"
28
29
#include <iostream>
30
#include <fstream>
31
#include <vector>
32
#include <string>
33
34
NS_LOG_COMPONENT_DEFINE
(
"EnergyExample"
);
35
36
using namespace
ns3;
37
38
static
inline
std::string
39
PrintReceivedPacket
(
Address
& from)
40
{
41
InetSocketAddress
iaddr =
InetSocketAddress::ConvertFrom
(from);
42
43
std::ostringstream oss;
44
oss <<
"--\nReceived one packet! Socket: "
<< iaddr.
GetIpv4
()
45
<<
" port: "
<< iaddr.
GetPort
()
46
<<
" at time = "
<<
Simulator::Now
().
GetSeconds
()
47
<<
"\n--"
;
48
49
return
oss.str ();
50
}
51
57
void
58
ReceivePacket
(
Ptr<Socket>
socket)
59
{
60
Ptr<Packet>
packet;
61
Address
from;
62
while
((packet = socket->
RecvFrom
(from)))
63
{
64
if
(packet->
GetSize
() > 0)
65
{
66
NS_LOG_UNCOND
(
PrintReceivedPacket
(from));
67
}
68
}
69
}
70
80
static
void
81
GenerateTraffic
(
Ptr<Socket>
socket, uint32_t pktSize,
Ptr<Node>
n,
82
uint32_t pktCount,
Time
pktInterval)
83
{
84
if
(pktCount > 0)
85
{
86
socket->
Send
(Create<Packet> (pktSize));
87
Simulator::Schedule
(pktInterval, &
GenerateTraffic
, socket, pktSize, n,
88
pktCount - 1, pktInterval);
89
}
90
else
91
{
92
socket->
Close
();
93
}
94
}
95
97
void
98
RemainingEnergy
(
double
oldValue,
double
remainingEnergy)
99
{
100
NS_LOG_UNCOND
(
Simulator::Now
().GetSeconds ()
101
<<
"s Current remaining energy = "
<< remainingEnergy <<
"J"
);
102
}
103
105
void
106
TotalEnergy
(
double
oldValue,
double
totalEnergy)
107
{
108
NS_LOG_UNCOND
(
Simulator::Now
().GetSeconds ()
109
<<
"s Total energy consumed by radio = "
<< totalEnergy <<
"J"
);
110
}
111
112
int
113
main
(
int
argc,
char
*argv[])
114
{
115
/*
116
LogComponentEnable ("EnergySource", LOG_LEVEL_DEBUG);
117
LogComponentEnable ("BasicEnergySource", LOG_LEVEL_DEBUG);
118
LogComponentEnable ("DeviceEnergyModel", LOG_LEVEL_DEBUG);
119
LogComponentEnable ("WifiRadioEnergyModel", LOG_LEVEL_DEBUG);
120
*/
121
122
std::string phyMode (
"DsssRate1Mbps"
);
123
double
Prss = -80;
// dBm
124
uint32_t PpacketSize = 200;
// bytes
125
bool
verbose
=
false
;
126
127
// simulation parameters
128
uint32_t numPackets = 10000;
// number of packets to send
129
double
interval = 1;
// seconds
130
double
startTime
= 0.0;
// seconds
131
double
distanceToRx = 100.0;
// meters
132
/*
133
* This is a magic number used to set the transmit power, based on other
134
* configuration.
135
*/
136
double
offset = 81;
137
138
CommandLine
cmd;
139
cmd.
AddValue
(
"phyMode"
,
"Wifi Phy mode"
, phyMode);
140
cmd.
AddValue
(
"Prss"
,
"Intended primary RSS (dBm)"
, Prss);
141
cmd.
AddValue
(
"PpacketSize"
,
"size of application packet sent"
, PpacketSize);
142
cmd.
AddValue
(
"numPackets"
,
"Total number of packets to send"
, numPackets);
143
cmd.
AddValue
(
"startTime"
,
"Simulation start time"
, startTime);
144
cmd.
AddValue
(
"distanceToRx"
,
"X-Axis distance between nodes"
, distanceToRx);
145
cmd.
AddValue
(
"verbose"
,
"Turn on all device log components"
, verbose);
146
cmd.
Parse
(argc, argv);
147
148
// Convert to time object
149
Time
interPacketInterval = Seconds (interval);
150
151
// disable fragmentation for frames below 2200 bytes
152
Config::SetDefault
(
"ns3::WifiRemoteStationManager::FragmentationThreshold"
,
153
StringValue
(
"2200"
));
154
// turn off RTS/CTS for frames below 2200 bytes
155
Config::SetDefault
(
"ns3::WifiRemoteStationManager::RtsCtsThreshold"
,
156
StringValue
(
"2200"
));
157
// Fix non-unicast data rate to be the same as that of unicast
158
Config::SetDefault
(
"ns3::WifiRemoteStationManager::NonUnicastMode"
,
159
StringValue
(phyMode));
160
161
NodeContainer
c;
162
c.
Create
(2);
// create 2 nodes
163
NodeContainer
networkNodes;
164
networkNodes.
Add
(c.
Get
(0));
165
networkNodes.
Add
(c.
Get
(1));
166
167
// The below set of helpers will help us to put together the wifi NICs we want
168
WifiHelper
wifi;
169
if
(verbose)
170
{
171
wifi.
EnableLogComponents
();
172
}
173
wifi.
SetStandard
(
WIFI_PHY_STANDARD_80211b
);
174
176
/***************************************************************************/
177
YansWifiPhyHelper
wifiPhy =
YansWifiPhyHelper::Default
();
178
wifiPhy.
Set
(
"RxGain"
,
DoubleValue
(-10));
179
wifiPhy.
Set
(
"TxGain"
,
DoubleValue
(offset + Prss));
180
wifiPhy.
Set
(
"CcaMode1Threshold"
,
DoubleValue
(0.0));
181
/***************************************************************************/
182
184
YansWifiChannelHelper
wifiChannel;
185
wifiChannel.
SetPropagationDelay
(
"ns3::ConstantSpeedPropagationDelayModel"
);
186
wifiChannel.
AddPropagationLoss
(
"ns3::FriisPropagationLossModel"
);
187
// create wifi channel
188
Ptr<YansWifiChannel>
wifiChannelPtr = wifiChannel.
Create
();
189
wifiPhy.
SetChannel
(wifiChannelPtr);
190
192
// Add a non-QoS upper MAC, and disable rate control
193
NqosWifiMacHelper
wifiMac =
NqosWifiMacHelper::Default
();
194
wifi.
SetRemoteStationManager
(
"ns3::ConstantRateWifiManager"
,
"DataMode"
,
195
StringValue
(phyMode),
"ControlMode"
,
196
StringValue
(phyMode));
197
// Set it to ad-hoc mode
198
wifiMac.
SetType
(
"ns3::AdhocWifiMac"
);
199
201
NetDeviceContainer
devices
= wifi.
Install
(wifiPhy, wifiMac, networkNodes);
202
204
MobilityHelper
mobility;
205
Ptr<ListPositionAllocator>
positionAlloc = CreateObject<ListPositionAllocator> ();
206
positionAlloc->
Add
(
Vector
(0.0, 0.0, 0.0));
207
positionAlloc->
Add
(
Vector
(2 * distanceToRx, 0.0, 0.0));
208
mobility.
SetPositionAllocator
(positionAlloc);
209
mobility.
SetMobilityModel
(
"ns3::ConstantPositionMobilityModel"
);
210
mobility.
Install
(c);
211
213
/***************************************************************************/
214
/* energy source */
215
BasicEnergySourceHelper
basicSourceHelper;
216
// configure energy source
217
basicSourceHelper.
Set
(
"BasicEnergySourceInitialEnergyJ"
,
DoubleValue
(0.1));
218
// install source
219
EnergySourceContainer
sources = basicSourceHelper.
Install
(c);
220
/* device energy model */
221
WifiRadioEnergyModelHelper
radioEnergyHelper;
222
// configure radio energy model
223
radioEnergyHelper.
Set
(
"TxCurrentA"
,
DoubleValue
(0.0174));
224
// install device model
225
DeviceEnergyModelContainer
deviceModels = radioEnergyHelper.
Install
(devices, sources);
226
/***************************************************************************/
227
229
InternetStackHelper
internet;
230
internet.
Install
(networkNodes);
231
232
Ipv4AddressHelper
ipv4;
233
NS_LOG_INFO
(
"Assign IP Addresses."
);
234
ipv4.
SetBase
(
"10.1.1.0"
,
"255.255.255.0"
);
235
Ipv4InterfaceContainer
i = ipv4.
Assign
(devices);
236
237
TypeId
tid =
TypeId::LookupByName
(
"ns3::UdpSocketFactory"
);
238
Ptr<Socket>
recvSink =
Socket::CreateSocket
(networkNodes.
Get
(1), tid);
// node 1, receiver
239
InetSocketAddress
local =
InetSocketAddress
(
Ipv4Address::GetAny
(), 80);
240
recvSink->
Bind
(local);
241
recvSink->
SetRecvCallback
(
MakeCallback
(&
ReceivePacket
));
242
243
Ptr<Socket>
source =
Socket::CreateSocket
(networkNodes.
Get
(0), tid);
// node 0, sender
244
InetSocketAddress
remote =
InetSocketAddress
(
Ipv4Address::GetBroadcast
(), 80);
245
source->
SetAllowBroadcast
(
true
);
246
source->
Connect
(remote);
247
249
/***************************************************************************/
250
// all sources are connected to node 1
251
// energy source
252
Ptr<BasicEnergySource>
basicSourcePtr = DynamicCast<BasicEnergySource> (sources.
Get
(1));
253
basicSourcePtr->
TraceConnectWithoutContext
(
"RemainingEnergy"
,
MakeCallback
(&
RemainingEnergy
));
254
// device energy model
255
Ptr<DeviceEnergyModel>
basicRadioModelPtr =
256
basicSourcePtr->
FindDeviceEnergyModels
(
"ns3::WifiRadioEnergyModel"
).
Get
(0);
257
NS_ASSERT
(basicRadioModelPtr != NULL);
258
basicRadioModelPtr->
TraceConnectWithoutContext
(
"TotalEnergyConsumption"
,
MakeCallback
(&
TotalEnergy
));
259
/***************************************************************************/
260
261
263
// start traffic
264
Simulator::Schedule
(Seconds (startTime), &
GenerateTraffic
, source, PpacketSize,
265
networkNodes.
Get
(0), numPackets, interPacketInterval);
266
267
Simulator::Stop
(Seconds (10.0));
268
Simulator::Run
();
269
Simulator::Destroy
();
270
271
return
0;
272
}
examples
energy
energy-model-example.cc
Generated on Fri Aug 30 2013 01:42:43 for ns-3 by
1.8.1.2