Files
ifogsim/src/org/fog/entities/MySensor.java
2021-04-06 00:45:28 +02:00

235 lines
6.1 KiB
Java

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<Integer>());
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;
}
}