A Discrete-Event Network Simulator
API
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 // This script configures two nodes on an 802.11b physical layer, with
22 // 802.11b NICs in adhoc mode. One of the nodes generates on-off traffic
23 // destined to the other node.
24 //
25 // The purpose is to test the energy depletion on the nodes and the
26 // activation of the callback that puts a node in the sleep state when
27 // its energy is depleted. Furthermore, this script can be used to test
28 // the available policies for updating the transmit current based on
29 // the nominal tx power used to transmit each frame.
30 //
31 // There are a number of command-line options available to control
32 // the default behavior. The list of available command-line options
33 // can be listed with the following command:
34 // ./waf --run "wifi-sleep --help"
35 //
36 // Note that all ns-3 attributes (not just the ones exposed in the below
37 // script) can be changed at command line; see the documentation.
38 //
39 // This script can also be helpful to put the Wifi layer into verbose
40 // logging mode; this command will turn on all wifi logging:
41 //
42 // ./waf --run "wifi-sleep --verbose=1"
43 //
44 // When you are done, you will notice four trace files in your directory:
45 // two for the remaining energy on each node and two for the state transitions
46 // of each node.
47 
48 #include "ns3/command-line.h"
49 #include "ns3/config.h"
50 #include "ns3/string.h"
51 #include "ns3/log.h"
52 #include "ns3/yans-wifi-helper.h"
53 #include "ns3/mobility-helper.h"
54 #include "ns3/ipv4-address-helper.h"
55 #include "ns3/yans-wifi-channel.h"
56 #include "ns3/mobility-model.h"
57 #include "ns3/internet-stack-helper.h"
58 #include "ns3/on-off-helper.h"
59 #include "ns3/packet-sink-helper.h"
60 #include "ns3/basic-energy-source-helper.h"
61 #include "ns3/wifi-radio-energy-model-helper.h"
62 #include "ns3/wifi-utils.h"
63 #include "ns3/wifi-net-device.h"
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, WifiPhyState 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 int main (int argc, char *argv[])
92 {
93  std::string dataRate = "1Mbps";
94  uint32_t packetSize = 1000; // bytes
95  double duration = 10.0; // seconds
96  double initialEnergy = 7.5; // joule
97  double voltage = 3.0; // volts
98  double txPowerStart = 0.0; // dbm
99  double txPowerEnd = 15.0; // dbm
100  uint32_t nTxPowerLevels = 16;
101  uint32_t txPowerLevel = 0;
102  double idleCurrent = 0.273; // Ampere
103  double txCurrent = 0.380; // Ampere
104  bool verbose = false;
105 
106  CommandLine cmd (__FILE__);
107  cmd.AddValue ("dataRate", "Data rate", dataRate);
108  cmd.AddValue ("packetSize", "size of application packet sent", packetSize);
109  cmd.AddValue ("duration", "duration (seconds) of the experiment", duration);
110  cmd.AddValue ("initialEnergy", "Initial Energy (Joule) of each node", initialEnergy);
111  cmd.AddValue ("voltage", "Supply voltage (Joule)", voltage);
112  cmd.AddValue ("txPowerStart", "Minimum available transmission level (dbm)", txPowerStart);
113  cmd.AddValue ("txPowerEnd", "Maximum available transmission level (dbm)", txPowerEnd);
114  cmd.AddValue ("nTxPowerLevels", "Number of transmission power levels available between txPowerStart and txPowerEnd included", nTxPowerLevels);
115  cmd.AddValue ("txPowerLevel", "Transmission power level", txPowerLevel);
116  cmd.AddValue ("idleCurrent", "The radio Idle current in Ampere", idleCurrent);
117  cmd.AddValue ("txCurrent", "The radio Tx current in Ampere", txCurrent);
118  cmd.AddValue ("verbose", "turn on all WifiNetDevice log components", verbose);
119  cmd.Parse (argc, argv);
120 
121  NodeContainer c;
122  c.Create (2);
123 
124  // The below set of helpers will help us to put together the wifi NICs we want
126  if (verbose)
127  {
128  wifi.EnableLogComponents (); // Turn on all Wifi logging
129  }
130  wifi.SetStandard (WIFI_STANDARD_80211b);
131 
132  YansWifiPhyHelper wifiPhy;
133  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
135 
136  wifiPhy.Set ("TxPowerStart", DoubleValue (txPowerStart));
137  wifiPhy.Set ("TxPowerEnd", DoubleValue (txPowerEnd));
138  wifiPhy.Set ("TxPowerLevels", UintegerValue (nTxPowerLevels));
139 
141  wifiPhy.SetChannel (wifiChannel.Create ());
142 
143  // Add a mac and set the selected tx power level
144  WifiMacHelper wifiMac;
145  wifi.SetRemoteStationManager ("ns3::ArfWifiManager", "DefaultTxPowerLevel", UintegerValue (txPowerLevel));
146  // Set it to adhoc mode
147  wifiMac.SetType ("ns3::AdhocWifiMac");
148  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
149 
151  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
152  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
153  positionAlloc->Add (Vector (10.0, 0.0, 0.0));
154  mobility.SetPositionAllocator (positionAlloc);
155  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
156  mobility.Install (c);
157 
158  InternetStackHelper internet;
159  internet.Install (c);
160 
161  Ipv4AddressHelper ipv4;
162  NS_LOG_INFO ("Assign IP Addresses.");
163  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
165 
167 
168  std::string transportProto = std::string ("ns3::UdpSocketFactory");
169  OnOffHelper onOff (transportProto, InetSocketAddress (Ipv4Address ("10.1.1.2"), 9000));
170 
171  onOff.SetAttribute ("DataRate", DataRateValue (DataRate (dataRate)));
172  onOff.SetAttribute ("PacketSize", UintegerValue (packetSize));
173  onOff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0.001]"));
174 
175  apps = onOff.Install (c.Get (0));
176 
177  apps.Start (Seconds (0.01));
178  apps.Stop (Seconds (duration));
179 
180  // Create a packet sink to receive these packets
181  PacketSinkHelper sink (transportProto, InetSocketAddress (Ipv4Address::GetAny (), 9001));
182  apps = sink.Install (c.Get (1));
183  apps.Start (Seconds (0.01));
184  apps.Stop (Seconds (duration));
185 
186  // Energy sources
187  EnergySourceContainer eSources;
188  BasicEnergySourceHelper basicSourceHelper;
189  WifiRadioEnergyModelHelper radioEnergyHelper;
190 
191  basicSourceHelper.Set ("BasicEnergySourceInitialEnergyJ", DoubleValue (initialEnergy));
192  basicSourceHelper.Set ("BasicEnergySupplyVoltageV", DoubleValue (voltage));
193 
194  radioEnergyHelper.Set ("IdleCurrentA", DoubleValue (idleCurrent));
195  radioEnergyHelper.Set ("TxCurrentA", DoubleValue (txCurrent));
196 
197  // compute the efficiency of the power amplifier (eta) assuming that the provided value for tx current
198  // corresponds to the minimum tx power level
199  double eta = DbmToW (txPowerStart) / ((txCurrent - idleCurrent) * voltage);
200 
201  radioEnergyHelper.SetTxCurrentModel ("ns3::LinearWifiTxCurrentModel",
202  "Voltage", DoubleValue (voltage),
203  "IdleCurrent", DoubleValue (idleCurrent),
204  "Eta", DoubleValue (eta));
205 
206  // install an energy source on each node
207  for (NodeContainer::Iterator n = c.Begin (); n != c.End (); n++)
208  {
209  eSources.Add (basicSourceHelper.Install (*n));
210 
211  Ptr<WifiNetDevice> wnd;
212 
213  for (uint32_t i = 0; i < (*n)->GetNDevices (); ++i)
214  {
215  wnd = (*n)->GetDevice (i)->GetObject<WifiNetDevice> ();
216  // if it is a WifiNetDevice
217  if (wnd != 0)
218  {
219  // this device draws power from the last created energy source
220  radioEnergyHelper.Install (wnd, eSources.Get (eSources.GetN () - 1));
221  }
222  }
223  }
224 
225  // Tracing
226  eSources.Get (0)->TraceConnectWithoutContext ("RemainingEnergy", MakeCallback (&RemainingEnergyTrace<0>));
227  eSources.Get (1)->TraceConnectWithoutContext ("RemainingEnergy", MakeCallback (&RemainingEnergyTrace<1>));
228 
229  Config::Connect ("/NodeList/0/DeviceList/*/Phy/State/State", MakeCallback (&PhyStateTrace<0>));
230  Config::Connect ("/NodeList/1/DeviceList/*/Phy/State/State", MakeCallback (&PhyStateTrace<1>));
231 
232  Simulator::Stop (Seconds (duration + 1));
233 
234  Simulator::Run ();
236 
237  return 0;
238 }
double f(double x, void *params)
Definition: 80211b.c:70
holds a vector of ns3::Application pointers.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
Creates a BasicEnergySource object.
void Set(std::string name, const AttributeValue &v)
Parse command-line arguments.
Definition: command-line.h:229
Class for representing data rates.
Definition: data-rate.h:89
AttributeValue implementation for DataRate.
Definition: data-rate.h:298
DeviceEnergyModelContainer Install(Ptr< NetDevice > device, Ptr< EnergySource > source) const
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:41
Holds a vector of ns3::EnergySource pointers.
Ptr< EnergySource > Get(uint32_t i) const
Get the i-th Ptr<EnergySource> stored in this container.
void Add(EnergySourceContainer container)
uint32_t GetN(void) const
Get the number of Ptr<EnergySource> stored in this container.
EnergySourceContainer Install(Ptr< Node > node) const
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
static Ipv4Address GetAny(void)
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:43
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:180
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:136
static void Run(void)
Run the simulation.
Definition: simulator.cc:172
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
Hold variables of type string.
Definition: string.h:41
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:379
Hold an unsigned integer type.
Definition: uinteger.h:44
helps to create WifiNetDevice objects
Definition: wifi-helper.h:274
create MAC layers for a ns3::WifiNetDevice.
void SetType(std::string type, Args &&... args)
Hold together all Wifi-related objects.
void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:518
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:154
@ DLT_IEEE802_11_RADIO
Include Radiotap link layer information.
Definition: wifi-helper.h:126
Assign WifiRadioEnergyModel to wifi devices.
void Set(std::string name, const AttributeValue &v) override
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())
manage and create wifi channel objects for the YANS model.
Ptr< YansWifiChannel > Create(void) const
static YansWifiChannelHelper Default(void)
Create a channel helper in a default working state.
Make it easy to create and manage PHY objects for the YANS model.
void SetChannel(Ptr< YansWifiChannel > channel)
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:920
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
@ WIFI_STANDARD_80211b
devices
Definition: first.py:39
Every class exported by the ns3 library is enclosed in the ns3 namespace.
double DbmToW(double dBm)
Convert from dBm to Watts.
Definition: wifi-utils.cc:37
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
cmd
Definition: second.py:35
wifi
Definition: third.py:96
mobility
Definition: third.py:108
def start()
Definition: core.py:1853
bool verbose
WifiPhyState
The state of the PHY layer.
static const uint32_t packetSize
void RemainingEnergyTrace(double oldValue, double newValue)
Definition: wifi-sleep.cc:70
void PhyStateTrace(std::string context, Time start, Time duration, WifiPhyState state)
Definition: wifi-sleep.cc:81
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:56