#include "ns3/core-module.
h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/mobility-module.h"
#include "ns3/applications-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/lte-module.h"
using namespace ns3;
NS_LOG_COMPONENT_DEFINE("WifiOffloadSimulator");
const int NUM_USERS = 50;
const double PRB_CAPACITY = 1000.0; // Total number of available PRBs
const double PRB_USAGE_RATE = 0.02; // Rate at which PRBs are used per user (adjust
based on your scenario)
const double SIMULATION_TIME = 10.0; // in seconds
struct User {
double dataDemand; // User's data demand in PRBs
Ptr<Node> node; // User's node in ns-3
};
double usedPRBs = 0.0;
void SimulateUserActivity(std::vector<User>& users) {
for (size_t i = 0; i < [Link](); ++i) {
// Simulate user data demand
users[i].dataDemand = (rand() % 10) + 1; // Example: random data demand
between 1 and 10 PRBs
// Check if there are enough available PRBs
if (usedPRBs + users[i].dataDemand <= PRB_CAPACITY) {
// Allocate PRBs to the user
usedPRBs += users[i].dataDemand;
} else {
// Handle congestion or queuing mechanisms
NS_LOG_INFO("Congestion: User " << i << " cannot get required PRBs.");
}
}
}
void ReleaseUnusedPRBs(std::vector<User>& users) {
// Simulate release of PRBs for users who have finished using resources
for (size_t i = 0; i < [Link](); ++i) {
if (usedPRBs >= users[i].dataDemand) {
usedPRBs -= users[i].dataDemand;
} else {
// Handle potential error or queuing mechanisms
NS_LOG_INFO("Error: User " << i << " trying to release more PRBs than
allocated.");
}
}
}
int main(int argc, char* argv[]) {
LogComponentEnable("WifiOffloadSimulator", LOG_LEVEL_INFO);
// Seed for random number generation
srand(time(0));
// Create nodes
NodeContainer enbNode;
[Link](1);
NodeContainer ueNodes;
[Link](NUM_USERS);
// Mobility model for UEs (random walk)
MobilityHelper mobility;
[Link]("ns3::RandomWalk2dMobilityModel",
"Bounds", RectangleValue(Rectangle(-500, 500, -500,
500)));
[Link](ueNodes);
// Install LTE
NetDeviceContainer enbLteDevice, ueLteDevice;
enbLteDevice = [Link](enbNode);
ueLteDevice = [Link](ueNodes);
// Internet stack
InternetStackHelper stack;
[Link](enbNode);
[Link](ueNodes);
// Install IP/EPC stack on eNodeB
lteHelper->Attach(enbLteDevice, ueLteDevice);
// Internet simulation
InternetHelper internet;
NodeContainer internetNode;
[Link](1);
NetDeviceContainer internetDevices = [Link]([Link](0),
[Link](0));
[Link](internetNode);
// Configure the remote node as the Internet
Ipv4AddressHelper ipv4h;
[Link]("[Link]", "[Link]");
Ipv4InterfaceContainer internetInterfaces = [Link](internetDevices);
// Simulation loop
std::vector<User> users(NUM_USERS);
for (size_t i = 0; i < NUM_USERS; ++i) {
users[i].node = [Link](i);
}
for (double currentTime = 0.0; currentTime < SIMULATION_TIME; currentTime +=
1.0) {
SimulateUserActivity(users);
ReleaseUnusedPRBs(users);
Simulator::Stop(Seconds(currentTime + 1.0));
Simulator::Run();
Simulator::Destroy();
}
return 0;
}