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, enum WifiPhy::State 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 // wifiPhy.EnablePcap ("wifi-sleep", devices);
223 
224  Simulator::Stop (Seconds (duration + 1));
225 
226  Simulator::Run ();
228 
229  return 0;
230 }
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:45
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:132
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:719
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:41
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
void SetPcapDataLinkType(enum SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:566
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:742
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer::Iterator first, NodeContainer::Iterator last) const
Definition: wifi-helper.cc:748
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.
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
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:797
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:71
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:993
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:171
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