X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=benchmarks%2FJava%2FHomeSecurityController%2FHomeSecurityController.java;h=c146c6f61e4190cae0ea02309672f256f19972ef;hb=1f03a0ea82bcc8ad278e89c478fbf59c1185251b;hp=c87eece67a8d9a9801119732da51f3e2a08820e0;hpb=4c116198a80b62ddc11720ef80daa99850facaee;p=iot2.git diff --git a/benchmarks/Java/HomeSecurityController/HomeSecurityController.java b/benchmarks/Java/HomeSecurityController/HomeSecurityController.java index c87eece..c146c6f 100644 --- a/benchmarks/Java/HomeSecurityController/HomeSecurityController.java +++ b/benchmarks/Java/HomeSecurityController/HomeSecurityController.java @@ -20,13 +20,14 @@ import java.rmi.server.UnicastRemoteObject; // IoT Runtime Packages import iotruntime.slave.IoTSet; import iotruntime.slave.IoTRelation; +import iotruntime.slave.IoTAddress; import iotcode.annotation.*; // IoT Driver Packages import iotcode.interfaces.*; -// Checker annotations -//import iotchecker.qual.*; +// IoT Cloud +import iotcloud.*; /** Class Home Security Controller for the home security application benchmark * @@ -46,7 +47,12 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt private static final int SECOND_TO_TURN_OFF = 1; // in seconds private static final int LOCK_DOOR = 0; private static final int UNLOCK_DOOR = 1; - + // For IoTCloud + private static final String BASE_URL = "http://dc-6.calit2.uci.edu/test.iotcloud/"; + private static final String PASSWORD = "reallysecret"; + private static final int LOCAL_MACHINE_ID = 399; + private static final int LISTENING_PORT = -1; // We don't use any listening port for this application + /** * IoT Sets and Relations *

