A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
network-server-example.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017 University of Padova
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Davide Magrin <magrinda@dei.unipd.it>
7 */
8
9/*
10 * This example creates a simple network in which all LoRaWAN components are
11 * simulated: end devices, some gateways and a network server.
12 * Two end devices are already configured to send unconfirmed and confirmed messages respectively.
13 */
14
15#include "ns3/command-line.h"
16#include "ns3/core-module.h"
17#include "ns3/forwarder-helper.h"
18#include "ns3/gateway-lora-phy.h"
19#include "ns3/log.h"
20#include "ns3/lora-channel.h"
21#include "ns3/lora-device-address-generator.h"
22#include "ns3/lora-helper.h"
23#include "ns3/lora-phy-helper.h"
24#include "ns3/lorawan-mac-helper.h"
25#include "ns3/mobility-helper.h"
26#include "ns3/network-module.h"
27#include "ns3/network-server-helper.h"
28#include "ns3/one-shot-sender-helper.h"
29#include "ns3/periodic-sender-helper.h"
30#include "ns3/periodic-sender.h"
31#include "ns3/point-to-point-module.h"
32#include "ns3/string.h"
33
34using namespace ns3;
35using namespace lorawan;
36
37NS_LOG_COMPONENT_DEFINE("NetworkServerExample");
38
39int
40main(int argc, char* argv[])
41{
42 bool verbose = false;
43
44 CommandLine cmd(__FILE__);
45 cmd.AddValue("verbose", "Whether to print output or not", verbose);
46 cmd.Parse(argc, argv);
47
48 // Logging
49 //////////
50
51 LogComponentEnable("NetworkServerExample", LOG_LEVEL_ALL);
52 LogComponentEnable("NetworkServer", LOG_LEVEL_ALL);
53 LogComponentEnable("GatewayLorawanMac", LOG_LEVEL_ALL);
54 // LogComponentEnable("LoraFrameHeader", LOG_LEVEL_ALL);
55 // LogComponentEnable("LorawanMacHeader", LOG_LEVEL_ALL);
56 // LogComponentEnable("MacCommand", LOG_LEVEL_ALL);
57 // LogComponentEnable("GatewayLoraPhy", LOG_LEVEL_ALL);
58 // LogComponentEnable("LoraPhy", LOG_LEVEL_ALL);
59 // LogComponentEnable("LoraChannel", LOG_LEVEL_ALL);
60 // LogComponentEnable("EndDeviceLoraPhy", LOG_LEVEL_ALL);
61 // LogComponentEnable("LogicalLoraChannelHelper", LOG_LEVEL_ALL);
62 LogComponentEnable("EndDeviceLorawanMac", LOG_LEVEL_ALL);
63 LogComponentEnable("ClassAEndDeviceLorawanMac", LOG_LEVEL_ALL);
64 // LogComponentEnable ("OneShotSender", LOG_LEVEL_ALL);
65 // LogComponentEnable("PointToPointNetDevice", LOG_LEVEL_ALL);
66 // LogComponentEnable ("Forwarder", LOG_LEVEL_ALL);
67 // LogComponentEnable ("OneShotSender", LOG_LEVEL_ALL);
68 // LogComponentEnable ("DeviceStatus", LOG_LEVEL_ALL);
69 // LogComponentEnable ("GatewayStatus", LOG_LEVEL_ALL);
73
74 // Create a simple wireless channel
75 ///////////////////////////////////
76
78 loss->SetPathLossExponent(3.76);
79 loss->SetReference(1, 7.7);
80
82
84
85 // Helpers
86 //////////
87
88 // End device mobility
89 MobilityHelper mobilityEd;
90 MobilityHelper mobilityGw;
92 positionAllocEd->Add(Vector(6000.0, 0.0, 0.0));
93 positionAllocEd->Add(Vector(0.0, 100.0, 0.0));
94 mobilityEd.SetPositionAllocator(positionAllocEd);
95 mobilityEd.SetMobilityModel("ns3::ConstantPositionMobilityModel");
96
97 // Gateway mobility
99 positionAllocGw->Add(Vector(0.0, 0.0, 0.0));
100 positionAllocGw->Add(Vector(-2000.0, 0.0, 0.0));
101 positionAllocGw->Add(Vector(500.0, 0.0, 0.0));
102 mobilityGw.SetPositionAllocator(positionAllocGw);
103 mobilityGw.SetMobilityModel("ns3::ConstantPositionMobilityModel");
104
105 // Create the LoraPhyHelper
106 LoraPhyHelper phyHelper = LoraPhyHelper();
107 phyHelper.SetChannel(channel);
108
109 // Create the LorawanMacHelper
111
112 // Create the LoraHelper
113 LoraHelper helper = LoraHelper();
114
115 // Create end devices
116 /////////////
117
118 NodeContainer endDevices;
119 endDevices.Create(2);
120 mobilityEd.Install(endDevices);
121
122 // Create a LoraDeviceAddressGenerator
123 uint8_t nwkId = 54;
124 uint32_t nwkAddr = 1864;
127
128 // Create the LoraNetDevices of the end devices
131 macHelper.SetAddressGenerator(addrGen);
133 helper.Install(phyHelper, macHelper, endDevices);
134
135 // Set message type (Default is unconfirmed)
136 Ptr<LorawanMac> edMac1 = DynamicCast<LoraNetDevice>(endDevices.Get(1)->GetDevice(0))->GetMac();
138 edLorawanMac1->SetMType(LorawanMacHeader::CONFIRMED_DATA_UP);
139
140 // Install applications in end devices
142 oneShotHelper.SetSendTime(Seconds(4));
143 oneShotHelper.Install(endDevices.Get(0));
144 oneShotHelper.SetSendTime(Seconds(10));
145 oneShotHelper.Install(endDevices.Get(1));
146 // oneShotHelper.SetSendTime (Seconds (8));
147 // oneShotHelper.Install(endDevices.Get (1));
148 // oneShotHelper.SetSendTime (Seconds (12));
149 // oneShotHelper.Install(endDevices.Get (2));
150
151 ////////////////
152 // Create gateways //
153 ////////////////
154
155 NodeContainer gateways;
156 gateways.Create(1);
157 mobilityGw.Install(gateways);
158
159 // Create the LoraNetDevices of the gateways
162 helper.Install(phyHelper, macHelper, gateways);
163
164 // Set spreading factors up
165 LorawanMacHelper::SetSpreadingFactorsUp(endDevices, gateways, channel);
166
167 ////////////
168 // Create network serverNS
169 ////////////
170
171 Ptr<Node> networkServer = CreateObject<Node>();
172
173 // PointToPoint links between gateways and server
175 p2p.SetDeviceAttribute("DataRate", StringValue("5Mbps"));
176 p2p.SetChannelAttribute("Delay", StringValue("2ms"));
177 // Store network server app registration details for later
178 P2PGwRegistration_t gwRegistration;
179 for (auto gw = gateways.Begin(); gw != gateways.End(); ++gw)
180 {
181 auto container = p2p.Install(networkServer, *gw);
182 auto serverP2PNetDev = DynamicCast<PointToPointNetDevice>(container.Get(0));
183 gwRegistration.emplace_back(serverP2PNetDev, *gw);
184 }
185
186 // Install the NetworkServer application on the network server
187 NetworkServerHelper networkServerHelper;
188 networkServerHelper.SetGatewaysP2P(gwRegistration);
189 networkServerHelper.SetEndDevices(endDevices);
190 networkServerHelper.Install(networkServer);
191
192 // Install the Forwarder application on the gateways
193 ForwarderHelper forwarderHelper;
194 forwarderHelper.Install(gateways);
195
196 // Start simulation
200
201 return 0;
202}
Parse command-line arguments.
Helper class used to assign positions and mobility models to nodes.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void SetMobilityModel(std::string type, Ts &&... args)
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
keep track of a set of node pointers.
Iterator End() const
Get an iterator which indicates past-the-last Node in the container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Iterator Begin() const
Get an iterator which refers to the first Node in the container.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Definition node.cc:138
Build a set of PointToPointNetDevice objects.
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
Hold variables of type string.
Definition string.h:45
This class can be used to install Forwarder applications on a set of gateways.
ApplicationContainer Install(NodeContainer c) const
Install a Forwarder application on each node of the input container configured with all the attribute...
Helps to create LoraNetDevice objects.
Definition lora-helper.h:37
virtual NetDeviceContainer Install(const LoraPhyHelper &phyHelper, const LorawanMacHelper &macHelper, NodeContainer c) const
Install LoraNetDevices on a list of nodes.
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.
void SetAddressGenerator(Ptr< LoraDeviceAddressGenerator > addrGen)
Set the address generator to use for creation of these nodes.
static std::vector< int > SetSpreadingFactorsUp(NodeContainer endDevices, NodeContainer gateways, Ptr< LoraChannel > channel)
Initialize the end devices' data rate parameter.
void SetRegion(enum Regions region)
Set the region in which the device is to operate.
This class can install a NetworkServer application on a node.
void SetGatewaysP2P(const P2PGwRegistration_t &registration)
Register gateways connected with point-to-point to this network server.
void SetEndDevices(NodeContainer endDevices)
Set which end devices will be managed by this network server.
ApplicationContainer Install(Ptr< Node > node)
Create one lorawan network server application on the Node.
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:191
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
std::list< std::pair< Ptr< PointToPointNetDevice >, Ptr< Node > > > P2PGwRegistration_t
Store network server app registration details for gateway nodes having a P2P link with the network se...
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:291
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
Definition ptr.h:580
@ LOG_LEVEL_ALL
Print everything.
Definition log.h:105
@ LOG_PREFIX_FUNC
Prefix all trace prints with function.
Definition log.h:107
@ LOG_PREFIX_TIME
Prefix all trace prints with simulation time.
Definition log.h:108
@ LOG_PREFIX_NODE
Prefix all trace prints with simulation node.
Definition log.h:109
void LogComponentEnableAll(LogLevel level)
Enable the logging output for all registered log components.
Definition log.cc:309
channel
Definition third.py:77
bool verbose