A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
adhoc-aloha-ideal-phy-with-microwave-oven.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/multi-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 <ns3/friis-spectrum-propagation-loss.h>
36 #include <ns3/propagation-delay-model.h>
37 #include <ns3/mobility-module.h>
38 #include <ns3/spectrum-helper.h>
39 #include <ns3/applications-module.h>
40 #include <ns3/adhoc-aloha-noack-ideal-phy-helper.h>
41 #include <ns3/waveform-generator-helper.h>
42 #include <ns3/spectrum-analyzer-helper.h>
43 #include <ns3/non-communicating-net-device.h>
44 #include <ns3/microwave-oven-spectrum-value-helper.h>
45 
46 NS_LOG_COMPONENT_DEFINE ("OfdmWithWaveformGenerator");
47 
48 using namespace ns3;
49 
50 static bool g_verbose = false;
51 
52 
53 void
54 PhyTxStartTrace (std::string context, Ptr<const Packet> p)
55 {
56  if (g_verbose)
57  {
58  std::cout << context << " PHY TX START p: " << p << std::endl;
59  }
60 }
61 
62 
63 void
64 PhyTxEndTrace (std::string context, Ptr<const Packet> p)
65 {
66  if (g_verbose)
67  {
68  std::cout << context << " PHY TX END p: " << p << std::endl;
69  }
70 }
71 
72 void
73 PhyRxStartTrace (std::string context, Ptr<const Packet> p)
74 {
75  if (g_verbose)
76  {
77  std::cout << context << " PHY RX START p:" << p << std::endl;
78  }
79 }
80 
81 void
82 PhyRxEndOkTrace (std::string context, Ptr<const Packet> p)
83 {
84  if (g_verbose)
85  {
86  std::cout << context << " PHY RX END OK p:" << p << std::endl;
87  }
88 }
89 
90 void
91 PhyRxEndErrorTrace (std::string context, Ptr<const Packet> p)
92 {
93  if (g_verbose)
94  {
95  std::cout << context << " PHY RX END ERROR p:" << p << std::endl;
96  }
97 }
98 
99 
100 void
102 {
103  Ptr<Packet> packet;
104  uint64_t bytes = 0;
105  while ((packet = socket->Recv ()))
106  {
107  bytes += packet->GetSize ();
108  }
109  if (g_verbose)
110  {
111  std::cout << "SOCKET received " << bytes << " bytes" << std::endl;
112  }
113 }
114 
117 {
118  TypeId tid = TypeId::LookupByName ("ns3::PacketSocketFactory");
119  Ptr<Socket> sink = Socket::CreateSocket (node, tid);
120  sink->Bind ();
122  return sink;
123 }
124 
125 int main (int argc, char** argv)
126 {
127  CommandLine cmd;
128  cmd.AddValue ("verbose", "Print trace information if true", g_verbose);
129  cmd.Parse (argc, argv);
130 
131  NodeContainer ofdmNodes;
132  NodeContainer waveformGeneratorNodes;
133  NodeContainer spectrumAnalyzerNodes;
134  NodeContainer allNodes;
135 
136  ofdmNodes.Create (2);
137  waveformGeneratorNodes.Create (1);
138  spectrumAnalyzerNodes.Create (1);
139  allNodes.Add (ofdmNodes);
140  allNodes.Add (waveformGeneratorNodes);
141  allNodes.Add (spectrumAnalyzerNodes);
142 
143  MobilityHelper mobility;
144  Ptr<ListPositionAllocator> nodePositionList = CreateObject<ListPositionAllocator> ();
145  nodePositionList->Add (Vector (5.0, 0.0, 0.0)); // TX node
146  nodePositionList->Add (Vector (0.0, 0.0, 0.0)); // RX node
147  nodePositionList->Add (Vector (10.0, 0.0, 0.0)); // Microwave Oven
148  nodePositionList->Add (Vector (0.0, 0.0, 0.0)); // Spectrum Analyzer
149  mobility.SetPositionAllocator (nodePositionList);
150  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
151 
152  mobility.Install (allNodes);
153 
154 
156  channelHelper.SetChannel ("ns3::MultiModelSpectrumChannel");
157  Ptr<SpectrumChannel> channel = channelHelper.Create ();
158 
159 
161  // Configure ofdm nodes
163 
165 
166  double txPower = 0.1; // Watts
167  uint32_t channelNumber = 2;
168  Ptr<SpectrumValue> txPsd = sf.CreateTxPowerSpectralDensity (txPower, channelNumber);
169 
170  // for the noise, we use the Power Spectral Density of thermal noise
171  // at room temperature. The value of the PSD will be constant over the band of interest.
172  const double k = 1.381e-23; //Boltzmann's constant
173  const double T = 290; // temperature in Kelvin
174  double noisePsdValue = k * T; // watts per hertz
175  Ptr<SpectrumValue> noisePsd = sf.CreateConstant (noisePsdValue);
176 
177 
178  AdhocAlohaNoackIdealPhyHelper adhocAlohaOfdmHelper;
179  adhocAlohaOfdmHelper.SetChannel (channel);
180  adhocAlohaOfdmHelper.SetTxPowerSpectralDensity (txPsd);
181  adhocAlohaOfdmHelper.SetNoisePowerSpectralDensity (noisePsd);
182  adhocAlohaOfdmHelper.SetPhyAttribute ("Rate", DataRateValue (DataRate ("1Mbps")));
183  NetDeviceContainer ofdmDevices = adhocAlohaOfdmHelper.Install (ofdmNodes);
184 
185  PacketSocketHelper packetSocket;
186  packetSocket.Install (ofdmNodes);
187 
188  PacketSocketAddress socket;
189  socket.SetSingleDevice (ofdmDevices.Get (0)->GetIfIndex ());
190  socket.SetPhysicalAddress (ofdmDevices.Get (1)->GetAddress ());
191  socket.SetProtocol (1);
192 
193  OnOffHelper onoff ("ns3::PacketSocketFactory", Address (socket));
194  onoff.SetAttribute ("OnTime", StringValue ("ns3::ExponentialRandomVariable[Mean=0.4]"));
195  onoff.SetAttribute ("OffTime", StringValue ("ns3::ExponentialRandomVariable[Mean=0.1]"));
196  onoff.SetAttribute ("DataRate", DataRateValue (DataRate ("0.4Mbps")));
197  onoff.SetAttribute ("PacketSize", UintegerValue (1500));
198 
199  ApplicationContainer apps = onoff.Install (ofdmNodes.Get (0));
200  apps.Start (Seconds (0.0));
201  apps.Stop (Seconds (2));
202 
203  Ptr<Socket> recvSink = SetupPacketReceive (ofdmNodes.Get (1));
204 
205 
206 
207 
208 
210  // Configure waveform generator
212 
214  NS_LOG_INFO ("mwoPsd : " << *mwoPsd);
215 
216  WaveformGeneratorHelper waveformGeneratorHelper;
217  waveformGeneratorHelper.SetChannel (channel);
218  waveformGeneratorHelper.SetTxPowerSpectralDensity (mwoPsd);
219 
220  waveformGeneratorHelper.SetPhyAttribute ("Period", TimeValue (Seconds (1.0 / 60))); // corresponds to 60 Hz
221  waveformGeneratorHelper.SetPhyAttribute ("DutyCycle", DoubleValue (0.5));
222  NetDeviceContainer waveformGeneratorDevices = waveformGeneratorHelper.Install (waveformGeneratorNodes);
223 
225  waveformGeneratorDevices.Get (0)->GetObject<NonCommunicatingNetDevice> ()->GetPhy ()->GetObject<WaveformGenerator> ());
226 
227 
228 
230  // Configure spectrum analyzer
232 
233 
234  SpectrumAnalyzerHelper spectrumAnalyzerHelper;
235  spectrumAnalyzerHelper.SetChannel (channel);
236  spectrumAnalyzerHelper.SetRxSpectrumModel (SpectrumModelIsm2400MhzRes1Mhz);
237  spectrumAnalyzerHelper.SetPhyAttribute ("Resolution", TimeValue (MilliSeconds (2)));
238  spectrumAnalyzerHelper.SetPhyAttribute ("NoisePowerSpectralDensity", DoubleValue (1e-15)); // -120 dBm/Hz
239  spectrumAnalyzerHelper.EnableAsciiAll ("spectrum-analyzer-output");
240  NetDeviceContainer spectrumAnalyzerDevices = spectrumAnalyzerHelper.Install (spectrumAnalyzerNodes);
241 
242 
243 
244 
245 
246 
247  Config::Connect ("/NodeList/*/DeviceList/*/Phy/TxStart", MakeCallback (&PhyTxStartTrace));
248  Config::Connect ("/NodeList/*/DeviceList/*/Phy/TxEnd", MakeCallback (&PhyTxEndTrace));
249  Config::Connect ("/NodeList/*/DeviceList/*/Phy/RxStart", MakeCallback (&PhyRxStartTrace));
250  Config::Connect ("/NodeList/*/DeviceList/*/Phy/RxEndOk", MakeCallback (&PhyRxEndOkTrace));
251  Config::Connect ("/NodeList/*/DeviceList/*/Phy/RxEndError", MakeCallback (&PhyRxEndErrorTrace));
252 
253 
254 
255 
256  Simulator::Stop (Seconds (0.3));
257 
258  Simulator::Run ();
259 
261 
262 }
263 
264