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 //
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
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:112
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 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:683
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:462
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 stored in this container.
def start()
Definition: core.py:1482
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
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...
static YansWifiPhyHelper Default(void)
Create a phy helper in a default working state.
helps to create WifiNetDevice objects
Definition: wifi-helper.h:231
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:42
tuple cmd
Definition: second.py:35
void SetPcapDataLinkType(enum SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:530
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wifi-helper.cc:712
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:706
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:205
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:165
double f(double x, void *params)
Definition: 80211b.c:60
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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:224
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 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:752
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.
Definition: data-rate.h:242
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
Definition: command-line.h:495
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:209
Ptr< Node > Get(uint32_t i) const
Get the Ptr 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...
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
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())
Include Radiotap link layer information.
Definition: wifi-helper.h:117
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