package org.fog.entities; import java.util.ArrayList; import org.cloudbus.cloudsim.UtilizationModelFull; import org.cloudbus.cloudsim.core.CloudSim; import org.cloudbus.cloudsim.core.SimEntity; import org.cloudbus.cloudsim.core.SimEvent; import org.fog.application.AppEdge; import org.fog.application.AppLoop; import org.fog.application.MyApplication; import org.fog.utils.FogEvents; import org.fog.utils.FogUtils; import org.fog.utils.GeoLocation; import org.fog.utils.Logger; import org.fog.utils.TimeKeeper; import org.fog.utils.distribution.Distribution; public class MySensor extends SimEntity{ private int gatewayDeviceId; private GeoLocation geoLocation; private long outputSize; private String appId; private int userId; private String tupleType; private String sensorName; private String destModuleName; private Distribution transmitDistribution; private int controllerId; private MyApplication app; private double latency; public MySensor(String name, int userId, String appId, int gatewayDeviceId, double latency, GeoLocation geoLocation, Distribution transmitDistribution, int cpuLength, int nwLength, String tupleType, String destModuleName) { super(name); this.setAppId(appId); this.gatewayDeviceId = gatewayDeviceId; this.geoLocation = geoLocation; this.outputSize = 3; this.setTransmitDistribution(transmitDistribution); setUserId(userId); setDestModuleName(destModuleName); setTupleType(tupleType); setSensorName(sensorName); setLatency(latency); } public MySensor(String name, int userId, String appId, int gatewayDeviceId, double latency, GeoLocation geoLocation, Distribution transmitDistribution, String tupleType) { super(name); this.setAppId(appId); this.gatewayDeviceId = gatewayDeviceId; this.geoLocation = geoLocation; this.outputSize = 3; this.setTransmitDistribution(transmitDistribution); setUserId(userId); setTupleType(tupleType); setSensorName(sensorName); setLatency(latency); } /** * This constructor is called from the code that generates PhysicalTopology from JSON * @param name * @param tupleType * @param string * @param userId * @param appId * @param transmitDistribution */ public MySensor(String name, String tupleType, int userId, String appId, Distribution transmitDistribution) { super(name); this.setAppId(appId); this.setTransmitDistribution(transmitDistribution); setTupleType(tupleType); setSensorName(tupleType); setUserId(userId); } public void transmit(){ AppEdge _edge = null; for(AppEdge edge : getApp().getEdges()){ if(edge.getSource().equals(getTupleType())) _edge = edge; } long cpuLength = (long) _edge.getTupleCpuLength(); long nwLength = (long) _edge.getTupleNwLength(); Tuple tuple = new Tuple(getAppId(), FogUtils.generateTupleId(), Tuple.UP, cpuLength, 1, nwLength, outputSize, new UtilizationModelFull(), new UtilizationModelFull(), new UtilizationModelFull()); tuple.setUserId(getUserId()); tuple.setTupleType(getTupleType()); tuple.setDestModuleName(_edge.getDestination()); tuple.setSrcModuleName(getSensorName()); Logger.debug(getName(), "Sending tuple with tupleId = "+tuple.getCloudletId()); int actualTupleId = updateTimings(getSensorName(), tuple.getDestModuleName()); tuple.setActualTupleId(actualTupleId); send(gatewayDeviceId, getLatency(), FogEvents.TUPLE_ARRIVAL,tuple); } private int updateTimings(String src, String dest){ MyApplication application = getApp(); for(AppLoop loop : application.getLoops()){ if(loop.hasEdge(src, dest)){ int tupleId = TimeKeeper.getInstance().getUniqueId(); if(!TimeKeeper.getInstance().getLoopIdToTupleIds().containsKey(loop.getLoopId())) TimeKeeper.getInstance().getLoopIdToTupleIds().put(loop.getLoopId(), new ArrayList()); TimeKeeper.getInstance().getLoopIdToTupleIds().get(loop.getLoopId()).add(tupleId); TimeKeeper.getInstance().getEmitTimes().put(tupleId, CloudSim.clock()); return tupleId; } } return -1; } @Override public void startEntity() { send(gatewayDeviceId, CloudSim.getMinTimeBetweenEvents(), FogEvents.SENSOR_JOINED, geoLocation); send(getId(), getTransmitDistribution().getNextValue(), FogEvents.EMIT_TUPLE); } @Override public void processEvent(SimEvent ev) { switch(ev.getTag()){ case FogEvents.TUPLE_ACK: //transmit(transmitDistribution.getNextValue()); break; case FogEvents.EMIT_TUPLE: transmit(); send(getId(), getTransmitDistribution().getNextValue(), FogEvents.EMIT_TUPLE); break; } } @Override public void shutdownEntity() { } public int getGatewayDeviceId() { return gatewayDeviceId; } public void setGatewayDeviceId(int gatewayDeviceId) { this.gatewayDeviceId = gatewayDeviceId; } public GeoLocation getGeoLocation() { return geoLocation; } public void setGeoLocation(GeoLocation geoLocation) { this.geoLocation = geoLocation; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getTupleType() { return tupleType; } public void setTupleType(String tupleType) { this.tupleType = tupleType; } public String getSensorName() { return sensorName; } public void setSensorName(String sensorName) { this.sensorName = sensorName; } public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public String getDestModuleName() { return destModuleName; } public void setDestModuleName(String destModuleName) { this.destModuleName = destModuleName; } public Distribution getTransmitDistribution() { return transmitDistribution; } public void setTransmitDistribution(Distribution transmitDistribution) { this.transmitDistribution = transmitDistribution; } public int getControllerId() { return controllerId; } public void setControllerId(int controllerId) { this.controllerId = controllerId; } public MyApplication getApp() { return app; } public void setApp(MyApplication app) { this.app = app; } public Double getLatency() { return latency; } public void setLatency(Double latency) { this.latency = latency; } }