A Discrete-Event Network Simulator
API
lr-wpan-data.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011 The Boeing Company
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Tom Henderson <thomas.r.henderson@boeing.com>
19  */
20 
21 /*
22  * Try to send data end-to-end through a LrWpanMac <-> LrWpanPhy <->
23  * SpectrumChannel <-> LrWpanPhy <-> LrWpanMac chain
24  *
25  * Trace Phy state changes, and Mac DataIndication and DataConfirm events
26  * to stdout
27  */
28 #include <ns3/log.h>
29 #include <ns3/core-module.h>
30 #include <ns3/lr-wpan-module.h>
31 #include <ns3/propagation-loss-model.h>
32 #include <ns3/propagation-delay-model.h>
33 #include <ns3/simulator.h>
34 #include <ns3/single-model-spectrum-channel.h>
35 #include <ns3/constant-position-mobility-model.h>
36 #include <ns3/packet.h>
37 
38 #include <iostream>
39 
40 using namespace ns3;
41 
48 {
49  NS_LOG_UNCOND ("Received packet of size " << p->GetSize ());
50 }
51 
56 static void DataConfirm (McpsDataConfirmParams params)
57 {
58  NS_LOG_UNCOND ("LrWpanMcpsDataConfirmStatus = " << params.m_status);
59 }
60 
68 static void StateChangeNotification (std::string context, Time now, LrWpanPhyEnumeration oldState, LrWpanPhyEnumeration newState)
69 {
70  NS_LOG_UNCOND (context << " state change at " << now.As (Time::S)
71  << " from " << LrWpanHelper::LrWpanPhyEnumerationPrinter (oldState)
72  << " to " << LrWpanHelper::LrWpanPhyEnumerationPrinter (newState));
73 }
74 
75 int main (int argc, char *argv[])
76 {
77  bool verbose = false;
78  bool extended = false;
79 
80  CommandLine cmd (__FILE__);
81 
82  cmd.AddValue ("verbose", "turn on all log components", verbose);
83  cmd.AddValue ("extended", "use extended addressing", extended);
84 
85  cmd.Parse (argc, argv);
86 
87  LrWpanHelper lrWpanHelper;
88  if (verbose)
89  {
90  lrWpanHelper.EnableLogComponents ();
91  }
92 
93  // Enable calculation of FCS in the trailers. Only necessary when interacting with real devices or wireshark.
94  // GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
95 
96  // Create 2 nodes, and a NetDevice for each one
97  Ptr<Node> n0 = CreateObject <Node> ();
98  Ptr<Node> n1 = CreateObject <Node> ();
99 
100  Ptr<LrWpanNetDevice> dev0 = CreateObject<LrWpanNetDevice> ();
101  Ptr<LrWpanNetDevice> dev1 = CreateObject<LrWpanNetDevice> ();
102 
103  if (!extended)
104  {
105  dev0->SetAddress (Mac16Address ("00:01"));
106  dev1->SetAddress (Mac16Address ("00:02"));
107  }
108  else
109  {
110  Ptr<LrWpanMac> mac0 = dev0->GetMac ();
111  Ptr<LrWpanMac> mac1 = dev1->GetMac ();
112  mac0->SetExtendedAddress (Mac64Address ("00:00:00:00:00:00:00:01"));
113  mac1->SetExtendedAddress (Mac64Address ("00:00:00:00:00:00:00:02"));
114  }
115 
116  // Each device must be attached to the same channel
117  Ptr<SingleModelSpectrumChannel> channel = CreateObject<SingleModelSpectrumChannel> ();
118  Ptr<LogDistancePropagationLossModel> propModel = CreateObject<LogDistancePropagationLossModel> ();
119  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
120  channel->AddPropagationLossModel (propModel);
121  channel->SetPropagationDelayModel (delayModel);
122 
123  dev0->SetChannel (channel);
124  dev1->SetChannel (channel);
125 
126  // To complete configuration, a LrWpanNetDevice must be added to a node
127  n0->AddDevice (dev0);
128  n1->AddDevice (dev1);
129 
130  // Trace state changes in the phy
131  dev0->GetPhy ()->TraceConnect ("TrxState", std::string ("phy0"), MakeCallback (&StateChangeNotification));
132  dev1->GetPhy ()->TraceConnect ("TrxState", std::string ("phy1"), MakeCallback (&StateChangeNotification));
133 
134  Ptr<ConstantPositionMobilityModel> sender0Mobility = CreateObject<ConstantPositionMobilityModel> ();
135  sender0Mobility->SetPosition (Vector (0,0,0));
136  dev0->GetPhy ()->SetMobility (sender0Mobility);
137  Ptr<ConstantPositionMobilityModel> sender1Mobility = CreateObject<ConstantPositionMobilityModel> ();
138  // Configure position 10 m distance
139  sender1Mobility->SetPosition (Vector (0,10,0));
140  dev1->GetPhy ()->SetMobility (sender1Mobility);
141 
143  cb0 = MakeCallback (&DataConfirm);
144  dev0->GetMac ()->SetMcpsDataConfirmCallback (cb0);
145 
147  cb1 = MakeCallback (&DataIndication);
148  dev0->GetMac ()->SetMcpsDataIndicationCallback (cb1);
149 
151  cb2 = MakeCallback (&DataConfirm);
152  dev1->GetMac ()->SetMcpsDataConfirmCallback (cb2);
153 
155  cb3 = MakeCallback (&DataIndication);
156  dev1->GetMac ()->SetMcpsDataIndicationCallback (cb3);
157 
158  // Tracing
159  lrWpanHelper.EnablePcapAll (std::string ("lr-wpan-data"), true);
160  AsciiTraceHelper ascii;
161  Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream ("lr-wpan-data.tr");
162  lrWpanHelper.EnableAsciiAll (stream);
163 
164  // The below should trigger two callbacks when end-to-end data is working
165  // 1) DataConfirm callback is called
166  // 2) DataIndication callback is called with value of 50
167  Ptr<Packet> p0 = Create<Packet> (50); // 50 bytes of dummy data
168  McpsDataRequestParams params;
169  params.m_dstPanId = 0;
170  if (!extended)
171  {
172  params.m_srcAddrMode = SHORT_ADDR;
173  params.m_dstAddrMode = SHORT_ADDR;
174  params.m_dstAddr = Mac16Address ("00:02");
175  }
176  else
177  {
178  params.m_srcAddrMode = EXT_ADDR;
179  params.m_dstAddrMode = EXT_ADDR;
180  params.m_dstExtAddr = Mac64Address ("00:00:00:00:00:00:00:02");
181  }
182  params.m_msduHandle = 0;
183  params.m_txOptions = TX_OPTION_ACK;
184 // dev0->GetMac ()->McpsDataRequest (params, p0);
187  dev0->GetMac (), params, p0);
188 
189  // Send a packet back at time 2 seconds
190  Ptr<Packet> p2 = Create<Packet> (60); // 60 bytes of dummy data
191  if (!extended)
192  {
193  params.m_dstAddr = Mac16Address ("00:01");
194  }
195  else
196  {
197  params.m_dstExtAddr = Mac64Address ("00:00:00:00:00:00:00:01");
198  }
201  dev1->GetMac (), params, p2);
202 
203  Simulator::Run ();
204 
206  return 0;
207 }
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
Definition: time.cc:429
uint16_t m_dstPanId
Destination PAN identifier.
Definition: lr-wpan-mac.h:248
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
Manage ASCII trace files for device models.
Definition: trace-helper.h:162
static std::string LrWpanPhyEnumerationPrinter(LrWpanPhyEnumeration e)
Transform the LrWpanPhyEnumeration enumeration into a printable string.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:852
static void Run(void)
Run the simulation.
Definition: simulator.cc:172
static void StateChangeNotification(std::string context, Time now, LrWpanPhyEnumeration oldState, LrWpanPhyEnumeration newState)
Function called when a the PHY state changes.
Definition: lr-wpan-data.cc:68
cmd
Definition: second.py:35
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we&#39;ll use to write the traced bits. ...
void McpsDataRequest(McpsDataRequestParams params, Ptr< Packet > p)
IEEE 802.15.4-2006, section 7.1.1.1 MCPS-DATA.request Request to transfer a MSDU. ...
Definition: lr-wpan-mac.cc:293
channel
Definition: third.py:92
virtual void SetAddress(Address address)
This method indirects to LrWpanMac::SetShortAddress ()
an EUI-64 address
Definition: mac64-address.h:43
static void DataIndication(McpsDataIndicationParams params, Ptr< Packet > p)
Function called when a Data indication is invoked.
Definition: lr-wpan-data.cc:47
TX_OPTION_ACK.
Definition: lr-wpan-mac.h:59
void EnablePcapAll(std::string prefix, bool promiscuous=false)
Enable pcap output on each device (which is of the appropriate type) in the set of all nodes created ...
MCPS-DATA.confirm params.
Definition: lr-wpan-mac.h:260
Parse command-line arguments.
Definition: command-line.h:227
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:136
static void ScheduleWithContext(uint32_t context, Time const &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Definition: simulator.h:572
LrWpanMcpsDataConfirmStatus m_status
The status of the last MSDU transmission.
Definition: lr-wpan-mac.h:263
Every class exported by the ns3 library is enclosed in the ns3 namespace.
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionally.
This class can contain 16 bit addresses.
Definition: mac16-address.h:41
void SetPosition(const Vector &position)
void SetExtendedAddress(Mac64Address address)
Set the extended address of this MAC.
Definition: lr-wpan-mac.cc:272
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:130
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
void EnableAsciiAll(std::string prefix)
Enable ascii trace output on each device (which is of the appropriate type) in the set of all nodes c...
LrWpanPhyEnumeration
IEEE802.15.4-2006 PHY Emumerations Table 18 in section 6.2.3.
Definition: lr-wpan-phy.h:105
second
Definition: nstime.h:115
MCPS-DATA.request params.
Definition: lr-wpan-mac.h:236
helps to manage and create IEEE 802.15.4 NetDevice objects
void EnableLogComponents(void)
Helper to enable all LrWpan log components with one statement.
static void DataConfirm(McpsDataConfirmParams params)
Function called when a Data confirm is invoked.
Definition: lr-wpan-data.cc:56
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:1642
bool verbose
MCPS-DATA.indication params.
Definition: lr-wpan-mac.h:270