235 lines
6.1 KiB
Java
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;
|
|
}
|
|
|
|
}
|