From: rtrimana Date: Wed, 23 Jan 2019 22:15:34 +0000 (-0800) Subject: Adding new experiments for sensitivity analysis. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=pingpong.git;a=commitdiff_plain;h=42d1a1554131763959e3ac9ac69a52a87d31429f Adding new experiments for sensitivity analysis. --- diff --git a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/Main.java b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/Main.java index 12c3a2a..2896ea7 100644 --- a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/Main.java +++ b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/Main.java @@ -213,13 +213,13 @@ public class Main { // final String triggerTimesFile = path + "/2018-08/arlo-camera/arlo-camera-aug-10-2018.timestamps"; // final String deviceIp = "192.168.1.246"; // .246 == phone; .140 == camera // TODO: EXPERIMENT - November 13, 2018 -// final String inputPcapFile = path + "/experimental_result/standalone/arlo-camera/wlan1/arlo-camera.wlan1.local.pcap"; -// final String outputPcapFile = path + "/experimental_result/standalone/arlo-camera/wlan1/arlo-camera-processed.pcap"; -//// final String inputPcapFile = path + "/experimental_result/standalone/arlo-camera/eth0/arlo-camera.eth1.local.pcap"; -//// final String outputPcapFile = path + "/experimental_result/standalone/arlo-camera/eth0/arlo-camera-processed.pcap"; -// final String triggerTimesFile = path + "/experimental_result/standalone/arlo-camera/timestamps/arlo-camera-nov-13-2018.timestamps"; -//// final String deviceIp = "192.168.1.140"; // .246 == phone; .140 == camera -// final String deviceIp = "192.168.1.246"; // .246 == phone; .140 == camera + final String inputPcapFile = path + "/experimental_result/standalone/arlo-camera/wlan1/arlo-camera.wlan1.local.pcap"; + final String outputPcapFile = path + "/experimental_result/standalone/arlo-camera/wlan1/arlo-camera-processed.pcap"; +// final String inputPcapFile = path + "/experimental_result/standalone/arlo-camera/eth0/arlo-camera.eth1.local.pcap"; +// final String outputPcapFile = path + "/experimental_result/standalone/arlo-camera/eth0/arlo-camera-processed.pcap"; + final String triggerTimesFile = path + "/experimental_result/standalone/arlo-camera/timestamps/arlo-camera-nov-13-2018.timestamps"; +// final String deviceIp = "192.168.1.140"; // .246 == phone; .140 == camera + final String deviceIp = "192.168.1.246"; // .246 == phone; .140 == camera // 12) Blossom sprinkler August 13 experiment // final String inputPcapFile = path + "/2018-08/blossom/blossom.wlan1.local.pcap"; @@ -349,196 +349,196 @@ public class Main { // final String onSignatureFile = path + "/experimental_result/standalone/wemo-plug/signatures/wemo-plug-onSignature-phone-side.sig"; // final String offSignatureFile = path + "/experimental_result/standalone/wemo-plug/signatures/wemo-plug-offSignature-phone-side.sig"; // WeMo Insight plug - final String triggerTimesFile = path + "/experimental_result/standalone/wemo-insight-plug/timestamps/wemo-insight-plug-nov-21-2018.timestamps"; - final String onSignatureFile = path + "/experimental_result/standalone/wemo-insight-plug/signatures/wemo-insight-plug-onSignature-phone-side.sig"; - final String offSignatureFile = path + "/experimental_result/standalone/wemo-insight-plug/signatures/wemo-insight-plug-offSignature-phone-side.sig"; +// final String triggerTimesFile = path + "/experimental_result/standalone/wemo-insight-plug/timestamps/wemo-insight-plug-nov-21-2018.timestamps"; +// final String onSignatureFile = path + "/experimental_result/standalone/wemo-insight-plug/signatures/wemo-insight-plug-onSignature-phone-side.sig"; +// final String offSignatureFile = path + "/experimental_result/standalone/wemo-insight-plug/signatures/wemo-insight-plug-offSignature-phone-side.sig"; - TriggerTimesFileReader ttfr = new TriggerTimesFileReader(); - List triggerTimes = ttfr.readTriggerTimes(triggerTimesFile, false); - - System.out.println("ON signature file in use is " + onSignatureFile); - System.out.println("OFF signature file in use is " + offSignatureFile); +// TriggerTimesFileReader ttfr = new TriggerTimesFileReader(); +// List triggerTimes = ttfr.readTriggerTimes(triggerTimesFile, false); +// +// System.out.println("ON signature file in use is " + onSignatureFile); +// System.out.println("OFF signature file in use is " + offSignatureFile); +// +// List>> onSignature = PrintUtils.deserializeSignatureFromFile(onSignatureFile); +// List>> offSignature = PrintUtils.deserializeSignatureFromFile(offSignatureFile); +// +// List signatureTimestamps = new ArrayList<>(); +// // Load ON signature last packet's timestamp +// // Get the last only +// List> lastListOn = onSignature.get(onSignature.size()-1); +// for (List list : lastListOn) { +// // Get timestamp Instant from the last packet +// int lastPacketIndex = list.size()-1; +// signatureTimestamps.add(list.get(lastPacketIndex).getTimestamp()); +// } +// // Load OFF signature last packet's timestamp +// // Get the last only +// List> lastListOff = offSignature.get(offSignature.size()-1); +// for (List list : lastListOff) { +// // Get timestamp Instant from the last packet +// int lastPacketIndex = list.size()-1; +// signatureTimestamps.add(list.get(lastPacketIndex).getTimestamp()); +// } +// // Sort the timestamps +// signatureTimestamps.sort((p1, p2) -> { +// return p1.compareTo(p2); +// }); +// +// Iterator iterTrig = triggerTimes.iterator(); +// Iterator iterSign = signatureTimestamps.iterator(); +// System.out.println("Trigger to Last Packet:"); +// while (iterTrig.hasNext() && iterSign.hasNext()) { +// Instant trigInst = (Instant) iterTrig.next(); +// Instant signInst = (Instant) iterSign.next(); +// Duration dur = Duration.between(trigInst, signInst); +// long duration = dur.toMillis(); +// // Check duration --- should be below 15 seconds +// if (duration >= 0 && duration <= 15000) { +// System.out.println(dur.toMillis()); +// } else if (duration > 15000) { +// while (duration > 15000) { // that means we have to move to the next trigger +// trigInst = (Instant) iterTrig.next(); +// dur = Duration.between(trigInst, signInst); +// duration = dur.toMillis(); +// } +// System.out.println(dur.toMillis()); +// } else { // below 0 / negative --- that means we have to move to the next signature +// while (duration < 0) { // that means we have to move to the next trigger +// signInst = (Instant) iterSign.next(); +// dur = Duration.between(trigInst, signInst); +// duration = dur.toMillis(); +// } +// System.out.println(dur.toMillis()); +// } +// } +// +// +// // ========================================================================== +// List firstSignatureTimestamps = new ArrayList<>(); +// List lastSignatureTimestamps = new ArrayList<>(); +// List> firstListOnSign = onSignature.get(0); +// List> lastListOnSign = onSignature.get(onSignature.size()-1); +// // Load ON signature first and last packet's timestamps +// for (List list : firstListOnSign) { +// // Get timestamp Instant from the last packet +// firstSignatureTimestamps.add(list.get(0).getTimestamp()); +// } +// for (List list : lastListOnSign) { +// // Get timestamp Instant from the last packet +// int lastPacketIndex = list.size()-1; +// lastSignatureTimestamps.add(list.get(lastPacketIndex).getTimestamp()); +// } +// +// List> firstListOffSign = offSignature.get(0); +// List> lastListOffSign = offSignature.get(offSignature.size()-1); +// // Load OFF signature first and last packet's timestamps +// for (List list : firstListOffSign) { +// // Get timestamp Instant from the last packet +// firstSignatureTimestamps.add(list.get(0).getTimestamp()); +// } +// for (List list : lastListOffSign) { +// // Get timestamp Instant from the last packet +// int lastPacketIndex = list.size()-1; +// lastSignatureTimestamps.add(list.get(lastPacketIndex).getTimestamp()); +// } +// // Sort the timestamps +// firstSignatureTimestamps.sort((p1, p2) -> { +// return p1.compareTo(p2); +// }); +// // Sort the timestamps +// lastSignatureTimestamps.sort((p1, p2) -> { +// return p1.compareTo(p2); +// }); +// +// Iterator iterFirst = firstSignatureTimestamps.iterator(); +// Iterator iterLast = lastSignatureTimestamps.iterator(); +// System.out.println("First to Last Packet:"); +// while (iterFirst.hasNext() && iterLast.hasNext()) { +// Instant firstInst = (Instant) iterFirst.next(); +// Instant lastInst = (Instant) iterLast.next(); +// Duration dur = Duration.between(firstInst, lastInst); +// long duration = dur.toMillis(); +// // Check duration --- should be below 15 seconds +// if (duration >= 0 && duration <= 15000) { +// System.out.println(dur.toMillis()); +// } else if (duration > 15000) { +// while (duration > 15000) { // that means we have to move to the next trigger +// firstInst = (Instant) iterFirst.next(); +// dur = Duration.between(firstInst, lastInst); +// duration = dur.toMillis(); +// } +// System.out.println(dur.toMillis()); +// } else { // below 0 / negative --- that means we have to move to the next signature +// while (duration < 0) { // that means we have to move to the next trigger +// lastInst = (Instant) iterLast.next(); +// dur = Duration.between(firstInst, lastInst); +// duration = dur.toMillis(); +// } +// System.out.println(dur.toMillis()); +// } +// if (duration > 8000) { +// break; +// } +// } - List>> onSignature = PrintUtils.deserializeSignatureFromFile(onSignatureFile); - List>> offSignature = PrintUtils.deserializeSignatureFromFile(offSignatureFile); + // TODO: The above part is just for 15-second time sensitivity experiment + // TODO: The above part is just for 15-second time sensitivity experiment + // TODO: The above part is just for 15-second time sensitivity experiment - List signatureTimestamps = new ArrayList<>(); - // Load ON signature last packet's timestamp - // Get the last only - List> lastListOn = onSignature.get(onSignature.size()-1); - for (List list : lastListOn) { - // Get timestamp Instant from the last packet - int lastPacketIndex = list.size()-1; - signatureTimestamps.add(list.get(lastPacketIndex).getTimestamp()); - } - // Load OFF signature last packet's timestamp - // Get the last only - List> lastListOff = offSignature.get(offSignature.size()-1); - for (List list : lastListOff) { - // Get timestamp Instant from the last packet - int lastPacketIndex = list.size()-1; - signatureTimestamps.add(list.get(lastPacketIndex).getTimestamp()); - } - // Sort the timestamps - signatureTimestamps.sort((p1, p2) -> { - return p1.compareTo(p2); - }); - - Iterator iterTrig = triggerTimes.iterator(); - Iterator iterSign = signatureTimestamps.iterator(); - System.out.println("Trigger to Last Packet:"); - while (iterTrig.hasNext() && iterSign.hasNext()) { - Instant trigInst = (Instant) iterTrig.next(); - Instant signInst = (Instant) iterSign.next(); - Duration dur = Duration.between(trigInst, signInst); - long duration = dur.toMillis(); - // Check duration --- should be below 15 seconds - if (duration >= 0 && duration <= 15000) { - System.out.println(dur.toMillis()); - } else if (duration > 15000) { - while (duration > 15000) { // that means we have to move to the next trigger - trigInst = (Instant) iterTrig.next(); - dur = Duration.between(trigInst, signInst); - duration = dur.toMillis(); - } - System.out.println(dur.toMillis()); - } else { // below 0 / negative --- that means we have to move to the next signature - while (duration < 0) { // that means we have to move to the next trigger - signInst = (Instant) iterSign.next(); - dur = Duration.between(trigInst, signInst); - duration = dur.toMillis(); - } - System.out.println(dur.toMillis()); - } - } - // ========================================================================== - List firstSignatureTimestamps = new ArrayList<>(); - List lastSignatureTimestamps = new ArrayList<>(); - List> firstListOnSign = onSignature.get(0); - List> lastListOnSign = onSignature.get(onSignature.size()-1); - // Load ON signature first and last packet's timestamps - for (List list : firstListOnSign) { - // Get timestamp Instant from the last packet - firstSignatureTimestamps.add(list.get(0).getTimestamp()); - } - for (List list : lastListOnSign) { - // Get timestamp Instant from the last packet - int lastPacketIndex = list.size()-1; - lastSignatureTimestamps.add(list.get(lastPacketIndex).getTimestamp()); - } - List> firstListOffSign = offSignature.get(0); - List> lastListOffSign = offSignature.get(offSignature.size()-1); - // Load OFF signature first and last packet's timestamps - for (List list : firstListOffSign) { - // Get timestamp Instant from the last packet - firstSignatureTimestamps.add(list.get(0).getTimestamp()); - } - for (List list : lastListOffSign) { - // Get timestamp Instant from the last packet - int lastPacketIndex = list.size()-1; - lastSignatureTimestamps.add(list.get(lastPacketIndex).getTimestamp()); + TriggerTimesFileReader ttfr = new TriggerTimesFileReader(); + List triggerTimes = ttfr.readTriggerTimes(triggerTimesFile, false); + // Tag each trigger with "ON" or "OFF", assuming that the first trigger is an "ON" and that they alternate. + List userActions = new ArrayList<>(); + for (int i = 0; i < triggerTimes.size(); i++) { + userActions.add(new UserAction(i % 2 == 0 ? Type.TOGGLE_ON : Type.TOGGLE_OFF, triggerTimes.get(i))); } - // Sort the timestamps - firstSignatureTimestamps.sort((p1, p2) -> { - return p1.compareTo(p2); - }); - // Sort the timestamps - lastSignatureTimestamps.sort((p1, p2) -> { - return p1.compareTo(p2); - }); - - Iterator iterFirst = firstSignatureTimestamps.iterator(); - Iterator iterLast = lastSignatureTimestamps.iterator(); - System.out.println("First to Last Packet:"); - while (iterFirst.hasNext() && iterLast.hasNext()) { - Instant firstInst = (Instant) iterFirst.next(); - Instant lastInst = (Instant) iterLast.next(); - Duration dur = Duration.between(firstInst, lastInst); - long duration = dur.toMillis(); - // Check duration --- should be below 15 seconds - if (duration >= 0 && duration <= 15000) { - System.out.println(dur.toMillis()); - } else if (duration > 15000) { - while (duration > 15000) { // that means we have to move to the next trigger - firstInst = (Instant) iterFirst.next(); - dur = Duration.between(firstInst, lastInst); - duration = dur.toMillis(); - } - System.out.println(dur.toMillis()); - } else { // below 0 / negative --- that means we have to move to the next signature - while (duration < 0) { // that means we have to move to the next trigger - lastInst = (Instant) iterLast.next(); - dur = Duration.between(firstInst, lastInst); - duration = dur.toMillis(); - } - System.out.println(dur.toMillis()); - } - if (duration > 8000) { - break; + TriggerTrafficExtractor tte = new TriggerTrafficExtractor(inputPcapFile, triggerTimes, deviceIp); + final PcapDumper outputter = Pcaps.openDead(DataLinkType.EN10MB, 65536).dumpOpen(outputPcapFile); + DnsMap dnsMap = new DnsMap(); + TcpReassembler tcpReassembler = new TcpReassembler(); + TrafficLabeler trafficLabeler = new TrafficLabeler(userActions); + tte.performExtraction(pkt -> { + try { + outputter.dump(pkt); + } catch (NotOpenException e) { + e.printStackTrace(); } + }, dnsMap, tcpReassembler, trafficLabeler); + outputter.flush(); + outputter.close(); + + if (tte.getPacketsIncludedCount() != trafficLabeler.getTotalPacketCount()) { + // Sanity/debug check + throw new AssertionError(String.format("mismatch between packet count in %s and %s", + TriggerTrafficExtractor.class.getSimpleName(), TrafficLabeler.class.getSimpleName())); } - // TODO: The above part is just for 15-second time sensitivity experiment - // TODO: The above part is just for 15-second time sensitivity experiment - // TODO: The above part is just for 15-second time sensitivity experiment - - - - -// TriggerTimesFileReader ttfr = new TriggerTimesFileReader(); -// List triggerTimes = ttfr.readTriggerTimes(triggerTimesFile, false); -// // Tag each trigger with "ON" or "OFF", assuming that the first trigger is an "ON" and that they alternate. -// List userActions = new ArrayList<>(); -// for (int i = 0; i < triggerTimes.size(); i++) { -// userActions.add(new UserAction(i % 2 == 0 ? Type.TOGGLE_ON : Type.TOGGLE_OFF, triggerTimes.get(i))); -// } -// TriggerTrafficExtractor tte = new TriggerTrafficExtractor(inputPcapFile, triggerTimes, deviceIp); -// final PcapDumper outputter = Pcaps.openDead(DataLinkType.EN10MB, 65536).dumpOpen(outputPcapFile); -// DnsMap dnsMap = new DnsMap(); -// TcpReassembler tcpReassembler = new TcpReassembler(); -// TrafficLabeler trafficLabeler = new TrafficLabeler(userActions); -// tte.performExtraction(pkt -> { -// try { -// outputter.dump(pkt); -// } catch (NotOpenException e) { -// e.printStackTrace(); -// } -// }, dnsMap, tcpReassembler, trafficLabeler); -// outputter.flush(); -// outputter.close(); -// -// if (tte.getPacketsIncludedCount() != trafficLabeler.getTotalPacketCount()) { -// // Sanity/debug check -// throw new AssertionError(String.format("mismatch between packet count in %s and %s", -// TriggerTrafficExtractor.class.getSimpleName(), TrafficLabeler.class.getSimpleName())); -// } -// -// // Extract all conversations present in the filtered trace. -// List allConversations = tcpReassembler.getTcpConversations(); -// // Group conversations by hostname. -// Map> convsByHostname = TcpConversationUtils.groupConversationsByHostname(allConversations, dnsMap); -// System.out.println("Grouped conversations by hostname."); -// // For each hostname, count the frequencies of packet lengths exchanged with that hostname. -// final Map> pktLenFreqsByHostname = new HashMap<>(); -// convsByHostname.forEach((host, convs) -> pktLenFreqsByHostname.put(host, TcpConversationUtils.countPacketLengthFrequencies(convs))); -// System.out.println("Counted frequencies of packet lengths exchanged with each hostname."); -// // For each hostname, count the frequencies of packet sequences (i.e., count how many conversations exchange a -// // sequence of packets of some specific lengths). -// final Map> pktSeqFreqsByHostname = new HashMap<>(); -// convsByHostname.forEach((host, convs) -> pktSeqFreqsByHostname.put(host, TcpConversationUtils.countPacketSequenceFrequencies(convs))); -// System.out.println("Counted frequencies of packet sequences exchanged with each hostname."); -// // For each hostname, count frequencies of packet pairs exchanged with that hostname across all conversations -// final Map> pktPairFreqsByHostname = -// TcpConversationUtils.countPacketPairFrequenciesByHostname(allConversations, dnsMap); -// System.out.println("Counted frequencies of packet pairs per hostname"); -// // For each user action, reassemble the set of TCP connections occurring shortly after -// final Map> userActionToConversations = trafficLabeler.getLabeledReassembledTcpTraffic(); -// final Map>> userActionsToConvsByHostname = trafficLabeler.getLabeledReassembledTcpTraffic(dnsMap); -// System.out.println("Reassembled TCP conversations occurring shortly after each user event"); + // Extract all conversations present in the filtered trace. + List allConversations = tcpReassembler.getTcpConversations(); + // Group conversations by hostname. + Map> convsByHostname = TcpConversationUtils.groupConversationsByHostname(allConversations, dnsMap); + System.out.println("Grouped conversations by hostname."); + // For each hostname, count the frequencies of packet lengths exchanged with that hostname. + final Map> pktLenFreqsByHostname = new HashMap<>(); + convsByHostname.forEach((host, convs) -> pktLenFreqsByHostname.put(host, TcpConversationUtils.countPacketLengthFrequencies(convs))); + System.out.println("Counted frequencies of packet lengths exchanged with each hostname."); + // For each hostname, count the frequencies of packet sequences (i.e., count how many conversations exchange a + // sequence of packets of some specific lengths). + final Map> pktSeqFreqsByHostname = new HashMap<>(); + convsByHostname.forEach((host, convs) -> pktSeqFreqsByHostname.put(host, TcpConversationUtils.countPacketSequenceFrequencies(convs))); + System.out.println("Counted frequencies of packet sequences exchanged with each hostname."); + // For each hostname, count frequencies of packet pairs exchanged with that hostname across all conversations + final Map> pktPairFreqsByHostname = + TcpConversationUtils.countPacketPairFrequenciesByHostname(allConversations, dnsMap); + System.out.println("Counted frequencies of packet pairs per hostname"); + // For each user action, reassemble the set of TCP connections occurring shortly after + final Map> userActionToConversations = trafficLabeler.getLabeledReassembledTcpTraffic(); + final Map>> userActionsToConvsByHostname = trafficLabeler.getLabeledReassembledTcpTraffic(dnsMap); + System.out.println("Reassembled TCP conversations occurring shortly after each user event"); @@ -763,82 +763,82 @@ public class Main { // TODO: This part is just for DBSCAN sensitivity experiment // TODO: This part is just for DBSCAN sensitivity experiment // TODO: This part is just for DBSCAN sensitivity experiment -// List onConversations = userActionToConversations.entrySet().stream(). -// filter(e -> e.getKey().getType() == Type.TOGGLE_ON). // drop all OFF events from stream -// map(e -> e.getValue()). // no longer interested in the UserActions -// flatMap(List::stream). // flatten List> to a List -// collect(Collectors.toList()); -// List offConversations = userActionToConversations.entrySet().stream(). -// filter(e -> e.getKey().getType() == Type.TOGGLE_OFF). -// map(e -> e.getValue()). -// flatMap(List::stream). -// collect(Collectors.toList()); -// //Collections.sort(onConversations, (c1, c2) -> c1.getPackets().) -// -// List onPairs = onConversations.stream(). -// map(c -> c.isTls() ? TcpConversationUtils.extractTlsAppDataPacketPairs(c) : -// TcpConversationUtils.extractPacketPairs(c)). -// flatMap(List::stream). // flatten List> to List<> -// collect(Collectors.toList()); -// List offPairs = offConversations.stream(). -// map(c -> c.isTls() ? TcpConversationUtils.extractTlsAppDataPacketPairs(c) : -// TcpConversationUtils.extractPacketPairs(c)). -// flatMap(List::stream). // flatten List> to List<> -// collect(Collectors.toList()); -// // Note: need to update the DnsMap of all PcapPacketPairs if we want to use the IP/hostname-sensitive distance. -// Stream.concat(Stream.of(onPairs), Stream.of(offPairs)).flatMap(List::stream).forEach(p -> p.setDnsMap(dnsMap)); -// -// double eps = 10; // loop from eps 1-10 -// int minPts = 50; // loop from minPts 30-50 -// for(int epsCount = 1; epsCount <= eps; epsCount++) { -// for(int minPtsCount = 30; minPtsCount <= minPts; minPtsCount++) { -// System.out.println("Eps: " + epsCount + " --- minPts: " + minPtsCount); -// DBSCANClusterer onClusterer = new DBSCANClusterer<>(epsCount, minPtsCount); -// DBSCANClusterer offClusterer = new DBSCANClusterer<>(epsCount, minPtsCount); -// List> onClusters = onClusterer.cluster(onPairs); -// List> offClusters = offClusterer.cluster(offPairs); -// // Sort the conversations as reference -// List sortedAllConversation = TcpConversationUtils.sortConversationList(allConversations); -// // Output clusters -// System.out.println("========================================"); -// System.out.println(" Clustering results for ON "); -// System.out.println(" Number of clusters: " + onClusters.size()); -// int count = 0; -// List>> ppListOfListListOn = new ArrayList<>(); -// for (Cluster c : onClusters) { -// System.out.println(String.format("<<< Cluster #%02d (%03d points) >>>", ++count, c.getPoints().size())); + List onConversations = userActionToConversations.entrySet().stream(). + filter(e -> e.getKey().getType() == Type.TOGGLE_ON). // drop all OFF events from stream + map(e -> e.getValue()). // no longer interested in the UserActions + flatMap(List::stream). // flatten List> to a List + collect(Collectors.toList()); + List offConversations = userActionToConversations.entrySet().stream(). + filter(e -> e.getKey().getType() == Type.TOGGLE_OFF). + map(e -> e.getValue()). + flatMap(List::stream). + collect(Collectors.toList()); + //Collections.sort(onConversations, (c1, c2) -> c1.getPackets().) + + List onPairs = onConversations.stream(). + map(c -> c.isTls() ? TcpConversationUtils.extractTlsAppDataPacketPairs(c) : + TcpConversationUtils.extractPacketPairs(c)). + flatMap(List::stream). // flatten List> to List<> + collect(Collectors.toList()); + List offPairs = offConversations.stream(). + map(c -> c.isTls() ? TcpConversationUtils.extractTlsAppDataPacketPairs(c) : + TcpConversationUtils.extractPacketPairs(c)). + flatMap(List::stream). // flatten List> to List<> + collect(Collectors.toList()); + // Note: need to update the DnsMap of all PcapPacketPairs if we want to use the IP/hostname-sensitive distance. + Stream.concat(Stream.of(onPairs), Stream.of(offPairs)).flatMap(List::stream).forEach(p -> p.setDnsMap(dnsMap)); + + double eps = 10; // loop from eps 1-10 + int minPts = 50; // loop from minPts 30-50 + for(int epsCount = 7; epsCount <= eps; epsCount++) { + for(int minPtsCount = 30; minPtsCount <= minPts; minPtsCount++) { + System.out.println("Eps: " + epsCount + " --- minPts: " + minPtsCount); + DBSCANClusterer onClusterer = new DBSCANClusterer<>(epsCount, minPtsCount); + DBSCANClusterer offClusterer = new DBSCANClusterer<>(epsCount, minPtsCount); + List> onClusters = onClusterer.cluster(onPairs); + List> offClusters = offClusterer.cluster(offPairs); + // Sort the conversations as reference + List sortedAllConversation = TcpConversationUtils.sortConversationList(allConversations); + // Output clusters + System.out.println("========================================"); + System.out.println(" Clustering results for ON "); + System.out.println(" Number of clusters: " + onClusters.size()); + int count = 0; + List>> ppListOfListListOn = new ArrayList<>(); + for (Cluster c : onClusters) { + System.out.println(String.format("<<< Cluster #%02d (%03d points) >>>", ++count, c.getPoints().size())); // System.out.print(PrintUtils.toSummaryString(c)); -// if (c.getPoints().size() > 45 && c.getPoints().size() < 55) { -//// if(c.getPoints().size() > 25) { -// // Print to file -// List> ppListOfList = PcapPacketUtils.clusterToListOfPcapPackets(c); -// ppListOfListListOn.add(ppListOfList); -// } -// } -// PcapPacketUtils.printSignatures(ppListOfListListOn); -// -// System.out.println("========================================"); -// System.out.println(" Clustering results for OFF "); -// System.out.println(" Number of clusters: " + offClusters.size()); -// count = 0; -// List>> ppListOfListListOff = new ArrayList<>(); -// for (Cluster c : offClusters) { -// System.out.println(String.format("<<< Cluster #%03d (%06d points) >>>", ++count, c.getPoints().size())); -//// System.out.print(PrintUtils.toSummaryString(c)); -// if (c.getPoints().size() > 45 && c.getPoints().size() < 55) { -// //if(c.getPoints().size() > 25) { -// // Print to file -// List> ppListOfList = PcapPacketUtils.clusterToListOfPcapPackets(c); -// ppListOfListListOff.add(ppListOfList); -// } -// } -// PcapPacketUtils.printSignatures(ppListOfListListOff); -// System.out.println(); -// System.out.println(); -// System.out.println(); -// // ============================================================================================================ -// } -// } + if (c.getPoints().size() > 45 && c.getPoints().size() < 55) { +// if(c.getPoints().size() > 25) { + // Print to file + List> ppListOfList = PcapPacketUtils.clusterToListOfPcapPackets(c); + ppListOfListListOn.add(ppListOfList); + } + } + PcapPacketUtils.printSignatures(ppListOfListListOn); + + System.out.println("========================================"); + System.out.println(" Clustering results for OFF "); + System.out.println(" Number of clusters: " + offClusters.size()); + count = 0; + List>> ppListOfListListOff = new ArrayList<>(); + for (Cluster c : offClusters) { + System.out.println(String.format("<<< Cluster #%03d (%06d points) >>>", ++count, c.getPoints().size())); +// System.out.print(PrintUtils.toSummaryString(c)); + if (c.getPoints().size() > 45 && c.getPoints().size() < 55) { + //if(c.getPoints().size() > 25) { + // Print to file + List> ppListOfList = PcapPacketUtils.clusterToListOfPcapPackets(c); + ppListOfListListOff.add(ppListOfList); + } + } + PcapPacketUtils.printSignatures(ppListOfListListOff); + System.out.println(); + System.out.println(); + System.out.println(); + // ============================================================================================================ + } + } // // ================================================================================================ diff --git a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/detection/layer3/SignatureDetector.java b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/detection/layer3/SignatureDetector.java index ce745e5..52e2bde 100644 --- a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/detection/layer3/SignatureDetector.java +++ b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/detection/layer3/SignatureDetector.java @@ -218,8 +218,8 @@ public class SignatureDetector implements PacketListener, ClusterMatcherObserver // TODO: EXPERIMENT - January 9, 2018 // Blossom Sprinkler experiment - final String inputPcapFile = path + "/experimental_result/standalone/blossom-sprinkler/wlan1/blossom-sprinkler.wlan1.local.pcap"; -// final String inputPcapFile = path + "/experimental_result/smarthome/blossom-sprinkler/eth0/blossom-sprinkler.eth0.detection.pcap"; +// final String inputPcapFile = path + "/experimental_result/standalone/blossom-sprinkler/wlan1/blossom-sprinkler.wlan1.local.pcap"; + final String inputPcapFile = path + "/experimental_result/smarthome/blossom-sprinkler/eth0/blossom-sprinkler.eth0.detection.pcap"; // final String inputPcapFile = path + "/experimental_result/smarthome/blossom-sprinkler/wlan1/blossom-sprinkler.wlan1.detection.pcap"; // Blossom Sprinkler DEVICE signatures // final String onSignatureFile = path + "/experimental_result/standalone/blossom-sprinkler/signatures/blossom-sprinkler-onSignature-device-side.sig";