From d28a92f9fbbc5c91289946cb80fff2db5c9f05be Mon Sep 17 00:00:00 2001 From: Janus Varmarken Date: Fri, 18 Jan 2019 21:16:53 -0800 Subject: [PATCH] Add script that executes layer2 detection on all smarthome traces (traces where one device is active, and the remaining devices are powered on, but idle) --- Code/Projects/SmartPlugDetector/build.gradle | 4 +- .../execute_layer2_detection_all.sh | 232 ++++++++++++++++++ .../layer2/Layer2SignatureDetector.java | 70 +++++- .../evaluation/DetectionResultsAnalyzer.java | 4 + 4 files changed, 303 insertions(+), 7 deletions(-) create mode 100755 Code/Projects/SmartPlugDetector/execute_layer2_detection_all.sh diff --git a/Code/Projects/SmartPlugDetector/build.gradle b/Code/Projects/SmartPlugDetector/build.gradle index bae10e9..f663749 100644 --- a/Code/Projects/SmartPlugDetector/build.gradle +++ b/Code/Projects/SmartPlugDetector/build.gradle @@ -10,7 +10,9 @@ applicationDefaultJvmArgs = ["-Xmx300g"] sourceCompatibility = 1.8 //mainClassName = "edu.uci.iotproject.Main" -mainClassName = "edu.uci.iotproject.detection.SignatureDetector" +//mainClassName = "edu.uci.iotproject.detection.SignatureDetector" +mainClassName = "edu.uci.iotproject.detection.layer2.Layer2SignatureDetector" +//mainClassName = "edu.uci.iotproject.evaluation.DetectionResultsAnalyzer" repositories { diff --git a/Code/Projects/SmartPlugDetector/execute_layer2_detection_all.sh b/Code/Projects/SmartPlugDetector/execute_layer2_detection_all.sh new file mode 100755 index 0000000..3e2f23c --- /dev/null +++ b/Code/Projects/SmartPlugDetector/execute_layer2_detection_all.sh @@ -0,0 +1,232 @@ +#!/bin/bash +# Base dir should point to the experimental_result folder which contains the subfolders: +# - 'smarthome' which contains the traces collected while other devices are idle +# - 'standalone' which contains signatures and the traces used to generate the signatures. +BASE_DIR=$1 +readonly BASE_DIR + +OUTPUT_DIR=$2 +readonly OUTPUT_DIR + +PCAPS_BASE_DIR="$BASE_DIR/smarthome" +readonly PCAPS_BASE_DIR + +SIGNATURES_BASE_DIR="$BASE_DIR/standalone" +readonly SIGNATURES_BASE_DIR + +# ==================================================== ARLO CAMERA ===================================================== +PCAP_FILE="$PCAPS_BASE_DIR/arlo-camera/wlan1/arlo-camera.wlan1.detection.pcap" + +# Has no device side signature. + +# PHONE SIDE (TODO: may possibly be the .incomplete signatures) +ON_SIGNATURE="$SIGNATURES_BASE_DIR/arlo-camera/signatures/arlo-camera-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/arlo-camera/signatures/arlo-camera-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/arlo-camera/arlo-camera.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ================================================= BLOSSOM SPRINKLER ================================================== +PCAP_FILE="$PCAPS_BASE_DIR/blossom-sprinkler/wlan1/blossom-sprinkler.wlan1.detection.pcap" + +# DEVICE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/blossom-sprinkler/signatures/blossom-sprinkler-onSignature-device-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/blossom-sprinkler/signatures/blossom-sprinkler-offSignature-device-side.sig" +RESULTS_FILE="$OUTPUT_DIR/blossom-sprinkler/blossom-sprinkler.wlan1.detection.pcap___device-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/blossom-sprinkler/signatures/blossom-sprinkler-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/blossom-sprinkler/signatures/blossom-sprinkler-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/blossom-sprinkler/blossom-sprinkler.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ==================================================== D-LINK PLUG ===================================================== +PCAP_FILE="$PCAPS_BASE_DIR/dlink-plug/wlan1/dlink-plug.wlan1.detection.pcap" + +# DEVICE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/dlink-plug/signatures/dlink-plug-onSignature-device-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/dlink-plug/signatures/dlink-plug-offSignature-device-side.sig" +RESULTS_FILE="$OUTPUT_DIR/dlink-plug/dlink-plug.wlan1.detection.pcap___device-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/dlink-plug/signatures/dlink-plug-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/dlink-plug/signatures/dlink-plug-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/dlink-plug/dlink-plug.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ==================================================== D-LINK SIREN ==================================================== +PCAP_FILE="$PCAPS_BASE_DIR/dlink-siren/wlan1/dlink-siren.wlan1.detection.pcap" + +# DEVICE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/dlink-siren/signatures/dlink-siren-onSignature-device-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/dlink-siren/signatures/dlink-siren-offSignature-device-side.sig" +RESULTS_FILE="$OUTPUT_DIR/dlink-siren/dlink-siren.wlan1.detection.pcap___device-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/dlink-siren/signatures/dlink-siren-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/dlink-siren/signatures/dlink-siren-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/dlink-siren/dlink-siren.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ===================================================== HUE BULB ======================================================= +PCAP_FILE="$PCAPS_BASE_DIR/hue-bulb/wlan1/hue-bulb.wlan1.detection.pcap" + +# Has no device side signature. + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/hue-bulb/signatures/hue-bulb-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/hue-bulb/signatures/hue-bulb-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/hue-bulb/hue-bulb.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ================================================= KWIKSET DOORLOCK =================================================== +PCAP_FILE="$PCAPS_BASE_DIR/kwikset-doorlock/wlan1/kwikset-doorlock.wlan1.detection.pcap" + +# Has no device side signature. + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/kwikset-doorlock/signatures/kwikset-doorlock-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/kwikset-doorlock/signatures/kwikset-doorlock-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/kwikset-doorlock/kwikset-doorlock.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ================================================= NEST THERMOSTAT ==================================================== +PCAP_FILE="$PCAPS_BASE_DIR/nest-thermostat/wlan1/nest-thermostat.wlan1.detection.pcap" + +# Has no device side signature. + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/nest-thermostat/signatures/nest-thermostat-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/nest-thermostat/signatures/nest-thermostat-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/nest-thermostat/nest-thermostat.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ====================================================== ST PLUG ======================================================= +PCAP_FILE="$PCAPS_BASE_DIR/st-plug/wlan1/st-plug.wlan1.detection.pcap" + +# Has no device side signature. + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/st-plug/signatures/st-plug-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/st-plug/signatures/st-plug-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/st-plug/st-plug.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ==================================================== TP-LINK BULB ==================================================== +PCAP_FILE="$PCAPS_BASE_DIR/tplink-bulb/wlan1/tplink-bulb.wlan1.detection.pcap" + +# Has no device side signature. + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/tplink-bulb/signatures/tplink-bulb-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/tplink-bulb/signatures/tplink-bulb-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/tplink-bulb/tplink-bulb.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ==================================================== TP-LINK PLUG ==================================================== +PCAP_FILE="$PCAPS_BASE_DIR/tplink-plug/wlan1/tplink-plug.wlan1.detection.pcap" + +# DEVICE SIDE (both the 112, 115 and 556, 1293 sequences) +ON_SIGNATURE="$SIGNATURES_BASE_DIR/tplink-plug/signatures/tplink-plug-onSignature-device-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/tplink-plug/signatures/tplink-plug-offSignature-device-side.sig" +RESULTS_FILE="$OUTPUT_DIR/tplink-plug/tplink-plug.wlan1.detection.pcap___device-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" + +# DEVICE SIDE OUTBOUND (contains only those packets that go through the WAN port, i.e., only the 556, 1293 sequence) +ON_SIGNATURE="$SIGNATURES_BASE_DIR/tplink-plug/signatures/tplink-plug-onSignature-device-side-outbound.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/tplink-plug/signatures/tplink-plug-offSignature-device-side-outbound.sig" +RESULTS_FILE="$OUTPUT_DIR/tplink-plug/tplink-plug.wlan1.detection.pcap___device-side-outbound.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" + +# Phone side does not make sense as it is merely a subset of the device side and does not differentiate ONs from OFFs. +# ====================================================================================================================== + + + +# ================================================== WEMO INSIGHT PLUG ================================================= +PCAP_FILE="$PCAPS_BASE_DIR/wemo-insight-plug/wlan1/wemo-insight-plug.wlan1.detection.pcap" + +# Has no device side signature. + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/wemo-insight-plug/signatures/wemo-insight-plug-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/wemo-insight-plug/signatures/wemo-insight-plug-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/wemo-insight-plug/wemo-insight-plug.wlan1.detection.pcap___phone-side.detectionresults" + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== + + + +# ===================================================== WEMO PLUG ====================================================== +PCAP_FILE="$PCAPS_BASE_DIR/wemo-plug/wlan1/wemo-plug.wlan1.detection.pcap" + +# Has no device side signature + +# PHONE SIDE +ON_SIGNATURE="$SIGNATURES_BASE_DIR/wemo-plug/signatures/wemo-plug-onSignature-phone-side.sig" +OFF_SIGNATURE="$SIGNATURES_BASE_DIR/wemo-plug/signatures/wemo-plug-offSignature-phone-side.sig" +RESULTS_FILE="$OUTPUT_DIR/wemo-plug/wlan1/wemo-plug.wlan1.detection.pcap___phone-side.detectionresults" + + +PROGRAM_ARGS="'$PCAP_FILE' '$ON_SIGNATURE' '$OFF_SIGNATURE' '$RESULTS_FILE'" +./gradlew run --args="$PROGRAM_ARGS" +# ====================================================================================================================== \ No newline at end of file diff --git a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/detection/layer2/Layer2SignatureDetector.java b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/detection/layer2/Layer2SignatureDetector.java index 0322e4c..3c2e062 100644 --- a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/detection/layer2/Layer2SignatureDetector.java +++ b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/detection/layer2/Layer2SignatureDetector.java @@ -14,6 +14,10 @@ import org.jgrapht.graph.DefaultWeightedEdge; import org.jgrapht.graph.SimpleDirectedWeightedGraph; import org.pcap4j.core.*; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; import java.time.Duration; import java.util.*; @@ -24,23 +28,67 @@ import java.util.*; */ public class Layer2SignatureDetector implements PacketListener, ClusterMatcherObserver { + /** + * If set to {@code true}, output written to the results file is also dumped to standard out. + */ + private static boolean STD_OUT_OUTPUT = true; + + // Main method only intended for easier debugging. - public static void main(String[] args) throws PcapNativeException, NotOpenException { - String onSignatureFile = "/Users/varmarken/temp/UCI IoT Project/layer2/kwikset-doorlock-onSignature-phone-side.sig"; - String offSignatureFile = "/Users/varmarken/temp/UCI IoT Project/layer2/kwikset-doorlock-offSignature-phone-side.sig"; + public static void main(String[] args) throws PcapNativeException, NotOpenException, IOException { + if (args.length < 4) { + String errMsg = String.format("Usage: %s inputPcapFile onSignatureFile offSignatureFile resultsFile [stdOut]" + + "\n - inputPcapFile: the target of the detection" + + "\n - onSignatureFile: the file that contains the ON signature to search for" + + "\n - offSignatureFile: the file that contains the OFF signature to search for" + + "\n - resultsFile: where to write the results of the detection" + + "\n - stdOut: optional true/false literal indicating if output should also be printed to std out; default is true", + Layer2SignatureDetector.class.getSimpleName()); + System.out.println(errMsg); + return; + } + final String pcapFile = args[0]; + final String onSignatureFile = args[1]; + final String offSignatureFile = args[2]; + final String resultsFile = args[3]; + if (args.length == 5) { + STD_OUT_OUTPUT = Boolean.parseBoolean(args[4]); + } + +// String pcapFileBaseDir = "/Users/varmarken/temp/UCI IoT Project/layer2/evaluation/experimental_result/standalone"; +// String signatureFilesBaseDir = "/Users/varmarken/temp/UCI IoT Project/layer2/evaluation/experimental_result/standalone"; +// String pcapFile = pcapFileBaseDir + "/tplink-plug/wlan1/tplink-plug.wlan1.local.pcap"; +// String onSignatureFile = signatureFilesBaseDir + "/tplink-plug/signatures/tplink-plug-onSignature-device-side.sig"; +// String offSignatureFile = signatureFilesBaseDir + "/tplink-plug/signatures/tplink-plug-offSignature-device-side.sig"; + +// String pcapFile = "/Users/varmarken/temp/UCI IoT Project/layer2/kwikset-doorlock.wlan1.local.pcap"; +// String onSignatureFile = "/Users/varmarken/temp/UCI IoT Project/layer2/kwikset-doorlock-onSignature-phone-side.sig"; +// String offSignatureFile = "/Users/varmarken/temp/UCI IoT Project/layer2/kwikset-doorlock-offSignature-phone-side.sig"; + + // Prepare file outputter. + File outputFile = new File(resultsFile); + outputFile.getParentFile().mkdirs(); + final PrintWriter resultsWriter = new PrintWriter(new FileWriter(outputFile)); + // Include metadata as comments at the top + outputLine("# Detection results for:", resultsWriter); + outputLine("# - inputPcapFile: " + pcapFile, resultsWriter); + outputLine("# - onSignatureFile: " + onSignatureFile, resultsWriter); + outputLine("# - onSignatureFile: " + offSignatureFile, resultsWriter); + resultsWriter.flush(); // Create signature detectors and add observers that output their detected events. Layer2SignatureDetector onDetector = new Layer2SignatureDetector(PrintUtils.deserializeSignatureFromFile(onSignatureFile)); Layer2SignatureDetector offDetector = new Layer2SignatureDetector(PrintUtils.deserializeSignatureFromFile(offSignatureFile)); onDetector.addObserver((signature, match) -> { - System.out.println(new UserAction(UserAction.Type.TOGGLE_ON, match.get(0).get(0).getTimestamp())); + UserAction event = new UserAction(UserAction.Type.TOGGLE_ON, match.get(0).get(0).getTimestamp()); + outputLine(event.toString(), resultsWriter); }); offDetector.addObserver((signature, match) -> { - System.out.println(new UserAction(UserAction.Type.TOGGLE_OFF, match.get(0).get(0).getTimestamp())); + UserAction event = new UserAction(UserAction.Type.TOGGLE_OFF, match.get(0).get(0).getTimestamp()); + outputLine(event.toString(), resultsWriter); }); // Load the PCAP file - String pcapFile = "/Users/varmarken/temp/UCI IoT Project/layer2/kwikset-doorlock.wlan1.local.pcap"; PcapHandle handle; try { handle = Pcaps.openOffline(pcapFile, PcapHandle.TimestampPrecision.NANO); @@ -50,8 +98,18 @@ public class Layer2SignatureDetector implements PacketListener, ClusterMatcherOb PcapHandleReader reader = new PcapHandleReader(handle, p -> true, onDetector, offDetector); // Parse the file reader.readFromHandle(); + + // Flush output to results file and close it. + resultsWriter.flush(); + resultsWriter.close(); } + private static void outputLine(String line, PrintWriter pw) { + if (STD_OUT_OUTPUT) { + System.out.println(line); + } + pw.println(line); + } /** * The signature that this {@link Layer2SignatureDetector} is searching for. diff --git a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/evaluation/DetectionResultsAnalyzer.java b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/evaluation/DetectionResultsAnalyzer.java index 3fdacb3..51f4623 100644 --- a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/evaluation/DetectionResultsAnalyzer.java +++ b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/evaluation/DetectionResultsAnalyzer.java @@ -42,6 +42,10 @@ public class DetectionResultsAnalyzer { try (BufferedReader br = new BufferedReader(new FileReader(detectionOutputFile))) { String s; while ((s = br.readLine()) != null) { + if (s.startsWith("#")) { + // Ignore comments. + continue; + } detectedEvents.add(UserAction.fromString(s)); } } -- 2.34.1