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
adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc
Go to the documentation of this file.
1
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2010 CTTC
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: Nicola Baldo <nbaldo@cttc.es>
19
*/
20
21
22
23
#include <iostream>
24
25
#include <ns3/core-module.h>
26
#include <ns3/network-module.h>
27
#include <ns3/spectrum-model-ism2400MHz-res1MHz.h>
28
#include <ns3/spectrum-model-300kHz-300GHz-log.h>
29
#include <ns3/wifi-spectrum-value-helper.h>
30
#include <ns3/single-model-spectrum-channel.h>
31
#include <ns3/waveform-generator.h>
32
#include <ns3/spectrum-analyzer.h>
33
#include <ns3/log.h>
34
#include <string>
35
#include <iomanip>
36
#include <ns3/friis-spectrum-propagation-loss.h>
37
#include <ns3/propagation-delay-model.h>
38
#include <ns3/mobility-module.h>
39
#include <ns3/spectrum-helper.h>
40
#include <ns3/applications-module.h>
41
#include <ns3/adhoc-aloha-noack-ideal-phy-helper.h>
42
43
44
NS_LOG_COMPONENT_DEFINE
(
"TestAdhocOfdmAloha"
);
45
46
using namespace
ns3;
47
48
static
bool
g_verbose
=
false
;
49
static
uint64_t
g_rxBytes
;
50
51
void
52
PhyRxEndOkTrace
(std::string context,
Ptr<const Packet>
p)
53
{
54
if
(
g_verbose
)
55
{
56
std::cout << context <<
" PHY RX END OK p:"
<< p << std::endl;
57
}
58
g_rxBytes
+= p->
GetSize
();
59
}
60
61
62
69
class
GlobalPathlossDatabase
70
{
71
public
:
72
81
void
UpdatePathloss (std::string context,
Ptr<SpectrumPhy>
txPhy,
Ptr<SpectrumPhy>
rxPhy,
double
lossDb);
82
87
void
Print ();
88
89
private
:
90
std::map<uint32_t, std::map<uint32_t, double> >
m_pathlossMap
;
91
};
92
93
void
94
GlobalPathlossDatabase::UpdatePathloss
(std::string context,
95
Ptr<SpectrumPhy>
txPhy,
96
Ptr<SpectrumPhy>
rxPhy,
97
double
lossDb)
98
{
99
uint32_t txNodeId = txPhy->
GetMobility
()->
GetObject
<
Node
> ()->GetId ();
100
uint32_t rxNodeId = rxPhy->
GetMobility
()->
GetObject
<
Node
> ()->GetId ();
101
m_pathlossMap[txNodeId][rxNodeId] = lossDb;
102
}
103
104
void
105
GlobalPathlossDatabase::Print
()
106
{
107
for
(std::map<uint32_t, std::map<uint32_t, double> >::const_iterator txit = m_pathlossMap.begin ();
108
txit != m_pathlossMap.end ();
109
++txit)
110
{
111
for
(std::map<uint32_t, double>::const_iterator rxit = txit->second.begin ();
112
rxit != txit->second.end ();
113
++rxit)
114
{
115
std::cout << txit->first <<
" --> "
<< rxit->first <<
" : "
<< rxit->second <<
" dB"
<< std::endl;
116
}
117
}
118
}
119
120
121
122
int
main
(
int
argc,
char
** argv)
123
{
124
CommandLine
cmd;
125
double
lossDb = 150;
126
double
txPowerW = 0.1;
127
uint64_t phyRate = 500000;
128
uint32_t pktSize = 1000;
129
double
simDuration = 0.5;
130
std::string channelType (
"ns3::SingleModelSpectrumChannel"
);
131
cmd.
AddValue
(
"verbose"
,
"Print trace information if true"
,
g_verbose
);
132
cmd.
AddValue
(
"lossDb"
,
"link loss in dB"
, lossDb);
133
cmd.
AddValue
(
"txPowerW"
,
"txPower in Watts"
, txPowerW);
134
cmd.
AddValue
(
"phyRate"
,
"PHY rate in bps"
, phyRate);
135
cmd.
AddValue
(
"pktSize"
,
"packet size in bytes"
, pktSize);
136
cmd.
AddValue
(
"simDuration"
,
"duration of the simulation in seconds"
, simDuration);
137
cmd.
AddValue
(
"channelType"
,
"which SpectrumChannel implementation to be used"
, channelType);
138
cmd.
Parse
(argc, argv);
139
140
NodeContainer
c;
141
c.
Create
(2);
142
143
MobilityHelper
mobility;
144
Ptr<ListPositionAllocator>
positionAlloc = CreateObject<ListPositionAllocator> ();
145
positionAlloc->
Add
(
Vector
(0.0, 0.0, 0.0));
146
positionAlloc->
Add
(
Vector
(5.0, 0.0, 0.0));
147
mobility.
SetPositionAllocator
(positionAlloc);
148
mobility.
SetMobilityModel
(
"ns3::ConstantPositionMobilityModel"
);
149
150
151
mobility.
Install
(c);
152
153
154
SpectrumChannelHelper
channelHelper;
155
channelHelper.
SetChannel
(channelType);
156
channelHelper.
SetPropagationDelay
(
"ns3::ConstantSpeedPropagationDelayModel"
);
157
Ptr<MatrixPropagationLossModel>
propLoss = CreateObject<MatrixPropagationLossModel> ();
158
propLoss->
SetLoss
(c.
Get
(0)->
GetObject
<
MobilityModel
> (), c.
Get
(1)->
GetObject
<
MobilityModel
> (), lossDb,
true
);
159
channelHelper.
AddPropagationLoss
(propLoss);
160
Ptr<SpectrumChannel>
channel = channelHelper.
Create
();
161
162
163
WifiSpectrumValue5MhzFactory
sf;
164
165
uint32_t channelNumber = 1;
166
Ptr<SpectrumValue>
txPsd = sf.
CreateTxPowerSpectralDensity
(txPowerW, channelNumber);
167
168
// for the noise, we use the Power Spectral Density of thermal noise
169
// at room temperature. The value of the PSD will be constant over the band of interest.
170
const
double
k = 1.381e-23;
//Boltzmann's constant
171
const
double
T = 290;
// temperature in Kelvin
172
double
noisePsdValue = k * T;
// watts per hertz
173
Ptr<SpectrumValue>
noisePsd = sf.
CreateConstant
(noisePsdValue);
174
175
AdhocAlohaNoackIdealPhyHelper
deviceHelper;
176
deviceHelper.
SetChannel
(channel);
177
deviceHelper.
SetTxPowerSpectralDensity
(txPsd);
178
deviceHelper.
SetNoisePowerSpectralDensity
(noisePsd);
179
deviceHelper.
SetPhyAttribute
(
"Rate"
,
DataRateValue
(
DataRate
(phyRate)));
180
NetDeviceContainer
devices = deviceHelper.
Install
(c);
181
182
PacketSocketHelper
packetSocket;
183
packetSocket.
Install
(c);
184
185
PacketSocketAddress
socket;
186
socket.
SetSingleDevice
(devices.
Get
(0)->
GetIfIndex
());
187
socket.
SetPhysicalAddress
(devices.
Get
(1)->
GetAddress
());
188
socket.
SetProtocol
(1);
189
190
OnOffHelper
onoff (
"ns3::PacketSocketFactory"
,
Address
(socket));
191
onoff.
SetConstantRate
(
DataRate
(2*phyRate));
192
onoff.
SetAttribute
(
"PacketSize"
,
UintegerValue
(pktSize));
193
194
ApplicationContainer
apps = onoff.
Install
(c.
Get
(0));
195
apps.
Start
(
Seconds
(0.0));
196
apps.
Stop
(
Seconds
(simDuration));
197
198
Config::Connect
(
"/NodeList/*/DeviceList/*/Phy/RxEndOk"
,
MakeCallback
(&
PhyRxEndOkTrace
));
199
200
GlobalPathlossDatabase
globalPathlossDatabase;
201
Config::Connect
(
"/ChannelList/*/PropagationLoss"
,
202
MakeCallback
(&
GlobalPathlossDatabase::UpdatePathloss
, &globalPathlossDatabase));
203
204
g_rxBytes
= 0;
205
Simulator::Stop
(
Seconds
(simDuration + 0.000001));
206
Simulator::Run
();
207
208
if
(
g_verbose
)
209
{
210
globalPathlossDatabase.
Print
();
211
212
double
throughputBps = (
g_rxBytes
* 8.0) / simDuration;
213
std::cout <<
"throughput: "
<< throughputBps << std::endl;
214
std::cout <<
"throughput: "
<< std::setw (20) << std::fixed << throughputBps <<
" bps"
<< std::endl;
215
std::cout <<
"phy rate : "
<< std::setw (20) << std::fixed << phyRate*1.0 <<
" bps"
<< std::endl;
216
double
rxPowerW = txPowerW / (std::pow (10.0, lossDb/10.0));
217
double
capacity = 20e6*log2 (1.0 + (rxPowerW/20.0e6)/noisePsdValue);
218
std::cout <<
"shannon capacity: "
<< std::setw (20) << std::fixed << capacity <<
" bps"
<< std::endl;
219
220
}
221
222
223
224
Simulator::Destroy
();
225
return
0;
226
}
src
spectrum
examples
adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc
Generated on Fri Dec 21 2012 19:00:45 for ns-3 by
1.8.1.2