A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
wifi-sleep.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 The Boeing Company
4  * 2014 Universita' degli Studi di Napoli "Federico II"
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  */
20 
21 //
22 // This script configures two nodes on an 802.11b physical layer, with
23 // 802.11b NICs in adhoc mode. One of the nodes generates on-off traffic
24 // destined to the other node.
25 //
26 // The purpose is to test the energy depletion on the nodes and the
27 // activation of the callback that puts a node in the sleep state when
28 // its energy is depleted. Furthermore, this script can be used to test
29 // the available policies for updating the transmit current based on
30 // the nominal tx power used to transmit each frame.
31 //
32 // There are a number of command-line options available to control
33 // the default behavior. The list of available command-line options
34 // can be listed with the following command:
35 // ./waf --run "wifi-sleep --help"
36 //
37 // Note that all ns-3 attributes (not just the ones exposed in the below
38 // script) can be changed at command line; see the documentation.
39 //
40 // This script can also be helpful to put the Wifi layer into verbose
41 // logging mode; this command will turn on all wifi logging:
42 //
43 // ./waf --run "wifi-sleep --verbose=1"
44 //
45 // When you are done, you will notice four trace files in your directory:
46 // two for the remaining energy on each node and two for the state transitions
47 // of each node.
48 //
49 
50 #include "ns3/core-module.h"
51 #include "ns3/network-module.h"
52 #include "ns3/mobility-module.h"
53 #include "ns3/config-store-module.h"
54 #include "ns3/wifi-module.h"
55 #include "ns3/internet-module.h"
56 #include "ns3/applications-module.h"
57 #include "ns3/energy-module.h"
58 
59 #include <iostream>
60 #include <fstream>
61 #include <vector>
62 #include <string>
63 #include <sstream>
64 
65 using namespace ns3;
66 
67 NS_LOG_COMPONENT_DEFINE ("WifiSleep");
68 
69 template <int node>
70 void RemainingEnergyTrace (double oldValue, double newValue)
71 {
72  std::stringstream ss;
73  ss << "energy_" << node << ".log";
74 
75  static std::fstream f (ss.str().c_str(), std::ios::out);
76 
77  f << Simulator::Now().GetSeconds() << " remaining energy=" << newValue << std::endl;
78 }
79 
80 template <int node>
81 void PhyStateTrace (std::string context, Time start, Time duration, enum WifiPhy::State state)
82 {
83  std::stringstream ss;
84  ss << "state_" << node << ".log";
85 
86  static std::fstream f (ss.str().c_str(), std::ios::out);
87 
88  f << Simulator::Now().GetSeconds() << " state=" << state << " start=" << start << " duration=" << duration << std::endl;
89 }
90 
91 
92 
93 int main (int argc, char *argv[])
94 {
95  std::string dataRate = "1Mbps";
96  uint32_t packetSize = 1000; // bytes
97  double duration = 10.0; // seconds
98  double initialEnergy = 7.5; // joule
99  double voltage = 3.0; // volts
100  double txPowerStart = 0.0; // dbm
101  double txPowerEnd = 15.0; // dbm
102  uint32_t nTxPowerLevels = 16;
103  uint32_t txPowerLevel = 0;
104  double idleCurrent = 0.273; // Ampere
105  double txCurrent = 0.380; // Ampere
106  bool verbose = false;
107 
108 
110 
111  cmd.AddValue ("dataRate", "Data rate", dataRate);
112  cmd.AddValue ("packetSize", "size of application packet sent", packetSize);
113  cmd.AddValue ("duration", "duration (seconds) of the experiment", duration);
114  cmd.AddValue ("initialEnergy", "Initial Energy (Joule) of each node", initialEnergy);
115  cmd.AddValue ("voltage", "Supply voltage (Joule)", voltage);
116  cmd.AddValue ("txPowerStart", "Minimum available transmission level (dbm)", txPowerStart);
117  cmd.AddValue ("txPowerEnd", "Maximum available transmission level (dbm)", txPowerEnd);
118  cmd.AddValue ("nTxPowerLevels", "Number of transmission power levels available between txPowerStart and txPowerEnd included", nTxPowerLevels);
119  cmd.AddValue ("txPowerLevel", "Transmission power level", txPowerLevel);
120  cmd.AddValue ("idleCurrent", "The radio Idle current in Ampere", idleCurrent);
121  cmd.AddValue ("txCurrent", "The radio Tx current in Ampere", txCurrent);
122  cmd.AddValue ("verbose", "turn on all WifiNetDevice log components", verbose);
123 
124  cmd.Parse (argc, argv);
125 
126 
127  NodeContainer c;
128  c.Create (2);
129 
130  // The below set of helpers will help us to put together the wifi NICs we want
132  if (verbose)
133  {
134  wifi.EnableLogComponents (); // Turn on all Wifi logging
135  }
137 
139  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
141 
142  wifiPhy.Set ("TxPowerStart", DoubleValue (txPowerStart));
143  wifiPhy.Set ("TxPowerEnd", DoubleValue (txPowerEnd));
144  wifiPhy.Set ("TxPowerLevels", UintegerValue (nTxPowerLevels));
145 
147  wifiPhy.SetChannel (wifiChannel.Create ());
148 
149  // Add a mac and set the selected tx power level
150  WifiMacHelper wifiMac;
151  wifi.SetRemoteStationManager ("ns3::ArfWifiManager", "DefaultTxPowerLevel", UintegerValue (txPowerLevel));
152  // Set it to adhoc mode
153  wifiMac.SetType ("ns3::AdhocWifiMac");
154  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
155 
157  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
158  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
159  positionAlloc->Add (Vector (10.0, 0.0, 0.0));
160  mobility.SetPositionAllocator (positionAlloc);
161  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
162  mobility.Install (c);
163 
164  InternetStackHelper internet;
165  internet.Install (c);
166 
167  Ipv4AddressHelper ipv4;
168  NS_LOG_INFO ("Assign IP Addresses.");
169  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
170  Ipv4InterfaceContainer i = ipv4.Assign (devices);
171 
173 
174  std::string transportProto = std::string("ns3::UdpSocketFactory");
175  OnOffHelper onOff(transportProto, InetSocketAddress (Ipv4Address ("10.1.1.2"), 9000));
176 
177  onOff.SetAttribute ("DataRate", DataRateValue (DataRate (dataRate)));
178  onOff.SetAttribute ("PacketSize", UintegerValue (packetSize));
179  onOff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0.001]"));
180 
181  apps = onOff.Install (c.Get (0));
182 
183  apps.Start (Seconds (0.01));
184  apps.Stop (Seconds (duration));
185 
186  // Create a packet sink to receive these packets
187  PacketSinkHelper sink (transportProto, InetSocketAddress (Ipv4Address::GetAny (), 9001));
188  apps = sink.Install (c.Get (1));
189  apps.Start (Seconds (0.01));
190  apps.Stop (Seconds (duration));
191 
192  // Energy sources
193  EnergySourceContainer eSources;
194  BasicEnergySourceHelper basicSourceHelper;
195  WifiRadioEnergyModelHelper radioEnergyHelper;
196 
197  basicSourceHelper.Set ("BasicEnergySourceInitialEnergyJ", DoubleValue (initialEnergy));
198  basicSourceHelper.Set ("BasicEnergySupplyVoltageV", DoubleValue (voltage));
199 
200  radioEnergyHelper.Set ("IdleCurrentA", DoubleValue (idleCurrent));
201  radioEnergyHelper.Set ("TxCurrentA", DoubleValue (txCurrent));
202 
203  // compute the efficiency of the power amplifier (eta) assuming that the provided value for tx current
204  // corresponds to the minimum tx power level
205  double eta = WifiTxCurrentModel::DbmToW (txPowerStart) / ((txCurrent - idleCurrent) * voltage);
206 
207  radioEnergyHelper.SetTxCurrentModel ("ns3::LinearWifiTxCurrentModel",
208  "Voltage", DoubleValue (voltage),
209  "IdleCurrent", DoubleValue (idleCurrent),
210  "Eta", DoubleValue (eta));
211 
212  // install an energy source on each node
213  for (NodeContainer::Iterator n = c.Begin(); n != c.End(); n++)
214  {
215  eSources.Add (basicSourceHelper.Install (*n));
216 
217  Ptr<WifiNetDevice> wnd;
218 
219  for (uint32_t i = 0; i < (*n)->GetNDevices (); ++i)
220  {
221  wnd = (*n)->GetDevice (i)->GetObject<WifiNetDevice> ();
222  // if it is a WifiNetDevice
223  if (wnd != 0)
224  {
225  // this device draws power from the last created energy source
226  radioEnergyHelper.Install (wnd, eSources.Get (eSources.GetN()-1));
227  }
228  }
229  }
230 
231  // Tracing
232  eSources.Get (0)->TraceConnectWithoutContext ("RemainingEnergy", MakeCallback(&RemainingEnergyTrace<0>));
233  eSources.Get (1)->TraceConnectWithoutContext ("RemainingEnergy", MakeCallback(&RemainingEnergyTrace<1>));
234 
235  Config::Connect ("/NodeList/0/DeviceList/*/Phy/State/State", MakeCallback (&PhyStateTrace<0>));
236  Config::Connect ("/NodeList/1/DeviceList/*/Phy/State/State", MakeCallback (&PhyStateTrace<1>));
237 
238 // wifiPhy.EnablePcap ("wifi-sleep", devices);
239 
240  Simulator::Stop (Seconds(duration+1));
241 
242  Simulator::Run ();
244 
245  return 0;
246 }
247 
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:47
DeviceEnergyModelContainer Install(Ptr< NetDevice > device, Ptr< EnergySource > source) const
holds a vector of ns3::Application pointers.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
Assign WifiRadioEnergyModel to wifi devices.
an Inet address class
static Ipv4Address GetAny(void)
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
Holds a vector of ns3::EnergySource pointers.
void Add(EnergySourceContainer container)
tuple devices
Definition: first.py:32
holds a vector of std::pair of Ptr<Ipv4> and interface index.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
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:71
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:455
Hold variables of type string.
Definition: string.h:41
Make it easy to create and manage PHY objects for the yans model.
static YansWifiChannelHelper Default(void)
Create a channel helper in a default working state.
uint32_t GetN(void) const
Get the number of Ptr<EnergySource> stored in this container.
State
The state of the PHY layer.
Definition: wifi-phy.h:157
static void Run(void)
Run the simulation.
Definition: simulator.cc:200
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
void SetPcapDataLinkType(enum SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
aggregate IP/TCP/UDP functionality to existing Nodes.
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:244
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
void Set(std::string name, const AttributeValue &v)
static YansWifiPhyHelper Default(void)
Create a phy helper in a default working state.
helps to create WifiNetDevice objects
Definition: wifi-helper.h:76
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:42
Include Radiotap link layer information.
tuple cmd
Definition: second.py:35
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wifi-helper.cc:100
Class for representing data rates.
Definition: data-rate.h:88
void SetChannel(Ptr< YansWifiChannel > channel)
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:341
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
tuple mobility
Definition: third.py:101
Hold an unsigned integer type.
Definition: uinteger.h:44
Creates a BasicEnergySource object.
holds a vector of ns3::NetDevice pointers
virtual void SetStandard(enum WifiPhyStandard standard)
Definition: wifi-helper.cc:94
Hold together all Wifi-related objects.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1489
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
Parse command-line arguments.
Definition: command-line.h:201
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:835
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:164
double f(double x, void *params)
Definition: 80211b.c:60
keep track of a set of node pointers.
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
DSSS PHY (Clause 15) and HR/DSSS PHY (Clause 18)
void Set(std::string name, const AttributeValue &v)
EnergySourceContainer Install(Ptr< Node > node) const
void SetMobilityModel(std::string type, 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())
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
manage and create wifi channel objects for the yans model.
create MAC layers for a ns3::WifiNetDevice.
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:223
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())
Ptr< EnergySource > Get(uint32_t i) const
Get the i-th Ptr<EnergySource> stored in this container.
void RemainingEnergyTrace(double oldValue, double newValue)
Definition: wifi-sleep.cc:70
Helper class used to assign positions and mobility models to nodes.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
static void EnableLogComponents(void)
Helper to enable all WifiNetDevice log components with one statement.
Definition: wifi-helper.cc:140
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
void PhyStateTrace(std::string context, Time start, Time duration, enum WifiPhy::State state)
Definition: wifi-sleep.cc:81
AttributeValue implementation for DataRate.
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
Definition: command-line.h:491
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:208
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:895
void Set(std::string name, const AttributeValue &v)
void Add(Vector v)
Add a position to the list of positions.
void Parse(int argc, char *argv[])
Parse the program arguments.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
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.
static const uint32_t packetSize
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Definition: double.h:41
void SetTxCurrentModel(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())
static double DbmToW(double dbm)
Convert from dBm to Watts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
bool verbose