From: rtrimana Date: Wed, 21 Dec 2016 21:16:32 +0000 (-0800) Subject: First benchmark working with capability-based RMI; adjustments in callbacks, etc. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=069ac173d156f2cfad1cdaebce45ba990a76b6c5;p=iot2.git First benchmark working with capability-based RMI; adjustments in callbacks, etc. --- diff --git a/benchmarks/Lifxtest/Lifxtest.java b/benchmarks/Lifxtest/Lifxtest.java index df95114..9786055 100644 --- a/benchmarks/Lifxtest/Lifxtest.java +++ b/benchmarks/Lifxtest/Lifxtest.java @@ -27,12 +27,12 @@ public class Lifxtest { public void init() throws InterruptedException { for(LightBulbTest lifx : lifx_light_bulb.values()) { - Thread thread = new Thread(new Runnable() { - public void run() { + //Thread thread = new Thread(new Runnable() { + // public void run() { lifx.init(); - } - }); - thread.start(); + // } + //}); + //thread.start(); Thread.sleep(1000); for (int i = 0; i < 5; i++) { @@ -68,7 +68,7 @@ public class Lifxtest { Thread.sleep(500); } - thread.join(); + //thread.join(); } } } diff --git a/benchmarks/Makefile b/benchmarks/Makefile index 0c49d34..1e0aeea 100644 --- a/benchmarks/Makefile +++ b/benchmarks/Makefile @@ -4,7 +4,7 @@ BOOFJARS := $(BOOFDIR)/BoofCV-feature-0.21.jar:$(BOOFDIR)/BoofCV-io-0.21.jar:$(B include $(BASE)/common.mk -all: interfaces annotation drivers Lifxtest +all: interfaces annotation drivers Lifxtest SmartLights PHONY += interfaces interfaces: diff --git a/benchmarks/SmartLightsController/CameraCallback_CallbackSkeleton.java b/benchmarks/SmartLightsController/CameraCallback_CallbackSkeleton.java index 913092a..4c4f592 100644 --- a/benchmarks/SmartLightsController/CameraCallback_CallbackSkeleton.java +++ b/benchmarks/SmartLightsController/CameraCallback_CallbackSkeleton.java @@ -14,10 +14,6 @@ public class CameraCallback_CallbackSkeleton implements CameraCallback { private CameraCallback mainObj; private int objectId = 0; private String callbackAddress; - private static int objIdCnt = 0; - private IoTRMICall rmiCall; - private int[] ports; - public CameraCallback_CallbackSkeleton(CameraCallback _mainObj, String _callbackAddress, int _objectId) throws Exception { @@ -26,34 +22,20 @@ public class CameraCallback_CallbackSkeleton implements CameraCallback { objectId = _objectId; } - public void newCameraFrameAvailable(CameraSmart _camera) { - mainObj.newCameraFrameAvailable(_camera); - } - - public void ___regCB(IoTRMIObject rmiObj) throws IOException { - Object[] paramObj = rmiObj.getMethodParams(new Class[] { int[].class, String.class, int.class },new Class[] { null, null, null }); - ports = (int[]) paramObj[0]; - rmiCall = new IoTRMICall((int) paramObj[0], (String) paramObj[1], ports[1]); + public void newCameraFrameAvailable(byte latestFrame[], long timeStamp) { + mainObj.newCameraFrameAvailable(latestFrame, timeStamp); } public void ___newCameraFrameAvailable(IoTRMIObject rmiObj) { - Object[] paramObj = rmiObj.getMethodParams(new Class[] { int.class }, - new Class[] { null }); - try { - CameraSmart stub0 = new CameraSmart_CallbackStub(rmiCall, callbackAddress, objIdCnt, ports); - objIdCnt++; - newCameraFrameAvailable(stub0); - } catch(Exception ex) { - ex.printStackTrace(); - throw new Error("Exception from callback object instantiation!"); - } + Object[] paramObj = rmiObj.getMethodParams(new Class[] { byte[].class, long.class }, + new Class[] { null, null }); + newCameraFrameAvailable((byte[]) paramObj[0], (long) paramObj[1]); } public void invokeMethod(IoTRMIObject rmiObj) throws IOException { int methodId = rmiObj.getMethodId(); switch (methodId) { case 0: ___newCameraFrameAvailable(rmiObj); break; - case -9999: ___regCB(rmiObj); break; default: throw new Error("Method Id " + methodId + " not recognized!"); } diff --git a/benchmarks/SmartLightsController/CameraSmart_Stub.java b/benchmarks/SmartLightsController/CameraSmart_Stub.java index e81b00c..87d836a 100644 --- a/benchmarks/SmartLightsController/CameraSmart_Stub.java +++ b/benchmarks/SmartLightsController/CameraSmart_Stub.java @@ -31,6 +31,7 @@ public class CameraSmart_Stub implements CameraSmart { rmiCall = new IoTRMICall(_port, _skeletonAddress, _rev); set0Allowed = new ArrayList(Arrays.asList(object0Permission)); listCallbackObj = new ArrayList(); + set0Allowed.add(-9999); ___initCallBack(); } @@ -137,13 +138,13 @@ public class CameraSmart_Stub implements CameraSmart { rmiObj = new IoTRMIObject(ports[0]); while (true) { byte[] method = rmiObj.getMethodBytes(); - int methodId = IoTRMIObject.getMethodId(method); - if (!set0Allowed.contains(methodId)) { - throw new Error("Callback object for CameraCallback is not allowed to access method: " + methodId); - } int objId = IoTRMIObject.getObjectId(method); CameraCallback_CallbackSkeleton skel = (CameraCallback_CallbackSkeleton) listCallbackObj.get(objId); if (skel != null) { + int methodId = IoTRMIObject.getMethodId(method); + if (!set0Allowed.contains(methodId)) { + throw new Error("Callback object for CameraCallback is not allowed to access method: " + methodId); + } skel.invokeMethod(rmiObj); } else { throw new Error("CameraCallback: Object with Id " + objId + " not found!"); diff --git a/benchmarks/SmartLightsController/LightBulbSmart_Stub.java b/benchmarks/SmartLightsController/LightBulbSmart_Stub.java index 3e93190..ecfccf9 100644 --- a/benchmarks/SmartLightsController/LightBulbSmart_Stub.java +++ b/benchmarks/SmartLightsController/LightBulbSmart_Stub.java @@ -14,7 +14,6 @@ public class LightBulbSmart_Stub implements LightBulbSmart { private IoTRMICall rmiCall; private String callbackAddress; private int[] ports; - private final static int objectId = 0; diff --git a/benchmarks/SmartLightsController/Makefile b/benchmarks/SmartLightsController/Makefile index cdbb18d..ffda80c 100644 --- a/benchmarks/SmartLightsController/Makefile +++ b/benchmarks/SmartLightsController/Makefile @@ -14,6 +14,6 @@ PHONY += smartlights smartlights: $(JAVAC) $(JFLAGS) *.java cp SmartLightsController.config $(BIN_DIR)/SmartLightsController - cd $(BIN_DIR)/SmartLightsController; $(JAR) $(JARFLAGS) SmartLightsController.jar ../SmartLightsController/SmartLightsController*.class ../SmartLightsController/ColorTemperature*.class ../SmartLightsController/MotionDetection*.class ../iotcode/interfaces/Camera*.class ../iotcode/interfaces/Room*.class ../iotcode/interfaces/LightBulb*.class + cd $(BIN_DIR)/SmartLightsController; $(JAR) $(JARFLAGS) SmartLightsController.jar ../SmartLightsController/SmartLightsController*.class ../SmartLightsController/ColorTemperature*.class ../SmartLightsController/MotionDetection*.class ../iotcode/interfaces/Camera*.class ../iotcode/interfaces/Room*.class ../iotcode/interfaces/LightBulb*.class ../iotcode/interfaces/Resolution*.class .PHONY: $(PHONY) diff --git a/benchmarks/SmartLightsController/MotionDetection.java b/benchmarks/SmartLightsController/MotionDetection.java index b683327..d9c608e 100644 --- a/benchmarks/SmartLightsController/MotionDetection.java +++ b/benchmarks/SmartLightsController/MotionDetection.java @@ -116,7 +116,7 @@ class MotionDetection implements CameraCallback { // counts the number of frames since a background image is added to algorithm private int frameCounter = 0; - + private CameraSmart _camera; /******************************************************************************************************************************************* ** @@ -257,12 +257,13 @@ class MotionDetection implements CameraCallback { * * @return [void] None. */ - public void newCameraFrameAvailable(CameraSmart _camera) { + public void newCameraFrameAvailable(byte[] latestFrame, long timeStamp) { BufferedImage img = null; try { // Parse the byte array into a Buffered Image - InputStream in = new ByteArrayInputStream(_camera.getLatestFrame()); + //InputStream in = new ByteArrayInputStream(_camera.getLatestFrame()); + InputStream in = new ByteArrayInputStream(latestFrame); img = ImageIO.read(in); } catch (RemoteException e) { @@ -279,8 +280,8 @@ class MotionDetection implements CameraCallback { imageWriteLock.lock(); // lock the image and timestamp buffers since multithread latestImage = img; // image into image buffer - // timestamp from camera into timestamo buffer - long dateLong = _camera.getTimestamp(); + // timestamp from camera into timestamp buffer + long dateLong = timeStamp; possibleDate = new Date(dateLong); imageWriteLock.unlock(); // Never forget to unlock diff --git a/benchmarks/SmartLightsController/SmartLightsController.java b/benchmarks/SmartLightsController/SmartLightsController.java index f073df8..9f3ad93 100644 --- a/benchmarks/SmartLightsController/SmartLightsController.java +++ b/benchmarks/SmartLightsController/SmartLightsController.java @@ -44,26 +44,25 @@ public class SmartLightsController { @config private IoTSet mainRoomLightBulbs; @config private IoTSet cameras; - /* * IoT Sets of Things that are not devices such as rooms */ - @config private IoTSet rooms; + @config private IoTSet rooms; /* * IoT Relations */ - @config private IoTRelation roomCameraRel; - @config private IoTRelation roomMainBulbRel; + @config private IoTRelation roomCameraRel; + @config private IoTRelation roomMainBulbRel; /* * The state that the room main lights are supposed to be in */ - Map roomLightOnOffStatus = - new HashMap(); - Map roomLightColorTemperature = - new HashMap(); + Map roomLightOnOffStatus = + new HashMap(); + Map roomLightColorTemperature = + new HashMap(); /* * Motion detectors that are bound to specific cameras @@ -94,13 +93,13 @@ public class SmartLightsController { /** Method to detect if a room has seen motion within the last few seconds (time specified as parameter). * Checks all the motion detectors for the given room * - * @param _room [Room] , Room of interest. + * @param _room [RoomSmart] , RoomSmart of interest. * @param _numberOfSeconds [int] , Number of seconds in the past that we consider recent. * @param _upperThreshold [int] , Number of seconds as an upper bound before we turn off. * * @return [boolean] if motion was detected recently. */ - private boolean roomDidHaveMotionRecently(Room _room, int _numberOfSeconds) { + private boolean roomDidHaveMotionRecently(RoomSmart _room, int _numberOfSeconds) { long currentTimeSeconds = (new Date()).getTime() / 1000; // Loop through all the motion sensors in the room @@ -144,7 +143,7 @@ public class SmartLightsController { long secondsSinceStartOfDay = currentTimeSeconds - (beginningOfToday.getTime() / 1000); - for (Room room : rooms.values()) { + for (RoomSmart room : rooms.values()) { // before 8:30 am if (secondsSinceStartOfDay <= 30600) { @@ -249,7 +248,7 @@ public class SmartLightsController { */ private void setMainBulbs() throws RemoteException { - for (Room room : rooms.values()) { + for (RoomSmart room : rooms.values()) { // Lights in room should be turned off if (!roomLightOnOffStatus.get(room)) { @@ -328,9 +327,9 @@ public class SmartLightsController { */ public void init() throws RemoteException, InterruptedException { - + System.out.println("Initialized init()!"); // Initialize the rooms - for (Room room : rooms.values()) { + for (RoomSmart room : rooms.values()) { // All rooms start with the lights turned off roomLightOnOffStatus.put(room, false); @@ -338,7 +337,7 @@ public class SmartLightsController { // All rooms have a default color and temperature roomLightColorTemperature.put(room, new ColorTemperature(0, 0, 100, 2500)); } - + System.out.println("Initialized rooms!"); // Setup the cameras, start them all and assign each one a motion detector for (CameraSmart cam : cameras.values()) { @@ -362,13 +361,16 @@ public class SmartLightsController { // Remember which motion detector is for what camera camMotionDetect.put(cam, mo); } - + System.out.println("Initialized cameras!"); //Initialize the light-bulbs, will turn off the bulb for (LightBulbSmart bulb : mainRoomLightBulbs.values()) { + System.out.println("Trying to init bulb?"); bulb.init(); + System.out.println("Done init!"); Thread.sleep(1000); } + System.out.println("Initialized bulbs!"); // Run the main loop that will keep check the bulbs and rooms periodically while (true) { @@ -379,7 +381,7 @@ public class SmartLightsController { lastTimeChecked = currentTimeSeconds; // Check for motion in rooms and if there is motion then turn on the lights - for (Room room : rooms.values()) { + for (RoomSmart room : rooms.values()) { if (roomDidHaveMotionRecently(room, MOTION_TIME_THRESHOLD)) { diff --git a/benchmarks/drivers/AmcrestCamera/AmcrestCamera.java b/benchmarks/drivers/AmcrestCamera/AmcrestCamera.java index ba3d8e3..686089f 100644 --- a/benchmarks/drivers/AmcrestCamera/AmcrestCamera.java +++ b/benchmarks/drivers/AmcrestCamera/AmcrestCamera.java @@ -464,7 +464,7 @@ public class AmcrestCamera implements Camera { for (CameraSmartCallback c : callbackList) { - c.newCameraFrameAvailable(this); + c.newCameraFrameAvailable(this.getLatestFrame(), this.getTimestamp()); } } else { diff --git a/benchmarks/drivers/AmcrestCamera/CameraSmartCallback_CallbackStub.java b/benchmarks/drivers/AmcrestCamera/CameraSmartCallback_CallbackStub.java new file mode 100644 index 0000000..5913de2 --- /dev/null +++ b/benchmarks/drivers/AmcrestCamera/CameraSmartCallback_CallbackStub.java @@ -0,0 +1,36 @@ +package iotcode.AmcrestCamera; + +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import iotrmi.Java.IoTRMICall; +import iotrmi.Java.IoTRMIObject; + +import iotcode.interfaces.*; + +public class CameraSmartCallback_CallbackStub implements CameraSmartCallback { + + private IoTRMICall rmiCall; + private String callbackAddress; + private int[] ports; + + private int objectId = 0; + + + public CameraSmartCallback_CallbackStub(IoTRMICall _rmiCall, String _callbackAddress, int _objectId, int[] _ports) throws Exception { + callbackAddress = _callbackAddress; + objectId = _objectId; + rmiCall = _rmiCall; + ports = _ports; + } + + public void newCameraFrameAvailable(byte latestFrame[], long timeStamp) { + int methodId = 0; + Class retType = void.class; + Class[] paramCls = new Class[] { byte[].class, long.class }; + Object[] paramObj = new Object[] { latestFrame, timeStamp }; + rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); + } + +} diff --git a/benchmarks/drivers/AmcrestCamera/Camera_Skeleton.java b/benchmarks/drivers/AmcrestCamera/Camera_Skeleton.java index 86d9aa8..e0daeec 100644 --- a/benchmarks/drivers/AmcrestCamera/Camera_Skeleton.java +++ b/benchmarks/drivers/AmcrestCamera/Camera_Skeleton.java @@ -8,7 +8,6 @@ import iotrmi.Java.IoTRMICall; import iotrmi.Java.IoTRMIObject; import iotcode.interfaces.*; -import SmartLightsController.CameraSmartCallback_CallbackStub; public class Camera_Skeleton implements Camera { @@ -81,7 +80,7 @@ public class Camera_Skeleton implements Camera { public void ___regCB() throws IOException { Object[] paramObj = rmiObj.getMethodParams(new Class[] { int[].class, String.class, int.class },new Class[] { null, null, null }); ports = (int[]) paramObj[0]; - rmiCall = new IoTRMICall((int) paramObj[0], (String) paramObj[1], ports[0]); + rmiCall = new IoTRMICall(ports[0], (String) paramObj[1], (int) paramObj[2]); } public void ___init() { diff --git a/benchmarks/drivers/LifxLightBulb/LifxLightBulb.config b/benchmarks/drivers/LifxLightBulb/LifxLightBulb.config index 0a7ddcb..fa88933 100644 --- a/benchmarks/drivers/LifxLightBulb/LifxLightBulb.config +++ b/benchmarks/drivers/LifxLightBulb/LifxLightBulb.config @@ -1,5 +1,6 @@ # Skeleton/original interface INTERFACE_CLASS=LightBulb # Stub -INTERFACE_STUB_CLASS=LightBulbTest +#INTERFACE_STUB_CLASS=LightBulbTest +INTERFACE_STUB_CLASS=LightBulbSmart diff --git a/benchmarks/drivers/LifxLightBulb/LightBulb_Skeleton.java b/benchmarks/drivers/LifxLightBulb/LightBulb_Skeleton.java index bca3863..ced4a23 100644 --- a/benchmarks/drivers/LifxLightBulb/LightBulb_Skeleton.java +++ b/benchmarks/drivers/LifxLightBulb/LightBulb_Skeleton.java @@ -15,8 +15,8 @@ public class LightBulb_Skeleton implements LightBulb { private IoTRMIObject rmiObj; private String callbackAddress; - private final static int object0Id = 0; //LightBulbTest - private static Integer[] object0Permission = { 2, 6, 1, 3, 4, 8, 0, 5, 7, 9 }; + private final static int object0Id = 0; //LightBulbSmart + private static Integer[] object0Permission = { 2, 10, 1, 3, 11, 8, 12, 7, 13, 9, 6, 16, 17, 4, 0, 14, 15, 5 }; private static List set0Allowed; diff --git a/benchmarks/drivers/Makefile b/benchmarks/drivers/Makefile index 64f5d6c..891537b 100644 --- a/benchmarks/drivers/Makefile +++ b/benchmarks/drivers/Makefile @@ -24,7 +24,7 @@ PHONY += camera camera: $(JAVAC) $(JFLAGS) AmcrestCamera/*.java cp AmcrestCamera/AmcrestCamera.config $(BIN_DIR)/iotcode/AmcrestCamera - cd $(BIN_DIR)/iotcode/AmcrestCamera; $(JAR) $(JARFLAGS) AmcrestCamera.jar ../../iotcode/AmcrestCamera/*.class ../../iotcode/interfaces/Camera*.class + cd $(BIN_DIR)/iotcode/AmcrestCamera; $(JAR) $(JARFLAGS) AmcrestCamera.jar ../../iotcode/AmcrestCamera/*.class ../../iotcode/interfaces/Camera*.class ../../iotcode/interfaces/Resolution*.class PHONY += labroom labroom: diff --git a/benchmarks/interfaces/CameraCallback.java b/benchmarks/interfaces/CameraCallback.java index e4a07f0..583c126 100644 --- a/benchmarks/interfaces/CameraCallback.java +++ b/benchmarks/interfaces/CameraCallback.java @@ -1,8 +1,5 @@ package iotcode.interfaces; -import java.util.List; -import java.util.ArrayList; - public interface CameraCallback { - public void newCameraFrameAvailable(CameraSmart _camera); + public void newCameraFrameAvailable(byte latestFrame[], long timeStamp); } diff --git a/benchmarks/interfaces/CameraSmartCallback.java b/benchmarks/interfaces/CameraSmartCallback.java index 7febe02..6c584cf 100644 --- a/benchmarks/interfaces/CameraSmartCallback.java +++ b/benchmarks/interfaces/CameraSmartCallback.java @@ -1,9 +1,6 @@ package iotcode.interfaces; -import java.util.List; -import java.util.ArrayList; - public interface CameraSmartCallback { - public void newCameraFrameAvailable(Camera _camera); + public void newCameraFrameAvailable(byte latestFrame[], long timeStamp); } diff --git a/iotjava/iotpolicy/IoTCompiler.java b/iotjava/iotpolicy/IoTCompiler.java index 66287f9..a46a20b 100644 --- a/iotjava/iotpolicy/IoTCompiler.java +++ b/iotjava/iotpolicy/IoTCompiler.java @@ -448,7 +448,7 @@ public class IoTCompiler { println("// Callback properties"); println("private IoTRMIObject rmiObj;"); println("List<" + callbackType + "> listCallbackObj;"); - println("private static int objIdCnt = 0;"); + println("private int objIdCnt = 0;"); // Generate permission stuff for callback stubs DeclarationHandler decHandler = mapIntDeclHand.get(callbackType); InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(callbackType); @@ -1149,7 +1149,7 @@ public class IoTCompiler { println("// Callback properties"); println("private IoTRMIObject rmiObj;"); println("List<" + callbackType + "> listCallbackObj;"); - println("private static int objIdCnt = 0;"); + println("private int objIdCnt = 0;"); // Generate permission stuff for callback stubs DeclarationHandler decHandler = mapIntDeclHand.get(callbackType); InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(callbackType); @@ -1244,7 +1244,7 @@ public class IoTCompiler { println("private String callbackAddress;"); // Callback if (callbackExist) { - println("private static int objIdCnt = 0;"); + println("private int objIdCnt = 0;"); println("private IoTRMICall rmiCall;"); println("private int[] ports;\n"); } @@ -2226,7 +2226,7 @@ public class IoTCompiler { // Callback if (callbackExist) { - println("private static int objIdCnt = 0;"); + println("private int objIdCnt = 0;"); println("private IoTRMICall rmiCall;"); println("private int[] ports;\n"); } diff --git a/iotjava/iotrmi/Java/IoTRMICall.java b/iotjava/iotrmi/Java/IoTRMICall.java index 06753be..1c87221 100644 --- a/iotjava/iotrmi/Java/IoTRMICall.java +++ b/iotjava/iotrmi/Java/IoTRMICall.java @@ -31,7 +31,6 @@ public class IoTRMICall { */ private IoTRMIUtil rmiUtil; private IoTSocketClient rmiClient; - //private List listMethodId; // Map from method ID to signature /** @@ -52,10 +51,8 @@ public class IoTRMICall { // Send method info byte[] methodBytes = methodToBytes(objectId, methodId, paramCls, paramObj); - //System.out.println("Method RMICall: " + Arrays.toString(methodBytes)); try { rmiClient.sendBytes(methodBytes); - //System.out.println("Sent bytes RMICall!!!"); } catch (IOException ex) { ex.printStackTrace(); throw new Error("IoTRMICall: Error when sending bytes - rmiClient.sendBytes()"); diff --git a/iotjava/iotrmi/Java/IoTSocket.java b/iotjava/iotrmi/Java/IoTSocket.java index 66089c9..848a2e9 100644 --- a/iotjava/iotrmi/Java/IoTSocket.java +++ b/iotjava/iotrmi/Java/IoTSocket.java @@ -50,7 +50,7 @@ public abstract class IoTSocket { /** * sendBytes() sends an array of bytes */ - public void sendBytes(byte vals[]) throws IOException + public synchronized void sendBytes(byte vals[]) throws IOException { int len = vals.length; // Write the length first - convert to array of 4 bytes @@ -69,11 +69,12 @@ public abstract class IoTSocket { /** * receiveBytes() receives an array of bytes */ - public byte[] receiveBytes(byte val[]) throws IOException + public synchronized byte[] receiveBytes(byte val[]) throws IOException { int i; int totalbytes = 0; int numbytes; + // Wait until input is available while(input.available() == 0); // Read the maxlen first - read 4 bytes here @@ -104,7 +105,7 @@ public abstract class IoTSocket { /** * Close socket connection */ - public void close() throws IOException + public synchronized void close() throws IOException { sock.close(); } @@ -113,7 +114,7 @@ public abstract class IoTSocket { /** * Send ACK */ - public void sendAck() throws IOException + public synchronized void sendAck() throws IOException { int ack; ack = 0; @@ -125,7 +126,7 @@ public abstract class IoTSocket { /** * Receive ACK */ - public void receiveAck() throws IOException + public synchronized void receiveAck() throws IOException { int ack; ack = (int) input.read(); diff --git a/iotjava/iotruntime/master/CommunicationHandler.java b/iotjava/iotruntime/master/CommunicationHandler.java index db6b161..6f9c67a 100644 --- a/iotjava/iotruntime/master/CommunicationHandler.java +++ b/iotjava/iotruntime/master/CommunicationHandler.java @@ -479,13 +479,16 @@ public final class CommunicationHandler { RuntimeOutput.print("Communication Port: " + hmComPort.get(iIndex), bVerbose); RuntimeOutput.print("RMI Registry Port: " + hmRMIRegPort.get(iIndex), bVerbose); RuntimeOutput.print("RMI Stub Port: " + hmRMIStubPort.get(iIndex), bVerbose); + RuntimeOutput.print("\n", bVerbose); } } + for(Integer i : hsCallbackPort) + RuntimeOutput.print("RMI callback Port: " + i, bVerbose); + RuntimeOutput.print("\n", bVerbose); for(int iPort : hsDevicePort) { - RuntimeOutput.print("Device Port: " + iPort, bVerbose); - } + RuntimeOutput.print("\n", bVerbose); } } diff --git a/iotjava/iotruntime/master/IoTMaster.java b/iotjava/iotruntime/master/IoTMaster.java index 7b86afc..34f181a 100644 --- a/iotjava/iotruntime/master/IoTMaster.java +++ b/iotjava/iotruntime/master/IoTMaster.java @@ -553,6 +553,7 @@ public class IoTMaster { int iNumCallbackPorts = Integer.parseInt(STR_NUM_CALLBACK_PORTS); Integer[] rmiCallbackPorts = commHan.getCallbackPorts(strObjName, iNumCallbackPorts); + // Iterate over port numbers and set up policies for (int i=0; i mapObjNameStub; /** * IoTSet object, e.g. IoTSet proximity_sensors; @@ -122,6 +123,7 @@ public class IoTSlave { socket = null; outStream = null; inStream = null; + mapObjNameStub = new HashMap(); STR_JAR_FILE_PATH = null; STR_OBJ_CLS_PFX = null; @@ -433,30 +435,37 @@ public class IoTSlave { // Translating into the actual Message class MessageGetObject sMessage = (MessageGetObject) sIoTMasterMsg; - // Instantiate the stub and put in the object - String strObjStubName = sMainObjectName + "." + sMessage.getObjectStubInterfaceName() + STUB_CLASS_SUFFIX; - RuntimeOutput.print("IoTSlave: Stub object: " + strObjStubName, BOOL_VERBOSE); - Class clsStub = Class.forName(strObjStubName); // Port number is integer - Class[] clsStubParams = { int.class, String.class, String.class, int.class, int[].class }; - Constructor objStubCons = clsStub.getDeclaredConstructor(clsStubParams); - Integer[] portsInteger = sMessage.getRMICallbackPorts(); - int[] ports = Arrays.stream(portsInteger).mapToInt(Integer::intValue).toArray(); - int rev = 0; - String callbackAddress = InetAddress.getLocalHost().getHostAddress(); // Callback address is this machine's address - Object objStubParams[] = { sMessage.getRMIStubPort(), sMessage.getHostAddress(), callbackAddress, - rev, ports }; - RuntimeOutput.print("IoTSlave: Creating RMI stub: " + - sMessage.getHostAddress() + ":" + sMessage.getRMIRegPort() + - " with callback address: " + callbackAddress + " and RMI stub port: " + sMessage.getRMIStubPort(), BOOL_VERBOSE); - Object stubObj = objStubCons.newInstance(objStubParams); - RuntimeOutput.print("IoTSlave: Object name: " + sMessage.getObjectName(), BOOL_VERBOSE); - RuntimeOutput.print("IoTSlave: Stub address: " + callbackAddress, BOOL_VERBOSE); - // Class conversion to interface class of this class, - // e.g. ProximitySensorImpl has ProximitySensor interface + Object stubObjConv = null; + String strObjectName = sMessage.getObjectName(); String strObjClassInterfaceName = STR_OBJ_CLS_PFX + "." + STR_INTERFACE_PFX + "." + sMessage.getObjectStubInterfaceName(); Class clsInf = Class.forName(strObjClassInterfaceName); - Object stubObjConv = clsInf.cast(stubObj); + if (mapObjNameStub.containsKey(strObjectName)) { + RuntimeOutput.print("IoTSlave: Getting back object on slave: " + strObjectName, BOOL_VERBOSE); + stubObjConv = clsInf.cast(mapObjNameStub.get(strObjectName)); + } else { + // Instantiate the stub and put in the object + String strObjStubName = sMainObjectName + "." + sMessage.getObjectStubInterfaceName() + STUB_CLASS_SUFFIX; + Class clsStub = Class.forName(strObjStubName); // Port number is integer + Class[] clsStubParams = { int.class, String.class, String.class, int.class, int[].class }; + Constructor objStubCons = clsStub.getDeclaredConstructor(clsStubParams); + Integer[] portsInteger = sMessage.getRMICallbackPorts(); + int[] ports = Arrays.stream(portsInteger).mapToInt(Integer::intValue).toArray(); + + int rev = 0; + String callbackAddress = InetAddress.getLocalHost().getHostAddress(); // Callback address is this machine's address + Object objStubParams[] = { sMessage.getRMIStubPort(), sMessage.getHostAddress(), callbackAddress, + rev, ports }; + RuntimeOutput.print("IoTSlave: Creating RMI stub: " + + sMessage.getHostAddress() + ":" + sMessage.getRMIRegPort() + + " with callback address: " + callbackAddress + " and RMI stub port: " + sMessage.getRMIStubPort(), BOOL_VERBOSE); + Object stubObj = objStubCons.newInstance(objStubParams); + // Class conversion to interface class of this class, + // e.g. ProximitySensorImpl has ProximitySensor interface + RuntimeOutput.print("IoTSlave: Registering new stub object: " + strObjectName, BOOL_VERBOSE); + mapObjNameStub.put(strObjectName, stubObj); + stubObjConv = clsInf.cast(stubObj); + } return stubObjConv; } diff --git a/localconfig/iotpolicy/AmcrestCamera/motiondetection.pol b/localconfig/iotpolicy/AmcrestCamera/motiondetection.pol index 95ace6f..b60fa0b 100644 --- a/localconfig/iotpolicy/AmcrestCamera/motiondetection.pol +++ b/localconfig/iotpolicy/AmcrestCamera/motiondetection.pol @@ -1,10 +1,10 @@ public interface CameraCallback { - public void newCameraFrameAvailable(Camera _camera); + public void newCameraFrameAvailable(byte latestFrame[], long timeStamp); capability Callback { description = "Callback method"; - method = "newCameraFrameAvailable(Camera _camera)"; + method = "newCameraFrameAvailable(byte latestFrame[], long timeStamp)"; } } diff --git a/localconfig/iotruntime/IoTMaster.config b/localconfig/iotruntime/IoTMaster.config index da858cc..d98aa4d 100644 --- a/localconfig/iotruntime/IoTMaster.config +++ b/localconfig/iotruntime/IoTMaster.config @@ -28,5 +28,5 @@ ZIGBEE_IOTMASTER_PORT=12345 VERBOSE=Yes #Number of callback ports -NUMBER_CALLBACK_PORTS=4 +NUMBER_CALLBACK_PORTS=1