A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
simple-network-example.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017 University of Padova
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Author: Davide Magrin <magrinda@dei.unipd.it>
18 */
19
20/*
21 * This script simulates a simple network in which one end device sends one
22 * packet to the gateway.
23 */
24
25#include "ns3/command-line.h"
26#include "ns3/constant-position-mobility-model.h"
27#include "ns3/end-device-lora-phy.h"
28#include "ns3/end-device-lorawan-mac.h"
29#include "ns3/gateway-lora-phy.h"
30#include "ns3/gateway-lorawan-mac.h"
31#include "ns3/log.h"
32#include "ns3/lora-helper.h"
33#include "ns3/mobility-helper.h"
34#include "ns3/node-container.h"
35#include "ns3/one-shot-sender-helper.h"
36#include "ns3/position-allocator.h"
37#include "ns3/simulator.h"
38
39#include <algorithm>
40#include <ctime>
41
42using namespace ns3;
43using namespace lorawan;
44
45NS_LOG_COMPONENT_DEFINE("SimpleLorawanNetworkExample");
46
47int
48main(int argc, char* argv[])
49{
50 // Set up logging
51 LogComponentEnable("SimpleLorawanNetworkExample", LOG_LEVEL_ALL);
52 LogComponentEnable("LoraChannel", LOG_LEVEL_INFO);
54 LogComponentEnable("EndDeviceLoraPhy", LOG_LEVEL_ALL);
55 LogComponentEnable("GatewayLoraPhy", LOG_LEVEL_ALL);
56 LogComponentEnable("LoraInterferenceHelper", LOG_LEVEL_ALL);
57 LogComponentEnable("LorawanMac", LOG_LEVEL_ALL);
58 LogComponentEnable("EndDeviceLorawanMac", LOG_LEVEL_ALL);
59 LogComponentEnable("ClassAEndDeviceLorawanMac", LOG_LEVEL_ALL);
60 LogComponentEnable("GatewayLorawanMac", LOG_LEVEL_ALL);
61 LogComponentEnable("LogicalLoraChannelHelper", LOG_LEVEL_ALL);
62 LogComponentEnable("LogicalLoraChannel", LOG_LEVEL_ALL);
63 LogComponentEnable("LoraHelper", LOG_LEVEL_ALL);
64 LogComponentEnable("LoraPhyHelper", LOG_LEVEL_ALL);
65 LogComponentEnable("LorawanMacHelper", LOG_LEVEL_ALL);
66 LogComponentEnable("OneShotSenderHelper", LOG_LEVEL_ALL);
67 LogComponentEnable("OneShotSender", LOG_LEVEL_ALL);
68 LogComponentEnable("LorawanMacHeader", LOG_LEVEL_ALL);
69 LogComponentEnable("LoraFrameHeader", LOG_LEVEL_ALL);
73
74 /************************
75 * Create the channel *
76 ************************/
77
78 NS_LOG_INFO("Creating the channel...");
79
80 // Create the lora channel object
81 Ptr<LogDistancePropagationLossModel> loss = CreateObject<LogDistancePropagationLossModel>();
82 loss->SetPathLossExponent(3.76);
83 loss->SetReference(1, 7.7);
84
85 Ptr<PropagationDelayModel> delay = CreateObject<ConstantSpeedPropagationDelayModel>();
86
87 Ptr<LoraChannel> channel = CreateObject<LoraChannel>(loss, delay);
88
89 /************************
90 * Create the helpers *
91 ************************/
92
93 NS_LOG_INFO("Setting up helpers...");
94
96 Ptr<ListPositionAllocator> allocator = CreateObject<ListPositionAllocator>();
97 allocator->Add(Vector(1000, 0, 0));
98 allocator->Add(Vector(0, 0, 0));
99 mobility.SetPositionAllocator(allocator);
100 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
101
102 // Create the LoraPhyHelper
103 LoraPhyHelper phyHelper = LoraPhyHelper();
104 phyHelper.SetChannel(channel);
105
106 // Create the LorawanMacHelper
108
109 // Create the LoraHelper
110 LoraHelper helper = LoraHelper();
111
112 /************************
113 * Create End Devices *
114 ************************/
115
116 NS_LOG_INFO("Creating the end device...");
117
118 // Create a set of nodes
119 NodeContainer endDevices;
120 endDevices.Create(1);
121
122 // Assign a mobility model to the node
123 mobility.Install(endDevices);
124
125 // Create the LoraNetDevices of the end devices
128 helper.Install(phyHelper, macHelper, endDevices);
129
130 /*********************
131 * Create Gateways *
132 *********************/
133
134 NS_LOG_INFO("Creating the gateway...");
135 NodeContainer gateways;
136 gateways.Create(1);
137
138 mobility.Install(gateways);
139
140 // Create a netdevice for each gateway
143 helper.Install(phyHelper, macHelper, gateways);
144
145 /*********************************************
146 * Install applications on the end devices *
147 *********************************************/
148
149 OneShotSenderHelper oneShotSenderHelper;
150 oneShotSenderHelper.SetSendTime(Seconds(2));
151
152 oneShotSenderHelper.Install(endDevices);
153
154 /******************
155 * Set Data Rates *
156 ******************/
157 std::vector<int> sfQuantity(6);
158 sfQuantity = LorawanMacHelper::SetSpreadingFactorsUp(endDevices, gateways, channel);
159
160 /****************
161 * Simulation *
162 ****************/
163
165
167
169
170 return 0;
171}
Helper class used to assign positions and mobility models to nodes.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:142
static void Run()
Run the simulation.
Definition: simulator.cc:178
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:186
Helps to create LoraNetDevice objects.
Definition: lora-helper.h:48
virtual NetDeviceContainer Install(const LoraPhyHelper &phyHelper, const LorawanMacHelper &macHelper, NodeContainer c) const
Install LoraNetDevices on a list of nodes.
Definition: lora-helper.cc:44
Helper to install LoraPhy instances on multiple Nodes.
void SetDeviceType(enum DeviceType dt)
Set the kind of PHY this helper will create.
void SetChannel(Ptr< LoraChannel > channel)
Set the LoraChannel to connect the PHYs to.
Helper class for configuring and installing the LorawanMac class on devices and gateways.
void SetDeviceType(enum DeviceType dt)
Set the kind of MAC this helper will create.
static std::vector< int > SetSpreadingFactorsUp(NodeContainer endDevices, NodeContainer gateways, Ptr< LoraChannel > channel)
Initialize the end devices' data rate parameter.
This class can be used to install OneShotSender applications on multiple nodes at once.
void SetSendTime(Time sendTime)
Set the send time of the applications.
ApplicationContainer Install(NodeContainer c) const
Install a OneShotSender application on each node of the input container configured with all the attri...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1319
Time Hours(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1295
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void LogComponentEnable(const std::string &name, LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:302
@ LOG_LEVEL_ALL
Print everything.
Definition: log.h:116
@ LOG_PREFIX_FUNC
Prefix all trace prints with function.
Definition: log.h:118
@ LOG_PREFIX_TIME
Prefix all trace prints with simulation time.
Definition: log.h:119
@ LOG_PREFIX_NODE
Prefix all trace prints with simulation node.
Definition: log.h:120
@ LOG_LEVEL_INFO
LOG_INFO and above.
Definition: log.h:104
void LogComponentEnableAll(LogLevel level)
Enable the logging output for all registered log components.
Definition: log.cc:320
ns channel
Definition: third.py:88
ns mobility
Definition: third.py:103