From b7795a76d57478a23ee40dd8717b005e18891ca1 Mon Sep 17 00:00:00 2001 From: rtrimana Date: Wed, 29 Nov 2017 13:22:29 -0800 Subject: [PATCH] Integrating D-Link alarm into Home Security benchmark --- .../HomeSecurityController.java | 6 ++--- .../drivers/Java/DlinkAlarm/DlinkAlarm.java | 21 ------------------ iotjava/iotruntime/master/IoTMaster.java | 2 +- .../iotruntime/master/ProcessJailConfig.java | 10 ++++++--- localconfig/mysql/alarmSet.config | 2 ++ localconfig/mysql/alm_Addresses.config | 2 +- localconfig/mysql/camSet.config | 2 ++ localconfig/mysql/cameraSet.config | 2 +- others/Mysql/IoTMain.gz | Bin 5467 -> 5768 bytes 9 files changed, 17 insertions(+), 30 deletions(-) diff --git a/benchmarks/Java/HomeSecurityController/HomeSecurityController.java b/benchmarks/Java/HomeSecurityController/HomeSecurityController.java index 3b7cf53..09c0527 100644 --- a/benchmarks/Java/HomeSecurityController/HomeSecurityController.java +++ b/benchmarks/Java/HomeSecurityController/HomeSecurityController.java @@ -43,7 +43,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt private static final int MOTION_TIME_THRESHOLD = 60; // in seconds private static final int CAMERA_FPS = 15; private static final int CHECK_TIME_WAIT = 1; // in seconds - private static final int SECOND_TO_TURN_ON = 60; // in seconds + private static final int SECOND_TO_TURN_ON = -1; // in seconds 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; @@ -477,7 +477,7 @@ 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(); - alm.setZone(zoneId, true, SECOND_TO_TURN_OFF); + alm.setZone(zoneId, true, SECOND_TO_TURN_ON); updateIoTCloud("alarm", ACTIVE); } @@ -492,7 +492,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback, Smartt Iterator alarmIt = alarmSet.iterator(); AlarmSmart alm = (AlarmSmart) alarmIt.next(); // Turn this alarm off indefinitely - alm.setZone(zoneId, false, SECOND_TO_TURN_ON); + alm.setZone(zoneId, false, SECOND_TO_TURN_OFF); updateIoTCloud("alarm", NOT_ACTIVE); } diff --git a/benchmarks/drivers/Java/DlinkAlarm/DlinkAlarm.java b/benchmarks/drivers/Java/DlinkAlarm/DlinkAlarm.java index 6b0ee18..e19b375 100644 --- a/benchmarks/drivers/Java/DlinkAlarm/DlinkAlarm.java +++ b/benchmarks/drivers/Java/DlinkAlarm/DlinkAlarm.java @@ -454,27 +454,6 @@ public class DlinkAlarm implements Alarm { // Return time since January 1, 1970 00:00:00 UTC in seconds return System.currentTimeMillis()/1000; } - - /*public static void main(String[] args) throws Exception { - - String ipAddress = "192.168.1.183"; - String devicePin = "215530"; - IoTDeviceAddress iotAddress = new IoTDeviceAddress(ipAddress, 12345, 80, false, false); - Set setAddress = new HashSet(); - setAddress.add(iotAddress); - IoTSet iotSetAddress = new IoTSet(setAddress); - - DlinkAlarm alarm = new DlinkAlarm(iotSetAddress, devicePin); - alarm.init(); - // Set alarm - alarm.setZone(0, true, -1); - // Set alarm - alarm.setZone(0, false, 0); - // Set alarm - alarm.setZone(0, true, -1); - // Set alarm - alarm.setZone(0, false, 0); - }*/ } diff --git a/iotjava/iotruntime/master/IoTMaster.java b/iotjava/iotruntime/master/IoTMaster.java index 7dc41d7..3ce672d 100644 --- a/iotjava/iotruntime/master/IoTMaster.java +++ b/iotjava/iotruntime/master/IoTMaster.java @@ -740,7 +740,7 @@ public final class IoTMaster { routerConfig.configureHostHTTPPolicies(strIoTSlaveObjectHostAdd, strIoTSlaveObjectHostAdd, strDeviceAddress); // Configure MAC policies if (STR_ACTIVATE_SANDBOXING.equals("Yes")) - processJailConfig.configureProcessJailGWDevicePolicies(strIoTSlaveObjectHostAdd, STR_ROUTER_ADD, INT_DNS_PORT); + processJailConfig.configureProcessJailGWDevicePolicies(strIoTSlaveObjectHostAdd, STR_ROUTER_ADD, strDeviceAddress, INT_DNS_PORT); } else { // Other port numbers... commHan.addDevicePort(iDestDeviceDriverPort); diff --git a/iotjava/iotruntime/master/ProcessJailConfig.java b/iotjava/iotruntime/master/ProcessJailConfig.java index 757313a..e19ee15 100644 --- a/iotjava/iotruntime/master/ProcessJailConfig.java +++ b/iotjava/iotruntime/master/ProcessJailConfig.java @@ -46,6 +46,9 @@ public final class ProcessJailConfig { private static final String STR_DEV_IP_ADDRESS = ""; private static final String STR_DEV_COM_PORT = ""; private static final String STR_DEV_PORT = ""; + + private static final int INT_HTTP_PORT = 80; + private static final int INT_DNS_PORT = 53; /** @@ -326,12 +329,13 @@ public final class ProcessJailConfig { * @param iPort Integer port * @return void */ - public void configureProcessJailGWDevicePolicies(String strConfigHost, String strRouterAddress, int iPort) { + public void configureProcessJailGWDevicePolicies(String strConfigHost, String strRouterAddress, String strDeviceIPAddress, int iPort) { PrintWriter pwConfig = getPrintWriter(strConfigHost); pwConfig.println("file read /home/iotuser/iot2/iotjava/iotruntime/\\*.jks"); pwConfig.println("file read /etc/resolv.conf"); pwConfig.println("file read /etc/hosts"); + pwConfig.println("network inet stream connect ::ffff:" + strDeviceIPAddress + " " + String.valueOf(INT_HTTP_PORT)); // HTTP access for this address pwConfig.println("network inet dgram send " + strRouterAddress + " " + String.valueOf(iPort)); } @@ -351,8 +355,8 @@ public final class ProcessJailConfig { pwConfig.println("file read /etc/resolv.conf"); pwConfig.println("file read /etc/hosts"); pwConfig.println("file read /etc/host.conf"); - pwConfig.println("network inet dgram send " + strRouterAddress + " " + String.valueOf(53)); // TCP/UDP access through router - pwConfig.println("network inet stream connect ::ffff:" + strAddress + " " + String.valueOf(80)); // HTTP access for this address + pwConfig.println("network inet dgram send " + strRouterAddress + " " + String.valueOf(INT_DNS_PORT)); // TCP/UDP access through router + pwConfig.println("network inet stream connect ::ffff:" + strAddress + " " + String.valueOf(INT_HTTP_PORT)); // HTTP access for this address } diff --git a/localconfig/mysql/alarmSet.config b/localconfig/mysql/alarmSet.config index 40e745a..c1d125a 100644 --- a/localconfig/mysql/alarmSet.config +++ b/localconfig/mysql/alarmSet.config @@ -1,3 +1,5 @@ SELECT * FROM AlarmSmart +WHERE +ID='AL2' ; diff --git a/localconfig/mysql/alm_Addresses.config b/localconfig/mysql/alm_Addresses.config index 2564492..8ab9893 100644 --- a/localconfig/mysql/alm_Addresses.config +++ b/localconfig/mysql/alm_Addresses.config @@ -1,5 +1,5 @@ SELECT * FROM IoTDeviceAddress WHERE -TYPE='EspAlarmAdd' +TYPE='DlinkAlarmAdd' ; diff --git a/localconfig/mysql/camSet.config b/localconfig/mysql/camSet.config index 083ca82..9b21ecd 100644 --- a/localconfig/mysql/camSet.config +++ b/localconfig/mysql/camSet.config @@ -1,3 +1,5 @@ SELECT * FROM CameraSmart +WHERE +ID='CM4' ; diff --git a/localconfig/mysql/cameraSet.config b/localconfig/mysql/cameraSet.config index a061abc..4233b23 100644 --- a/localconfig/mysql/cameraSet.config +++ b/localconfig/mysql/cameraSet.config @@ -1,5 +1,5 @@ SELECT * FROM CameraSmart WHERE -ID='CM1' +ID='CM3' ; diff --git a/others/Mysql/IoTMain.gz b/others/Mysql/IoTMain.gz index 5f0d373d72f168a9c27649db482df5e1895613da..123e17bec1456172b01cfc21ba41ca320fca69ae 100644 GIT binary patch literal 5768 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 RItc#0`G1)xjVg@^0RXC0m$U!? -- 2.34.1