A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
63  CommandLine cmd;
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);
148  Simulator::ScheduleWithContext (1, Seconds (0.0),
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");
155  Simulator::ScheduleWithContext (2, Seconds (2.0),
157  dev1->GetMac (), params, p2);
158 
159  Simulator::Run ();
160 
162  return 0;
163 }
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:79
Manage ASCII trace files for device models.
Definition: trace-helper.h:141
static void Run(void)
Run the simulation until one of:
Definition: simulator.cc:157
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:744
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
int main(int argc, char *argv[])
Definition: lr-wpan-data.cc:59
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:220
a 3d vector
Definition: vector.h:31
double GetSeconds(void) const
Definition: nstime.h:272
static void DataIndication(McpsDataIndicationParams params, Ptr< Packet > p)
Definition: lr-wpan-data.cc:42
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:1242
static void ScheduleWithContext(uint32_t context, Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event with the given context.
Definition: simulator.h:905
Parse command-line arguments.
Definition: command-line.h:177
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
Definition: simulator.cc:121
LrWpanMcpsDataConfirmStatus m_status
Definition: lr-wpan-mac.h:130
LrWpanAddressMode m_srcAddrMode
Definition: lr-wpan-mac.h:119
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionaly.
This class can contain 16 bit addresses.
Definition: mac16-address.h:39
void SetPosition(const Vector &position)
uint32_t AddDevice(Ptr< NetDevice > device)
Definition: node.cc:120
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
Definition: command-line.h:435
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...
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
static std::string LrWpanPhyEnumerationPrinter(LrWpanPhyEnumeration)
LrWpanPhyEnumeration
IEEE802.15.4-2006 PHY Emumerations Table 18 in section 6.2.3.
Definition: lr-wpan-phy.h:93
bool verbose