@@ -64,6 +70,8 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt @config private IoTSet alarmSet; @config private IoTSet roomSet; @config private IoTSet doorlockSet; + // Set of addresses for Fidelius connection (dc-6.calit2.uci.edu) to give access + @config private IoTSet iotcloudServer; @config private IoTRelation roomSensorRelation; @config private IoTRelation roomCameraRelation; @@ -78,6 +86,10 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt private static int sensorId = 0; private static int doorlockId = 0; + // Initialize values 1 and 0 (for active and not active) + private final IoTString ACTIVE = new IoTString("1"); // ACTIVE can mean detecting or being locked for doorlock + private final IoTString NOT_ACTIVE = new IoTString("0"); // NOT_ACTIVE can mean not detecting or being unlocked for doorlock + private Table t1 = null; /******************************************************************************************************************************************* ** @@ -92,10 +104,10 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt new ConcurrentHashMap(); // Camera (true = motion) private Map camDetectStatus = - new HashMap(); + new ConcurrentHashMap(); // Doorlock (true = locked) private Map doorlockStatus = - new HashMap(); + new ConcurrentHashMap(); // Alarm status private Map alarmStatus = @@ -112,6 +124,116 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt ** *******************************************************************************************************************************************/ + /** Method to initialize IoTCloud server (dc-6.calit2.uci.edu) + * + * @return [void] None. + */ + private void initIoTCloudServer() { + + try { + System.out.println("DEBUG: Initialize IoTCloud table!"); + // Get and init the IoTCloud server address + // Setup table + t1 = new Table(BASE_URL, PASSWORD, LOCAL_MACHINE_ID, LISTENING_PORT); + t1.initTable(); + // Setup is done somewhere else, we just do rebuild() + //t1.rebuild(); + System.out.println("DEBUG: Table initialized!"); + // Initialize sensors! + // TODO: Still deciding whether to initialize all devices here or inside each init method + int id = 0; + // Initialize alarms! One alarm for now + for(AlarmSmart alarm : alarmSet.values()) { + createKeyIoTCloud("alarm", NOT_ACTIVE); + System.out.println("DEBUG: Setting alarm to NOT-ACTIVE!"); + } + // TODO: Just use alarm for now as a status to cloud + /*for(SmartthingsSensorSmart smartSensor : smartSensorsSet.values()) { + + createKeyIoTCloud("sensor" + Integer.toString(id++), NOT_ACTIVE); + System.out.println("DEBUG: Setting sensor" + id + " to NOT-ACTIVE!"); + } + // Initialize cameras! One camera for now... + for(CameraSmart cam : camSet.values()) { + createKeyIoTCloud("camera", NOT_ACTIVE); + System.out.println("DEBUG: Setting camera to NOT-ACTIVE!"); + } + int doorId = 0; + for(SmartthingsActuatorSmart doorlock : doorlockSet.values()) { + createKeyIoTCloud("doorlock" + Integer.toString(doorId), NOT_ACTIVE); + System.out.println("DEBUG: Setting doorlock" + id + " to NOT-ACTIVE!"); + }*/ + + } catch(Exception e) { + e.printStackTrace(); + } + System.out.println("DEBUG: Cloud server transactions committed successfully!"); + } + + /** Method to create key IoTCloud + * + * @param key [String] , encrypted key. + * @param val [IoTString] , encrypted value. + * + * @return [void] None. + */ + private void createKeyIoTCloud(String key, IoTString val) { + + try { + IoTString iotKey = new IoTString(key); + t1.update(); + t1.createNewKey(iotKey, LOCAL_MACHINE_ID); + t1.startTransaction(); + t1.addKV(iotKey, val); + t1.commitTransaction(); + t1.update(); + System.out.println("DEBUG: Successfully committed transaction for: " + key); + } catch(Exception e) { + e.printStackTrace(); + } + } + + /** Method to update IoTCloud + * + * @param key [String] , encrypted key. + * @param val [IoTString] , encrypted value. + * + * @return [void] None. + */ + private void updateIoTCloud(String key, IoTString val) { + + try { + IoTString iotKey = new IoTString(key); + t1.update(); + t1.startTransaction(); + t1.addKV(iotKey, val); + t1.commitTransaction(); + t1.update(); + System.out.println("DEBUG: Successfully committed transaction for: " + key); + } catch(Exception e) { + e.printStackTrace(); + } + } + + /** Method to read IoTCloud + * + * @param key [String] , encrypted key. + * @param val [IoTString] , encrypted value. + * + * @return [boolean] Check if it is ACTIVE or NOT_ACTIVE (true or false). + */ + private boolean readIoTCloud(String key, IoTString iotTestVal) { + + t1.update(); + IoTString iotKey = new IoTString(key); + IoTString iotVal = t1.getCommitted(iotKey); + + // Matching value and test value + if ((iotVal != null) && (iotVal.equals(iotTestVal) == true)) + return true; + // Mismatch between value and test value + return false; + } /** Method to initialize Smartthings sensors * @@ -130,6 +252,9 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt System.out.println("DEBUG: Initialized smartthings sensor! ID: " + sensorId + " Room ID: " + rm.getRoomID()); senDetectStatus.put(sensorId, false); System.out.println("DEBUG: Initialized sensor detection to false!"); + // Initialize IoTCloud +// createKeyIoTCloud("sensor" + Integer.toString(sensorId), NOT_ACTIVE); +// System.out.println("DEBUG: Setting sensor" + sensorId + " to NOT-ACTIVE!"); sen.setId(sensorId++); sen.registerCallback(this); System.out.println("DEBUG: Registered sensor callback!"); @@ -144,12 +269,10 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt * * @return [void] None. */ - private void initCameras(RoomSmart rm) { + private void initCameras() { - // Get and init the IAS sensors for this specific room - HashSet cameras = roomCameraRelation.get(rm); // Setup the cameras, start them all and assign each one a motion detector - for (CameraSmart cam : cameras) { + for (CameraSmart cam : camSet.values()) { // Each camera will have a motion detector unique to it since the motion detection has state MotionDetection mo = new MotionDetection(12, 0.5f, 10, 10); @@ -173,6 +296,10 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt // Initialize detection to false camDetectStatus.put(cam, false); + + // Initialize IoTCloud +// createKeyIoTCloud("camera", NOT_ACTIVE); +// System.out.println("DEBUG: Setting camera to NOT-ACTIVE!"); } } @@ -186,7 +313,10 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt // Get and init the alarm (this single alarm set can serve multiple zones / rooms) Iterator alarmIt = alarmSet.iterator(); AlarmSmart alm = (AlarmSmart) alarmIt.next(); - // init the alarm controller, do it here since it only needs to be done once per controller + // Initialize IoTCloud - only 1 alarm +// createKeyIoTCloud("alarm", NOT_ACTIVE); +// System.out.println("DEBUG: Setting alarm to NOT-ACTIVE!"); + // Initialize the alarm controller, do it here since it only needs to be done once per controller try { alm.init(); System.out.println("DEBUG: Initialized alarm!"); @@ -217,6 +347,9 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt System.out.println("DEBUG: Initialized doorlock! ID: " + doorlockId); doorlockStatus.put(doorlockId, false); System.out.println("DEBUG: Initialized doorlock status to false!"); + // Initialize IoTCloud +// createKeyIoTCloud("doorlock" + Integer.toString(doorlockId), NOT_ACTIVE); +// System.out.println("DEBUG: Setting doorlock to NOT-ACTIVE!"); doorlock.setId(doorlockId++); doorlock.registerCallback(this); System.out.println("DEBUG: Registered doorlock callback!"); @@ -271,14 +404,17 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt public void newReadingAvailable(int _sensorId, int _value, boolean _activeValue) { System.out.println("DEBUG: Sensor reading value: " + _value); + + String sensor = "sensor" + Integer.toString(_sensorId); if(_activeValue) { - System.out.println("DEBUG: Sensor is detecting something: " + _activeValue); + System.out.println("DEBUG: Sensor " + sensorId + " is detecting something: " + _activeValue); senDetectStatus.put(_sensorId, true); - + //updateIoTCloud(sensor, ACTIVE); } else { - //System.out.println("DEBUG: Sensor is not detecting something: " + _activeValue); + //System.out.println("DEBUG: Sensor " + sensorId + " is not detecting something: " + _activeValue); senDetectStatus.put(_sensorId, false); - } + //updateIoTCloud(sensor, NOT_ACTIVE); + } } /** Method to update state data structures for Smartthings actuators @@ -287,15 +423,19 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt */ public void newActuatorReadingAvailable(int _sensorId, int _value, boolean _activeValue) { - System.out.println("DEBUG: Actuator reading value: " + _value); + System.out.println("DEBUG: Actuator " + _sensorId + " reading value: " + _value); + + // Update IoTCloud + String actuator = "doorlock" + Integer.toString(_sensorId); if(_activeValue) { - System.out.println("DEBUG: Actuator is detecting something: " + _activeValue); + System.out.println("DEBUG: Actuator " + _sensorId + " is detecting something: " + _activeValue); doorlockStatus.put(_sensorId, true); - + //updateIoTCloud(actuator, ACTIVE); } else { - //System.out.println("DEBUG: Sensor is not detecting something: " + _activeValue); + //System.out.println("DEBUG: Actuator " + _sensorId + " is not detecting something: " + _activeValue); doorlockStatus.put(_sensorId, false); - } + //updateIoTCloud(actuator, NOT_ACTIVE); + } } @@ -328,14 +468,18 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt // Motion was detected System.out.println("DEBUG: Camera detected something!"); - for(CameraSmart cam : cameras) + for(CameraSmart cam : cameras) { camDetectStatus.put(cam, true); + //updateIoTCloud("camera", ACTIVE); + } } else { // No motion was detected //System.out.println("DEBUG: Camera didn't detect anything!"); - for(CameraSmart cam : cameras) + for(CameraSmart cam : cameras) { camDetectStatus.put(cam, false); + //updateIoTCloud("camera", NOT_ACTIVE); + } } } @@ -349,6 +493,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt Iterator alarmIt = alarmSet.iterator(); AlarmSmart alm = (AlarmSmart) alarmIt.next(); alm.setZone(zoneId, true, SECOND_TO_TURN_OFF); + updateIoTCloud("alarm", ACTIVE); } @@ -363,6 +508,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt AlarmSmart alm = (AlarmSmart) alarmIt.next(); // Turn this alarm off indefinitely alm.setZone(zoneId, false, SECOND_TO_TURN_ON); + updateIoTCloud("alarm", NOT_ACTIVE); } @@ -377,7 +523,10 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt for (SmartthingsActuatorSmart doorlock : doorlocks) { doorlock.actuate(LOCK_DOOR); - System.out.println("DEBUG: Lock doorlock! ID: " + doorlock.getId()); + int doorId = doorlock.getId(); + System.out.println("DEBUG: Lock doorlock! ID: " + doorId); + doorlockStatus.put(doorId, true); + //updateIoTCloud("doorlock" + doorId, ACTIVE); } } @@ -406,6 +555,17 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt turnOnAlarms(zoneId); System.out.println("DETECTION: Camera active in room: " + zoneId); lockDoors(); + while(readIoTCloud("alarm", ACTIVE)) { + System.out.println("DETECTION: Now alarm is on so wait here until turned off!"); + try { + Thread.sleep(5000); // sleep for a tenth of the time + } catch (Exception e) { + e.printStackTrace(); + } + } // Wait until turned off! + System.out.println("DETECTION: Now alarm is turned off!"); + cleanUp(); + return; } } @@ -420,61 +580,50 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt System.out.println("DETECTION: Sensor active in room: " + zoneId); System.out.println("DETECTION: Detection by sensor: " + sensor.getId()); lockDoors(); + while(readIoTCloud("alarm", ACTIVE)) { + System.out.println("DETECTION: Now alarm is on so wait here until turned off!"); + try { + Thread.sleep(5000); // sleep for a tenth of the time + } catch (Exception e) { + e.printStackTrace(); + } + } // Wait until turned off! + System.out.println("DETECTION: Now alarm is turned off!"); + cleanUp(); + return; } } } } - /** Check status of devices and turn off alarm accordingly + /** Clean up all status booleans *

