How to Connect Lower Level Fog Devices with Nearby Gateways in IFogsim?
Share
Condition for Connecting Lower Level Fog Devices with Nearby Gateways in IFogsim
Description: To connect lower-level fog devices with nearby gateways in iFogSim, define a hierarchical topology using the setParentId() method to establish parent-child relationships. Configure uplink latency for realistic communication delays, and link sensors and actuators to their devices with setGatewayDeviceId(). This setup ensures efficient data flow within the fog network.
Sample Code
package fogsamples;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import org.cloudbus.cloudsim.Host;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.Pe;
import org.cloudbus.cloudsim.Storage;
import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.core.SimEvent;
import org.cloudbus.cloudsim.power.PowerHost;
import org.fog.application.AppEdge;
import org.fog.application.Application;
import org.fog.application.selectivity.FractionalSelectivity;
import org.fog.entities.Actuator;
import org.fog.entities.FogBroker;
import org.fog.entities.FogDevice;
import org.fog.entities.Sensor;
import org.fog.placement.ModuleMapping;
import org.fog.policy.AppModuleAllocationPolicy;
import org.fog.scheduler.StreamOperatorScheduler;
import org.fog.utils.FogLinearPowerModel;
import org.fog.utils.FogUtils;
import org.fog.utils.distribution.DeterministicDistribution;
import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;
import org.cloudbus.cloudsim.sdn.overbooking.BwProvisionerOverbooking;
import org.cloudbus.cloudsim.sdn.overbooking.PeProvisionerOverbooking;
import org.fog.application.AppLoop;
import org.fog.entities.FogDeviceCharacteristics;
import org.fog.entities.Tuple;
import org.fog.placement.Controller;
import org.fog.placement.ModulePlacementMapping;
public class FogDeviceGatewayConnectionExample {
static List fogDevices = new ArrayList();
static List sensors = new ArrayList();
static List actuators = new ArrayList();
static int numOfAreas = 2;
static int numOfCamerasPerArea = 3;
public static void main(String[] args) {
Log.printLine("Starting fog devices and gateway connection simulation...");
try {
Log.disable();
int num_user = 1; // number of cloud users
Calendar calendar = Calendar.getInstance();
boolean trace_flag = false;
CloudSim.init(num_user, calendar, trace_flag);
String appId = "dcns"; // identifier of the application
FogBroker broker = new FogBroker("broker");
Application application = createApplication(appId, broker.getId());
application.setUserId(broker.getId());
createFogDevices(broker.getId(), appId);
ModuleMapping moduleMapping = ModuleMapping.createModuleMapping(); // initializing module mapping
for (FogDevice device : fogDevices) {
if (device.getName().startsWith("m")) { // names of all Smart Cameras start with 'm'
moduleMapping.addModuleToDevice("motion_detector", device.getName());
}
}
moduleMapping.addModuleToDevice("user_interface", "cloud");
Controller controller = new Controller("master-controller", fogDevices, sensors, actuators);
controller.submitApplication(application, new ModulePlacementMapping(fogDevices, application, moduleMapping));
CloudSim.startSimulation();
CloudSim.stopSimulation();
Log.printLine("Fog devices and gateway connection simulation finished!");
} catch (Exception e) {
e.printStackTrace();
Log.printLine("Unwanted errors happened");
}
}
private static void createFogDevices(int userId, String appId) {
FogDevice cloud = createFogDevice("cloud", 44800, 40000, 100, 10000, 0, 0.01, 16 * 103, 16 * 83.25);
cloud.setParentId(-1);
fogDevices.add(cloud);
FogDevice proxy = createFogDevice("proxy-server", 2800, 4000, 10000, 10000, 1, 0.0, 107.339, 83.4333);
proxy.setParentId(cloud.getId());
proxy.setUplinkLatency(100);
fogDevices.add(proxy);
for (int i = 0; i < numOfAreas; i++) {
addArea(i + "", userId, appId, proxy.getId());
}
}
private static FogDevice addArea(String id, int userId, String appId, int parentId) {
FogDevice router = createFogDevice("d-" + id, 2800, 4000, 10000, 10000, 1, 0.0, 107.339, 83.4333);
fogDevices.add(router);
router.setUplinkLatency(2);
for (int i = 0; i < numOfCamerasPerArea; i++) {
String mobileId = id + "-" + i;
FogDevice camera = addCamera(mobileId, userId, appId, router.getId());
camera.setUplinkLatency(2); // latency between camera and router (gateway)
fogDevices.add(camera);
}
router.setParentId(parentId);
return router;
}
private static FogDevice addCamera(String id, int userId, String appId, int parentId) {
FogDevice camera = createFogDevice("m-" + id, 500, 1000, 10000, 10000, 3, 0, 87.53, 82.44);
camera.setParentId(parentId);
Sensor sensor = new Sensor("s-" + id, "CAMERA", userId, appId, new DeterministicDistribution(5)); // inter-transmission time of camera (sensor)
sensors.add(sensor);
Actuator ptz = new Actuator("ptz-" + id, userId, appId, "PTZ_CONTROL");
actuators.add(ptz);
sensor.setGatewayDeviceId(camera.getId());
sensor.setLatency(1.0);
ptz.setGatewayDeviceId(camera.getId());
ptz.setLatency(1.0);
return camera;
}
private static FogDevice createFogDevice(String nodeName, long mips,
int ram, long upBw, long downBw, int level, double ratePerMips, double busyPower, double idlePower) {
List peList = new ArrayList();
// 3. Create PEs and add these into a list.
peList.add(new Pe(0, new PeProvisionerOverbooking(mips))); // need to store Pe id and MIPS Rating
int hostId = FogUtils.generateEntityId();
long storage = 1000000; // host storage
int bw = 10000;
PowerHost host = new PowerHost(
hostId,
new RamProvisionerSimple(ram),
new BwProvisionerOverbooking(bw),
storage,
peList,
new StreamOperatorScheduler(peList),
new FogLinearPowerModel(busyPower, idlePower)
);
List hostList = new ArrayList();
hostList.add(host);
String arch = "x86"; // system architecture
String os = "Linux"; // operating system
String vmm = "Xen";
double time_zone = 10.0; // time zone this resource located
double cost = 3.0; // the cost of using processing in this resource
double costPerMem = 0.05; // the cost of using memory in this resource
double costPerStorage = 0.001; // the cost of using storage in this
// resource
double costPerBw = 0.0; // the cost of using bw in this resource
LinkedList storageList = new LinkedList(); // we are not adding SAN
// devices by now
FogDeviceCharacteristics characteristics = new FogDeviceCharacteristics(
arch, os, vmm, host, time_zone, cost, costPerMem,
costPerStorage, costPerBw);
FogDevice fogdevice = null;
try {
fogdevice = new FogDevice(nodeName, characteristics,
new AppModuleAllocationPolicy(hostList), storageList, 10, upBw, downBw, 0, ratePerMips);
} catch (Exception e) {
e.printStackTrace();
}
fogdevice.setLevel(level);
return fogdevice;
}
private static Application createApplication(String appId, int userId) {
Application application = Application.createApplication(appId, userId);
application.addAppModule("motion_detector", 10);
application.addAppModule("object_tracker", 5);
application.addAppModule("object_detector", 3);
application.addAppModule("user_interface", 2);
application.addAppEdge("CAMERA", "motion_detector", 1000, 20000, "CAMERA", Tuple.UP, AppEdge.SENSOR); // adding edge from CAMERA (sensor) to Motion Detector module carrying tuples of type CAMERA
application.addAppEdge("motion_detector", "object_detector", 2000, 2000, "MOTION_VIDEO_STREAM", Tuple.UP, AppEdge.MODULE); // adding edge from Motion Detector to Object Detector module carrying tuples of type MOTION_VIDEO_STREAM
application.addAppEdge("object_detector", "object_tracker", 1000, 100, "OBJECT_LOCATION", Tuple.UP, AppEdge.MODULE); // adding edge from Object Detector to Object Tracker module carrying tuples of type OBJECT_LOCATION
application.addAppEdge("object_tracker", "PTZ_CONTROL", 100, 28, 100, "PTZ_PARAMS", Tuple.DOWN, AppEdge.ACTUATOR); // adding e
final AppLoop loop1 = new AppLoop(new ArrayList() {
{
add("motion_detector");
add("object_detector");
add("object_tracker");
}
});
final AppLoop loop2 = new AppLoop(new ArrayList() {
{
add("object_tracker");
add("PTZ_CONTROL");
}
});
List loops = new ArrayList() {
{
add(loop1);
add(loop2);
}
};
application.setLoops(loops);
return application;
}
}