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/core-module.h"
49 #include "ns3/mobility-module.h"
50 #include "ns3/wifi-module.h"
51 #include "ns3/internet-module.h"
52 #include "ns3/applications-module.h"
53 #include "ns3/energy-module.h"
54 
55 using namespace ns3;
56 
57 NS_LOG_COMPONENT_DEFINE ("WifiSleep");
58 
59 template <int node>
60 void RemainingEnergyTrace (double oldValue, double newValue)
61 {
62  std::stringstream ss;
63  ss << "energy_" << node << ".log";
64 
65  static std::fstream f (ss.str ().c_str (), std::ios::out);
66 
67  f << Simulator::Now ().GetSeconds () << " remaining energy=" << newValue << std::endl;
68 }
69 
70 template <int node>
71 void PhyStateTrace (std::string context, Time start, Time duration, WifiPhyState state)
72 {
73  std::stringstream ss;
74  ss << "state_" << node << ".log";
75 
76  static std::fstream f (ss.str ().c_str (), std::ios::out);
77 
78  f << Simulator::Now ().GetSeconds () << " state=" << state << " start=" << start << " duration=" << duration << std::endl;
79 }
80 
81 int main (int argc, char *argv[])
82 {
83  std::string dataRate = "1Mbps";
84  uint32_t packetSize = 1000; // bytes
85  double duration = 10.0; // seconds
86  double initialEnergy = 7.5; // joule
87  double voltage = 3.0; // volts
88  double txPowerStart = 0.0; // dbm
89  double txPowerEnd = 15.0; // dbm
90  uint32_t nTxPowerLevels = 16;
91  uint32_t txPowerLevel = 0;
92  double idleCurrent = 0.273; // Ampere
93  double txCurrent = 0.380; // Ampere
94  bool verbose = false;
95 
97  cmd.AddValue ("dataRate", "Data rate", dataRate);
98  cmd.AddValue ("packetSize", "size of application packet sent", packetSize);
99  cmd.AddValue ("duration", "duration (seconds) of the experiment", duration);
100  cmd.AddValue ("initialEnergy", "Initial Energy (Joule) of each node", initialEnergy);
101  cmd.AddValue ("voltage", "Supply voltage (Joule)", voltage);
102  cmd.AddValue ("txPowerStart", "Minimum available transmission level (dbm)", txPowerStart);
103  cmd.AddValue ("txPowerEnd", "Maximum available transmission level (dbm)", txPowerEnd);
104  cmd.AddValue ("nTxPowerLevels", "Number of transmission power levels available between txPowerStart and txPowerEnd included", nTxPowerLevels);
105  cmd.AddValue ("txPowerLevel", "Transmission power level", txPowerLevel);
106  cmd.AddValue ("idleCurrent", "The radio Idle current in Ampere", idleCurrent);
107  cmd.AddValue ("txCurrent", "The radio Tx current in Ampere", txCurrent);
108  cmd.AddValue ("verbose", "turn on all WifiNetDevice log components", verbose);
109  cmd.Parse (argc, argv);
110 
111  NodeContainer c;
112  c.Create (2);
113 
114  // The below set of helpers will help us to put together the wifi NICs we want
116  if (verbose)
117  {
118  wifi.EnableLogComponents (); // Turn on all Wifi logging
119  }
121 
123  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
125 
126  wifiPhy.Set ("TxPowerStart", DoubleValue (txPowerStart));
127  wifiPhy.Set ("TxPowerEnd", DoubleValue (txPowerEnd));
128  wifiPhy.Set ("TxPowerLevels", UintegerValue (nTxPowerLevels));
129 
131  wifiPhy.SetChannel (wifiChannel.Create ());
132 
133  // Add a mac and set the selected tx power level
134  WifiMacHelper wifiMac;
135  wifi.SetRemoteStationManager ("ns3::ArfWifiManager", "DefaultTxPowerLevel", UintegerValue (txPowerLevel));
136  // Set it to adhoc mode
137  wifiMac.SetType ("ns3::AdhocWifiMac");
138  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
139 
141  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
142  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
143  positionAlloc->Add (Vector (10.0, 0.0, 0.0));
144  mobility.SetPositionAllocator (positionAlloc);
145  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
146  mobility.Install (c);
147 
148  InternetStackHelper internet;
149  internet.Install (c);
150 
151  Ipv4AddressHelper ipv4;
152  NS_LOG_INFO ("Assign IP Addresses.");
153  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
154  Ipv4InterfaceContainer i = ipv4.Assign (devices);
155 
157 
158  std::string transportProto = std::string ("ns3::UdpSocketFactory");
159  OnOffHelper onOff (transportProto, InetSocketAddress (Ipv4Address ("10.1.1.2"), 9000));
160 
161  onOff.SetAttribute ("DataRate", DataRateValue (DataRate (dataRate)));
162  onOff.SetAttribute ("PacketSize", UintegerValue (packetSize));
163  onOff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0.001]"));
164 
165  apps = onOff.Install (c.Get (0));
166 
167  apps.Start (Seconds (0.01));
168  apps.Stop (Seconds (duration));
169 
170  // Create a packet sink to receive these packets
171  PacketSinkHelper sink (transportProto, InetSocketAddress (Ipv4Address::GetAny (), 9001));
172  apps = sink.Install (c.Get (1));
173  apps.Start (Seconds (0.01));
174  apps.Stop (Seconds (duration));
175 
176  // Energy sources
177  EnergySourceContainer eSources;
178  BasicEnergySourceHelper basicSourceHelper;
179  WifiRadioEnergyModelHelper radioEnergyHelper;
180 
181  basicSourceHelper.Set ("BasicEnergySourceInitialEnergyJ", DoubleValue (initialEnergy));
182  basicSourceHelper.Set ("BasicEnergySupplyVoltageV", DoubleValue (voltage));
183 
184  radioEnergyHelper.Set ("IdleCurrentA", DoubleValue (idleCurrent));
185  radioEnergyHelper.Set ("TxCurrentA", DoubleValue (txCurrent));
186 
187  // compute the efficiency of the power amplifier (eta) assuming that the provided value for tx current
188  // corresponds to the minimum tx power level
189  double eta = DbmToW (txPowerStart) / ((txCurrent - idleCurrent) * voltage);
190 
191  radioEnergyHelper.SetTxCurrentModel ("ns3::LinearWifiTxCurrentModel",
192  "Voltage", DoubleValue (voltage),
193  "IdleCurrent", DoubleValue (idleCurrent),
194  "Eta", DoubleValue (eta));
195 
196  // install an energy source on each node
197  for (NodeContainer::Iterator n = c.Begin (); n != c.End (); n++)
198  {
199  eSources.Add (basicSourceHelper.Install (*n));
200 
201  Ptr<WifiNetDevice> wnd;
202 
203  for (uint32_t i = 0; i < (*n)->GetNDevices (); ++i)
204  {
205  wnd = (*n)->GetDevice (i)->GetObject<WifiNetDevice> ();
206  // if it is a WifiNetDevice
207  if (wnd != 0)
208  {
209  // this device draws power from the last created energy source
210  radioEnergyHelper.Install (wnd, eSources.Get (eSources.GetN () - 1));
211  }
212  }
213  }
214 
215  // Tracing
216  eSources.Get (0)->TraceConnectWithoutContext ("RemainingEnergy", MakeCallback (&RemainingEnergyTrace<0>));
217  eSources.Get (1)->TraceConnectWithoutContext ("RemainingEnergy", MakeCallback (&RemainingEnergyTrace<1>));
218 
219  Config::Connect ("/NodeList/0/DeviceList/*/Phy/State/State", MakeCallback (&PhyStateTrace<0>));
220  Config::Connect ("/NodeList/1/DeviceList/*/Phy/State/State", MakeCallback (&PhyStateTrace<1>));
221 
222  Simulator::Stop (Seconds (duration + 1));
223 
224  Simulator::Run ();
226 
227  return 0;
228 }
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:45
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:133
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:700
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:459
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.
double DbmToW(double dBm)
Convert from dBm to Watts.
Definition: wifi-utils.cc:42
def start()
Definition: core.py:1790
static void Run(void)
Run the simulation.
Definition: simulator.cc:226
#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:277
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:213
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
Class for representing data rates.
Definition: data-rate.h:88
virtual void SetStandard(WifiPhyStandard standard)
Definition: wifi-helper.cc:723
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:355
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 NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer::Iterator first, NodeContainer::Iterator last) const
Definition: wifi-helper.cc:729
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:843
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:190
double f(double x, void *params)
Definition: 80211b.c:72
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.
WifiPhyState
The state of the PHY layer.
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:249
void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:553
void PhyStateTrace(std::string context, Time start, Time duration, WifiPhyState state)
Definition: wifi-sleep.cc:71
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:60
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:778
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
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:498
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:234
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:1007
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())
Include Radiotap link layer information.
Definition: wifi-helper.h:111
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
bool verbose