- * If everything (camera and sensors) is set back to normal - * then the system will turn off the alarm * * @return [void] None. */ - // TODO: Need to fix this part later - // TODO: Perhaps we should use a phone app to turn off the alarm - /*private void decideToTurnOffAlarm() { + private void cleanUp() { - // Check for motion in rooms and if there is motion then report + // Clear sensor status + for (Boolean senStatus : senDetectStatus.values()) { + senStatus = false; + } + // Clear camera status + for (Boolean camStatus : camDetectStatus.values()) { + camStatus = false; + } + // Clear doorlock status + for (Boolean doorStatus : doorlockStatus.values()) { + doorStatus = false; + } + // Clear alarm status + updateIoTCloud("alarm", NOT_ACTIVE); + // Turn off alaarms for (RoomSmart room : roomSet.values()) { - int zoneId = room.getRoomID(); - // Loop through all the cameras in the room - for (CameraSmart cam : roomCameraRelation.get(room)) { - - // Get the right camera and the right detection status (true or false) - if (camDetectStatus.get(cam)) // Camera still active so alarm is still on, so false for off-alarm status - - alarmStatus.put(zoneId, false); - - else - - alarmStatus.put(zoneId, true); - - } - - // Loop through all the cameras in the room - for (SmartthingsSensor sensor : roomSensorRelation.get(room)) { - - // Get the right sensor and the right detection status (true or false) - if (senDetectStatus.get(sensor.getId())) // Sensor still active so alarm is still on, so false for off-alarm status - - alarmStatus.put(zoneId, false); - - else - - alarmStatus.put(zoneId, true); - } - } - - // Turn on alarm in the right zone - for (Map.Entry alEnt : alarmStatus.entrySet()) { - if (alEnt.getValue()) // if this zone is true, that means we need to turn off its alarm - turnOffAlarms(alEnt.getKey()); + turnOffAlarms(zoneId); } - }*/ + } /******************************************************************************************************************************************* @@ -490,23 +639,30 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt */ public void init() { + // Initialize IoTCloud server + initIoTCloudServer(); + // Iterate over the set of rooms for (RoomSmart rm : roomSet.values()) { // Init all Smartthings sensors initSmartthingsSensors(rm); - - // Init all cameras - initCameras(rm); - - // Init all doorlocks - initDoorLocks(); + //try { + // Thread.sleep(5000); + //} catch (Exception e) { + // e.printStackTrace(); + //} } + // Init all doorlocks + initDoorLocks(); // Init all alarms initAlarms(); + // Init all cameras + initCameras(); + System.out.println("DEBUG: Initialized all devices! Now starting detection loop!"); // Run the main loop that will keep checking the sensors and cameras periodically @@ -523,9 +679,6 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt // Decide to turn on alarm if any of the sensor/camera detects something unusual decideToTurnOnAlarm(); - // Decide to turn off alarm if every sensor/camera goes back to normal - //decideToTurnOffAlarm(); - } else { try {