15#include "ns3/building-allocator.h"
16#include "ns3/building-penetration-loss.h"
17#include "ns3/buildings-helper.h"
18#include "ns3/class-a-end-device-lorawan-mac.h"
19#include "ns3/command-line.h"
20#include "ns3/constant-position-mobility-model.h"
21#include "ns3/correlated-shadowing-propagation-loss-model.h"
22#include "ns3/double.h"
23#include "ns3/end-device-lora-phy.h"
24#include "ns3/forwarder-helper.h"
25#include "ns3/gateway-lora-phy.h"
26#include "ns3/gateway-lorawan-mac.h"
28#include "ns3/lora-helper.h"
29#include "ns3/mobility-helper.h"
30#include "ns3/network-server-helper.h"
31#include "ns3/node-container.h"
32#include "ns3/periodic-sender-helper.h"
33#include "ns3/pointer.h"
34#include "ns3/position-allocator.h"
35#include "ns3/random-variable-stream.h"
36#include "ns3/simulator.h"
42using namespace lorawan;
62main(
int argc,
char* argv[])
65 cmd.AddValue(
"nDevices",
"Number of end devices to include in the simulation",
nDevices);
66 cmd.AddValue(
"radius",
"The radius (m) of the area to simulate",
radiusMeters);
67 cmd.AddValue(
"realisticChannel",
68 "Whether to use a more realistic channel model",
71 cmd.AddValue(
"appPeriod",
72 "The period in seconds to be used by periodically transmitting applications",
74 cmd.AddValue(
"print",
"Whether or not to print building information",
printBuildingInfo);
75 cmd.Parse(argc, argv);
111 mobility.SetPositionAllocator(
"ns3::UniformDiscPositionAllocator",
118 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
126 loss->SetPathLossExponent(3.76);
127 loss->SetReference(1, 7.7);
136 loss->SetNext(shadowing);
141 shadowing->SetNext(buildingLoss);
179 mobility.Install(endDevices);
182 for (
auto j = endDevices.
Begin(); j != endDevices.
End(); ++j)
185 Vector position = mobility->GetPosition();
187 mobility->SetPosition(position);
200 helper.
Install(phyHelper, macHelper, endDevices);
205 for (
auto j = endDevices.
Begin(); j != endDevices.
End(); ++j)
222 allocator->Add(Vector(0.0, 0.0, 15.0));
223 mobility.SetPositionAllocator(allocator);
224 mobility.Install(gateways);
229 helper.
Install(phyHelper, macHelper, gateways);
235 double xLength = 130;
248 gridBuildingAllocator->SetAttribute(
"GridWidth",
UintegerValue(gridWidth));
249 gridBuildingAllocator->SetAttribute(
"LengthX",
DoubleValue(xLength));
250 gridBuildingAllocator->SetAttribute(
"LengthY",
DoubleValue(yLength));
251 gridBuildingAllocator->SetAttribute(
"DeltaX",
DoubleValue(deltaX));
252 gridBuildingAllocator->SetAttribute(
"DeltaY",
DoubleValue(deltaY));
253 gridBuildingAllocator->SetAttribute(
"Height",
DoubleValue(6));
254 gridBuildingAllocator->SetBuildingAttribute(
"NRoomsX",
UintegerValue(2));
255 gridBuildingAllocator->SetBuildingAttribute(
"NRoomsY",
UintegerValue(4));
256 gridBuildingAllocator->SetBuildingAttribute(
"NFloors",
UintegerValue(2));
257 gridBuildingAllocator->SetAttribute(
259 DoubleValue(-gridWidth * (xLength + deltaX) / 2 + deltaX / 2));
260 gridBuildingAllocator->SetAttribute(
262 DoubleValue(-gridHeight * (yLength + deltaY) / 2 + deltaY / 2));
263 BuildingContainer bContainer = gridBuildingAllocator->Create(gridWidth * gridHeight);
271 std::ofstream myfile;
272 myfile.open(
"buildings.txt");
273 std::vector<Ptr<Building>>::const_iterator it;
275 for (it = bContainer.
Begin(); it != bContainer.
End(); ++it, ++j)
277 Box boundaries = (*it)->GetBoundaries();
278 myfile <<
"set object " << j <<
" rect from " << boundaries.
xMin <<
","
279 << boundaries.
yMin <<
" to " << boundaries.
xMax <<
"," << boundaries.
yMax
309 appContainer.
Stop(appStopTime);
320 p2p.SetDeviceAttribute(
"DataRate",
StringValue(
"5Mbps"));
321 p2p.SetChannelAttribute(
"Delay",
StringValue(
"2ms"));
324 for (
auto gw = gateways.
Begin(); gw != gateways.
End(); ++gw)
326 auto container = p2p.Install(networkServer, *gw);
328 gwRegistration.emplace_back(serverP2PNetDev, *gw);
334 nsHelper.
Install(networkServer);
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
void Stop(Time stop) const
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
double yMax
The y coordinate of the top bound of the box.
double xMin
The x coordinate of the left bound of the box.
double yMin
The y coordinate of the bottom bound of the box.
double xMax
The x coordinate of the right bound of the box.
keep track of a set of building pointers.
Iterator End() const
Get an iterator which indicates past-the-last Building in the container.
Iterator Begin() const
Get an iterator which refers to the first Building in the container.
static void Install(Ptr< Node > node)
Install the MobilityBuildingInfo to a node.
Parse command-line arguments.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
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.
Build a set of PointToPointNetDevice objects.
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
Hold an unsigned integer type.
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.
void EnablePacketTracking()
Enable tracking of packets via trace sources.
LoraPacketTracker & GetPacketTracker()
Get a reference to the Packet Tracker object.
virtual NetDeviceContainer Install(const LoraPhyHelper &phyHelper, const LorawanMacHelper &macHelper, NodeContainer c) const
Install LoraNetDevices on a list of nodes.
Tracks and stores packets sent in the simulation and provides aggregation functionality.
std::string CountMacPacketsGlobally(Time startTime, Time stopTime)
In a time interval, count packets to evaluate the global performance at MAC level of the whole networ...
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.
This class can install a NetworkServer application on a node.
void SetGatewaysP2P(const P2PGwRegistration_t ®istration)
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 PeriodicSender applications on a wide range of nodes.
void SetPeriod(Time period)
Set the period to be used by the applications created by this helper.
void SetPacketSize(uint8_t size)
Set the base value for applications packet size in bytes.
ApplicationContainer Install(NodeContainer c) const
Install a PeriodicSender application on each node of the input container configured with all the attr...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Ptr< T > CreateObjectWithAttributes(Args... args)
Allocate an Object on the heap and initialize with a set of attributes.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time Hours(double value)
Construct a Time in the indicated unit.
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.
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
@ LOG_LEVEL_ALL
Print everything.
double simulationTimeSeconds
Scenario duration (s) in simulated time.
int nDevices
Number of end device nodes to create.
bool printBuildingInfo
Whether to print building information.
bool realisticChannelModel
Whether to use a more realistic channel model with Buildings and correlated shadowing.
int nGateways
Number of gateway nodes to create.
int appPeriodSeconds
Duration (s) of the inter-transmission time of end devices.
double radiusMeters
Radius (m) of the deployment.