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 
43 {
44  NS_LOG_UNCOND ("Received packet of size " << p->GetSize ());
45 }
46 
47 static void DataConfirm (McpsDataConfirmParams params)
48 {
49  NS_LOG_UNCOND ("LrWpanMcpsDataConfirmStatus = " << params.m_status);
50 }
51 
52 static void StateChangeNotification (std::string context, Time now, LrWpanPhyEnumeration oldState, LrWpanPhyEnumeration newState)
53 {
54  NS_LOG_UNCOND (context << " state change at " << now.GetSeconds ()
55  << " from " << LrWpanHelper::LrWpanPhyEnumerationPrinter (oldState)
56  << " to " << LrWpanHelper::LrWpanPhyEnumerationPrinter (newState));
57 }
58 
59 int main (int argc, char *argv[])
60 {
61  bool verbose = false;
62 
64 
65  cmd.AddValue ("verbose", "turn on all log components", verbose);
66 
67  cmd.Parse (argc, argv);
68 
69  LrWpanHelper lrWpanHelper;
70  if (verbose)
71  {
72  lrWpanHelper.EnableLogComponents ();
73  }
74 
75  // Enable calculation of FCS in the trailers. Only necessary when interacting with real devices or wireshark.
76  // GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
77 
78  // Create 2 nodes, and a NetDevice for each one
79  Ptr<Node> n0 = CreateObject <Node> ();
80  Ptr<Node> n1 = CreateObject <Node> ();
81 
82  Ptr<LrWpanNetDevice> dev0 = CreateObject<LrWpanNetDevice> ();
83  Ptr<LrWpanNetDevice> dev1 = CreateObject<LrWpanNetDevice> ();
84 
85  dev0->SetAddress (Mac16Address ("00:01"));
86  dev1->SetAddress (Mac16Address ("00:02"));
87 
88  // Each device must be attached to the same channel
89  Ptr<SingleModelSpectrumChannel> channel = CreateObject<SingleModelSpectrumChannel> ();
90  Ptr<LogDistancePropagationLossModel> propModel = CreateObject<LogDistancePropagationLossModel> ();
91  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
92  channel->AddPropagationLossModel (propModel);
93  channel->SetPropagationDelayModel (delayModel);
94 
95  dev0->SetChannel (channel);
96  dev1->SetChannel (channel);
97 
98  // To complete configuration, a LrWpanNetDevice must be added to a node
99  n0->AddDevice (dev0);
100  n1->AddDevice (dev1);
101 
102  // Trace state changes in the phy
103  dev0->GetPhy ()->TraceConnect ("TrxState", std::string ("phy0"), MakeCallback (&StateChangeNotification));
104  dev1->GetPhy ()->TraceConnect ("TrxState", std::string ("phy1"), MakeCallback (&StateChangeNotification));
105 
106  Ptr<ConstantPositionMobilityModel> sender0Mobility = CreateObject<ConstantPositionMobilityModel> ();
107  sender0Mobility->SetPosition (Vector (0,0,0));
108  dev0->GetPhy ()->SetMobility (sender0Mobility);
109  Ptr<ConstantPositionMobilityModel> sender1Mobility = CreateObject<ConstantPositionMobilityModel> ();
110  // Configure position 10 m distance
111  sender1Mobility->SetPosition (Vector (0,10,0));
112  dev1->GetPhy ()->SetMobility (sender1Mobility);
113 
115  cb0 = MakeCallback (&DataConfirm);
116  dev0->GetMac ()->SetMcpsDataConfirmCallback (cb0);
117 
119  cb1 = MakeCallback (&DataIndication);
120  dev0->GetMac ()->SetMcpsDataIndicationCallback (cb1);
121 
123  cb2 = MakeCallback (&DataConfirm);
124  dev1->GetMac ()->SetMcpsDataConfirmCallback (cb2);
125 
127  cb3 = MakeCallback (&DataIndication);
128  dev1->GetMac ()->SetMcpsDataIndicationCallback (cb3);
129 
130  // Tracing
131  lrWpanHelper.EnablePcapAll (std::string ("lr-wpan-data"), true);
132  AsciiTraceHelper ascii;
133  Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream ("lr-wpan-data.tr");
134  lrWpanHelper.EnableAsciiAll (stream);
135 
136  // The below should trigger two callbacks when end-to-end data is working
137  // 1) DataConfirm callback is called
138  // 2) DataIndication callback is called with value of 50
139  Ptr<Packet> p0 = Create<Packet> (50); // 50 bytes of dummy data
140  McpsDataRequestParams params;
141  params.m_srcAddrMode = SHORT_ADDR;
142  params.m_dstAddrMode = SHORT_ADDR;
143  params.m_dstPanId = 0;
144  params.m_dstAddr = Mac16Address ("00:02");
145  params.m_msduHandle = 0;
146  params.m_txOptions = TX_OPTION_ACK;
147 // dev0->GetMac ()->McpsDataRequest (params, p0);
150  dev0->GetMac (), params, p0);
151 
152  // Send a packet back at time 2 seconds
153  Ptr<Packet> p2 = Create<Packet> (60); // 60 bytes of dummy data
154  params.m_dstAddr = Mac16Address ("00:01");
157  dev1->GetMac (), params, p2);
158 
159  Simulator::Run ();
160 
162  return 0;
163 }
tuple channel
Definition: third.py:85
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
Manage ASCII trace files for device models.
Definition: trace-helper.h:161
static std::string LrWpanPhyEnumerationPrinter(LrWpanPhyEnumeration e)
Transform the LrWpanPhyEnumeration enumeration into a printable string.
static void Run(void)
Run the simulation.
Definition: simulator.cc:201
static void StateChangeNotification(std::string context, Time now, LrWpanPhyEnumeration oldState, LrWpanPhyEnumeration newState)
Definition: lr-wpan-data.cc:52
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:792
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we'll use to write the traced bits. ...
virtual void AddPropagationLossModel(Ptr< PropagationLossModel > loss)
Set the single-frequency propagation loss model to be used.
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:250
tuple cmd
Definition: second.py:35
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:341
static void DataIndication(McpsDataIndicationParams params, Ptr< Packet > p)
Definition: lr-wpan-data.cc:42
TX_OPTION_ACK.
Definition: lr-wpan-mac.h:57
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 ...
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1489
MCPS-DATA.confirm params.
Definition: lr-wpan-mac.h:170
Parse command-line arguments.
Definition: command-line.h:205
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:165
LrWpanMcpsDataConfirmStatus m_status
The status of the last MSDU transmission.
Definition: lr-wpan-mac.h:173
LrWpanAddressMode m_srcAddrMode
Source address mode.
Definition: lr-wpan-mac.h:157
Every class exported by the ns3 library is enclosed in the ns3 namespace.
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionaly.
This class can contain 16 bit addresses.
Definition: mac16-address.h:41
void SetPosition(const Vector &position)
static void ScheduleWithContext(uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event with the given context.
Definition: simulator.h:1319
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:128
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
Definition: command-line.h:495
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:895
virtual void SetPropagationDelayModel(Ptr< PropagationDelayModel > delay)
Set the propagation delay model to be used.
void Parse(int argc, char *argv[])
Parse the program arguments.
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
MCPS-DATA.request params.
Definition: lr-wpan-mac.h:146
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)
Definition: lr-wpan-data.cc:47
bool verbose
MCPS-DATA.indication params.
Definition: lr-wpan-mac.h:181