A Discrete-Event Network Simulator
API
basic-energy-model-test.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: He Wu <mdzz@u.washington.edu>
19  */
20 
21 #include "ns3/basic-energy-source.h"
22 #include "ns3/wifi-radio-energy-model.h"
23 #include "ns3/basic-energy-source-helper.h"
24 #include "ns3/wifi-radio-energy-model-helper.h"
25 #include "ns3/energy-source-container.h"
26 #include "ns3/device-energy-model-container.h"
27 #include "ns3/log.h"
28 #include "ns3/node.h"
29 #include "ns3/simulator.h"
30 #include "ns3/double.h"
31 #include "ns3/config.h"
32 #include "ns3/string.h"
33 #include "ns3/yans-wifi-helper.h"
34 #include <cmath>
35 
36 using namespace ns3;
37 
38 NS_LOG_COMPONENT_DEFINE ("BasicEnergyModelTestSuite");
39 
45 {
46 public:
48  virtual ~BasicEnergyUpdateTest ();
49 
54  bool DoRun (void);
55 
56 private:
64  bool StateSwitchTest (WifiPhy::State state);
65 
66 private:
67  double m_timeS; // in seconds
68  double m_tolerance; // tolerance for power estimation
69 
72 };
73 
75 {
76  m_timeS = 15.5; // idle for 15 seconds before changing state
77  m_tolerance = 1.0e-13; //
78 }
79 
81 {
82 }
83 
84 bool
86 {
87  // set types
88  m_energySource.SetTypeId ("ns3::BasicEnergySource");
89  m_deviceEnergyModel.SetTypeId ("ns3::WifiRadioEnergyModel");
90 
91  uint8_t ret = 0;
92 
93  // run state switch tests
94  if (StateSwitchTest (WifiPhy::IDLE))
95  {
96  ret = 1;
97  std::cerr << "Problem with state switch test (WifiPhy idle)." << std::endl;
98  }
99  if (StateSwitchTest (WifiPhy::CCA_BUSY))
100  {
101  ret = 1;
102  std::cerr << "Problem with state switch test (WifiPhy cca busy)." << std::endl;
103  }
104  if (StateSwitchTest (WifiPhy::TX))
105  {
106  ret = 1;
107  std::cerr << "Problem with state switch test (WifiPhy tx)." << std::endl;
108  }
109  if (StateSwitchTest (WifiPhy::RX))
110  {
111  ret = 1;
112  std::cerr << "Problem with state switch test (WifiPhy rx)." << std::endl;
113  }
114  if (StateSwitchTest (WifiPhy::SWITCHING))
115  {
116  ret = 1;
117  std::cerr << "Problem with state switch test (WifiPhy switching)." << std::endl;
118  }
119  if (StateSwitchTest (WifiPhy::SLEEP))
120  {
121  ret = 1;
122  std::cerr << "Problem with state switch test (WifiPhy sleep)." << std::endl;
123  }
124  return ret;
125 }
126 
127 bool
129 {
130  // create node
131  Ptr<Node> node = CreateObject<Node> ();
132 
133  // create energy source
134  Ptr<BasicEnergySource> source = m_energySource.Create<BasicEnergySource> ();
135  // aggregate energy source to node
136  node->AggregateObject (source);
137 
138  // create device energy model
140  m_deviceEnergyModel.Create<WifiRadioEnergyModel> ();
141  // set energy source pointer
142  model->SetEnergySource (source);
143  // add device energy model to model list in energy source
144  source->AppendDeviceEnergyModel (model);
145 
146  // retrieve device energy model from energy source
148  source->FindDeviceEnergyModels ("ns3::WifiRadioEnergyModel");
149  // check list
150  if ((models.GetN () == 0))
151  {
152  std::cerr << "Model list is empty!." << std::endl;
153  return true;
154  }
155  // get pointer
156  Ptr<WifiRadioEnergyModel> devModel =
157  DynamicCast<WifiRadioEnergyModel> (models.Get (0));
158  // check pointer
159  if ((devModel == 0))
160  {
161  std::cerr << "NULL pointer to device model!." << std::endl;
162  return true;
163  }
164 
165  /*
166  * The radio will stay IDLE for m_timeS seconds. Then it will switch into a
167  * different state.
168  */
169 
170  // schedule change of state
171  Simulator::Schedule (Seconds (m_timeS),
172  &WifiRadioEnergyModel::ChangeState, devModel, state);
173 
174  // Calculate remaining energy at simulation stop time
175  Simulator::Schedule (Seconds (m_timeS * 2),
177 
178  double timeDelta = 0.000000001; // 1 nanosecond
179  // run simulation; stop just after last scheduled event
180  Simulator::Stop (Seconds (m_timeS * 2 + timeDelta));
181  Simulator::Run ();
182 
183  // energy = current * voltage * time
184 
185  // calculate idle power consumption
186  double estRemainingEnergy = source->GetInitialEnergy ();
187  double voltage = source->GetSupplyVoltage ();
188  estRemainingEnergy -= devModel->GetIdleCurrentA () * voltage * m_timeS;
189 
190  /*
191  * Manually calculate the number of periodic updates performed by the source.
192  * This is to check if the periodic updates are performed correctly.
193  */
194  double actualTime = m_timeS;
195  actualTime /= source->GetEnergyUpdateInterval ().GetSeconds ();
196  actualTime = floor (actualTime); // rounding for update interval
197  actualTime *= source->GetEnergyUpdateInterval ().GetSeconds ();
198 
199  // calculate new state power consumption
200  double current = 0.0;
201  switch (state)
202  {
203  case WifiPhy::IDLE:
204  current = devModel->GetIdleCurrentA ();
205  break;
206  case WifiPhy::CCA_BUSY:
207  current = devModel->GetCcaBusyCurrentA ();
208  break;
209  case WifiPhy::TX:
210  current = devModel->GetTxCurrentA ();
211  break;
212  case WifiPhy::RX:
213  current = devModel->GetRxCurrentA ();
214  break;
215  case WifiPhy::SWITCHING:
216  current = devModel->GetSwitchingCurrentA ();
217  break;
218  case WifiPhy::SLEEP:
219  current = devModel->GetSleepCurrentA ();
220  break;
221  default:
222  NS_FATAL_ERROR ("Undefined radio state: " << state);
223  break;
224  }
225  estRemainingEnergy -= current * voltage * m_timeS;
226 
227  // obtain remaining energy from source
228  double remainingEnergy = source->GetRemainingEnergy ();
229  NS_LOG_DEBUG ("Remaining energy is " << remainingEnergy);
230  NS_LOG_DEBUG ("Estimated remaining energy is " << estRemainingEnergy);
231  NS_LOG_DEBUG ("Difference is " << estRemainingEnergy - remainingEnergy);
232 
233  // check remaining energy
234  if ((remainingEnergy > (estRemainingEnergy + m_tolerance)) ||
235  (remainingEnergy < (estRemainingEnergy - m_tolerance)))
236  {
237  std::cerr << "Incorrect remaining energy!" << std::endl;
238  return true;
239  }
240 
241  // obtain radio state
242  WifiPhy::State endState = devModel->GetCurrentState ();
243  NS_LOG_DEBUG ("Radio state is " << endState);
244  // check end state
245  if (endState != state)
246  {
247  std::cerr << "Incorrect end state!" << std::endl;
248  return true;
249  }
251 
252  return false; // no error
253 }
254 
255 // -------------------------------------------------------------------------- //
256 
262 {
263 public:
265  virtual ~BasicEnergyDepletionTest ();
266 
271  bool DoRun (void);
272 
273 private:
277  void DepletionHandler (void);
278 
286  bool DepletionTestCase (double simTimeS, double updateIntervalS);
287 
288 private:
289  int m_numOfNodes; // number of nodes in simulation
290  int m_callbackCount; // counter for # of callbacks invoked
291  double m_simTimeS; // maximum simulation time, in seconds
292  double m_timeStepS; // simulation time step size, in seconds
293  double m_updateIntervalS; // update interval of each device model
294 
295 };
296 
298 {
299  m_numOfNodes = 10;
300  m_callbackCount = 0;
301  m_simTimeS = 4.5;
302  m_timeStepS = 0.5;
303  m_updateIntervalS = 1.5;
304 }
305 
307 {
308 }
309 
310 bool
312 {
313  /*
314  * Run simulation with different simulation time and update interval.
315  */
316  uint8_t ret = 0;
317 
318  for (double simTimeS = 0.0; simTimeS <= m_simTimeS; simTimeS += m_timeStepS)
319  {
320  for (double updateIntervalS = 0.5; updateIntervalS <= m_updateIntervalS;
321  updateIntervalS += m_timeStepS)
322  {
323  if (DepletionTestCase (simTimeS, updateIntervalS))
324  {
325  ret = 1;
326  std::cerr << "Depletion test case problem." << std::endl;
327  }
328  // reset callback count
329  m_callbackCount = 0;
330  }
331  }
332  return ret;
333 }
334 
335 void
337 {
338  m_callbackCount++;
339 }
340 
341 bool
343  double updateIntervalS)
344 {
345  // create node
346  NodeContainer c;
347  c.Create (m_numOfNodes);
348 
349  std::string phyMode ("DsssRate1Mbps");
350 
351  // disable fragmentation for frames below 2200 bytes
352  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold",
353  StringValue ("2200"));
354  // turn off RTS/CTS for frames below 2200 bytes
355  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
356  StringValue ("2200"));
357  // Fix non-unicast data rate to be the same as that of unicast
358  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
359  StringValue (phyMode));
360 
361  // install YansWifiPhy
364 
366  /*
367  * This is one parameter that matters when using FixedRssLossModel, set it to
368  * zero; otherwise, gain will be added.
369  */
370  wifiPhy.Set ("RxGain", DoubleValue (0));
371  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
373 
374  YansWifiChannelHelper wifiChannel;
375  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
376  wifiPhy.SetChannel (wifiChannel.Create ());
377 
378  // Add a MAC and disable rate control
379  WifiMacHelper wifiMac;
380  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
381  "DataMode", StringValue (phyMode),
382  "ControlMode", StringValue (phyMode));
383  // Set it to ad-hoc mode
384  wifiMac.SetType ("ns3::AdhocWifiMac");
385  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
386 
387  /*
388  * Create and install energy source and a single basic radio energy model on
389  * the node using helpers.
390  */
391  // source helper
392  BasicEnergySourceHelper basicSourceHelper;
393  // set energy to 0 so that we deplete energy at the beginning of simulation
394  basicSourceHelper.Set ("BasicEnergySourceInitialEnergyJ", DoubleValue (0.0));
395  // set update interval
396  basicSourceHelper.Set ("PeriodicEnergyUpdateInterval",
397  TimeValue (Seconds (updateIntervalS)));
398  // install source
399  EnergySourceContainer sources = basicSourceHelper.Install (c);
400 
401  // device energy model helper
402  WifiRadioEnergyModelHelper radioEnergyHelper;
403  // set energy depletion callback
406  radioEnergyHelper.SetDepletionCallback (callback);
407  // install on node
408  DeviceEnergyModelContainer deviceModels = radioEnergyHelper.Install (devices, sources);
409 
410  // run simulation
411  Simulator::Stop (Seconds (simTimeS));
412  Simulator::Run ();
414 
415  NS_LOG_DEBUG ("Simulation time = " << simTimeS << "s");
416  NS_LOG_DEBUG ("Update interval = " << updateIntervalS << "s");
417  NS_LOG_DEBUG ("Expected callback count is " << m_numOfNodes);
418  NS_LOG_DEBUG ("Actual callback count is " << m_callbackCount);
419 
420  // check result, call back should only be invoked once
421  if (m_numOfNodes != m_callbackCount)
422  {
423  std::cerr << "Not all callbacks are invoked!" << std::endl;
424  return true;
425  }
426 
427  return false;
428 }
429 
430 // -------------------------------------------------------------------------- //
431 
432 int
433 main (int argc, char **argv)
434 {
435  BasicEnergyUpdateTest testEnergyUpdate;
436  if (testEnergyUpdate.DoRun ())
437  {
438  return 1;
439  }
440 
441  BasicEnergyDepletionTest testEnergyDepletion;
442  if (testEnergyDepletion.DoRun ())
443  {
444  return 1;
445  }
446 
447  return 0;
448 }
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:112
DeviceEnergyModelContainer Install(Ptr< NetDevice > device, Ptr< EnergySource > source) const
Assign WifiRadioEnergyModel to wifi devices.
Holds a vector of ns3::EnergySource pointers.
tuple devices
Definition: first.py:32
void SetDepletionCallback(WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback)
Ptr< YansWifiChannel > Create(void) const
void SetRemoteStationManager(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:683
Hold variables of type string.
Definition: string.h:41
Make it easy to create and manage PHY objects for the yans model.
The PHY layer has sense the medium busy through the CCA mechanism.
Definition: wifi-phy.h:177
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
Definition: object.cc:252
static void Run(void)
Run the simulation.
Definition: simulator.cc:201
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
BasicEnergySource decreases/increases remaining energy stored in itself in linearly.
virtual void ChangeState(int newState)
Changes state of the WifiRadioEnergyMode.
The PHY layer is sleeping.
Definition: wifi-phy.h:193
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:162
virtual void UpdateEnergySource(void)
Implements UpdateEnergySource.
Test case of update remaining energy for BasicEnergySource and WifiRadioEnergyModel.
static YansWifiPhyHelper Default(void)
Create a phy helper in a default working state.
helps to create WifiNetDevice objects
Definition: wifi-helper.h:231
void SetPcapDataLinkType(enum SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:530
Holds a vector of ns3::DeviceEnergyModel pointers.
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wifi-helper.cc:712
void SetChannel(Ptr< YansWifiChannel > channel)
double GetCcaBusyCurrentA(void) const
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1238
AttributeValue implementation for Time.
Definition: nstime.h:957
The PHY layer is IDLE.
Definition: wifi-phy.h:173
Creates a BasicEnergySource object.
holds a vector of ns3::NetDevice pointers
virtual void SetStandard(enum WifiPhyStandard standard)
Definition: wifi-helper.cc:706
The PHY layer is receiving a packet.
Definition: wifi-phy.h:185
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1489
WifiPhy::State GetCurrentState(void) const
The PHY layer is sending a packet.
Definition: wifi-phy.h:181
bool StateSwitchTest(WifiPhy::State state)
The PHY layer is switching to other channel.
Definition: wifi-phy.h:189
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:165
Ptr< DeviceEnergyModel > Get(uint32_t i) const
Get the i-th Ptr stored in this container.
virtual void SetEnergySource(Ptr< EnergySource > source)
Sets pointer to EnergySouce installed on node.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
bool DoRun(void)
Performs some tests involving state updates and the relative energy consumption.
DSSS PHY (Clause 15) and HR/DSSS PHY (Clause 18)
EnergySourceContainer Install(Ptr< Node > node) const
bool DoRun(void)
Performs some tests involving energy depletion.
Test case of energy depletion handling for BasicEnergySource and WifiRadioEnergyModel.
manage and create wifi channel objects for the yans model.
create MAC layers for a ns3::WifiNetDevice.
A WiFi radio energy model.
virtual void SetType(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue(), std::string n10="", const AttributeValue &v10=EmptyAttributeValue())
Instantiate subclasses of ns3::Object.
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:209
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:236
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:895
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:774
void Set(std::string name, const AttributeValue &v)
uint32_t GetN(void) const
Get the number of Ptr stored in this container.
tuple wifi
Definition: third.py:89
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void SetPropagationDelay(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
State
The state of the PHY layer.
Definition: wifi-phy.h:168
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Definition: double.h:41
Include Radiotap link layer information.
Definition: wifi-helper.h:117
bool DepletionTestCase(double simTimeS, double updateIntervalS)
void DepletionHandler(void)
Callback invoked when energy is drained from source.
double GetSwitchingCurrentA(void) const