From: Janus Varmarken Date: Thu, 2 Aug 2018 00:05:08 +0000 (-0700) Subject: invoke TrafficLabeler from Main.java (ignoring results for now) X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1d613a011b4cf4c89452c94fcc3f40c6c31b00a5;p=pingpong.git invoke TrafficLabeler from Main.java (ignoring results for now) --- 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 45fea17..a1a61cb 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 @@ -1,7 +1,11 @@ package edu.uci.iotproject; +import static edu.uci.iotproject.analysis.UserAction.Type; + import edu.uci.iotproject.analysis.TcpConversationUtils; +import edu.uci.iotproject.analysis.TrafficLabeler; import edu.uci.iotproject.analysis.TriggerTrafficExtractor; +import edu.uci.iotproject.analysis.UserAction; import edu.uci.iotproject.io.TriggerTimesFileReader; import org.pcap4j.core.*; import org.pcap4j.packet.namednumber.DataLinkType; @@ -31,32 +35,44 @@ public class Main { // Paths to input and output files (consider supplying these as arguments instead) and IP of the device for // which traffic is to be extracted: // D-Link July 26 experiment - final String inputPcapFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/dlink/dlink.wlan1.local.pcap"; - final String outputPcapFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/dlink/dlink-processed.pcap"; - final String triggerTimesFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/dlink/dlink-july-26-2018.timestamps"; - final String deviceIp = "192.168.1.246"; +// final String inputPcapFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/dlink/dlink.wlan1.local.pcap"; +// final String outputPcapFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/dlink/dlink-processed.pcap"; +// final String triggerTimesFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/dlink/dlink-july-26-2018.timestamps"; +// final String deviceIp = "192.168.1.246"; // .246 == phone; .199 == dlink plug? // TP-Link July 25 experiment -// final String inputPcapFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/tplink/tplink.wlan1.local.pcap"; -// final String outputPcapFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/tplink/tplink-processed.pcap"; -// final String triggerTimesFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/tplink/tplink-july-25-2018.timestamps"; -// final String deviceIp = "192.168.1.159"; + final String inputPcapFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/tplink/tplink.wlan1.local.pcap"; + final String outputPcapFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/tplink/tplink-processed.pcap"; + final String triggerTimesFile = "/Users/varmarken/temp/UCI IoT Project/experiments/2018-07/tplink/tplink-july-25-2018.timestamps"; + final String deviceIp = "192.168.1.159"; 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); + }, 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. @@ -82,4 +98,5 @@ public class Main { } -// TP-Link MAC 50:c7:bf:33:1f:09 and usually IP 192.168.1.159 (remember to verify per file) \ No newline at end of file +// TP-Link MAC 50:c7:bf:33:1f:09 and usually IP 192.168.1.159 (remember to verify per file) +// frame.len >= 556 && frame.len <= 558 && ip.addr == 192.168.1.159 \ No newline at end of file diff --git a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/analysis/TrafficLabeler.java b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/analysis/TrafficLabeler.java index eb2e030..226f67f 100644 --- a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/analysis/TrafficLabeler.java +++ b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/analysis/TrafficLabeler.java @@ -17,6 +17,10 @@ public class TrafficLabeler implements PacketListener { private final Map> mActionToTrafficMap; private final List mActionsSorted; + /** + * The total number of packets labeled, i.e, the sum of the sizes of the values in {@link #mActionToTrafficMap}. + */ + private long mPackets = 0; public TrafficLabeler(List userActions) { // Init map with empty lists (no packets have been mapped to UserActions at the onset). @@ -55,8 +59,17 @@ public class TrafficLabeler implements PacketListener { if (index >= 0) { // Associate the packet to the its corresponding user action (located during the binary search above). mActionToTrafficMap.get(mActionsSorted.get(index)).add(packet); + mPackets++; } // Ignore packet if it is not found to be in temporal proximity of a user action. } + /** + * Get the total number of packets labeled by this {@code TrafficLabeler}. + * @return the total number of packets labeled by this {@code TrafficLabeler}. + */ + public long getTotalPacketCount() { + return mPackets; + } + } diff --git a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/analysis/TriggerTrafficExtractor.java b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/analysis/TriggerTrafficExtractor.java index aa48e87..594fa2b 100644 --- a/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/analysis/TriggerTrafficExtractor.java +++ b/Code/Projects/SmartPlugDetector/src/main/java/edu/uci/iotproject/analysis/TriggerTrafficExtractor.java @@ -21,6 +21,10 @@ public class TriggerTrafficExtractor implements PcapPacketFilter { private int mTriggerIndex = 0; + /** + * The total number of packets marked for inclusion during one run of {@link #performExtraction(PacketListener...)}. + */ + private long mIncludedPackets = 0; public static final int INCLUSION_WINDOW_MILLIS = 20_000; @@ -39,6 +43,9 @@ public class TriggerTrafficExtractor implements PcapPacketFilter { public void performExtraction(PacketListener... extractedPacketsConsumers) throws PcapNativeException, NotOpenException, TimeoutException { + // Reset trigger index and packet counter in case client code chooses to rerun the extraction. + mTriggerIndex = 0; + mIncludedPackets = 0; PcapHandle handle; try { handle = Pcaps.openOffline(mPcapFilePath, PcapHandle.TimestampPrecision.NANO); @@ -49,18 +56,32 @@ public class TriggerTrafficExtractor implements PcapPacketFilter { handle.setFilter("ip host " + mDeviceIp, BpfProgram.BpfCompileMode.OPTIMIZE); PcapHandleReader pcapReader = new PcapHandleReader(handle, this, extractedPacketsConsumers); pcapReader.readFromHandle(); - // Reset trigger index (in case client code chooses to rerun the extraction) - mTriggerIndex = 0; + + } + + /** + * Return the number of extracted packets (i.e., packets selected for inclusion) as a result of the most recent call + * to {@link #performExtraction(PacketListener...)}. + * + * @return the number of extracted packets (i.e., packets selected for inclusion) as a result of the most recent + * call to {@link #performExtraction(PacketListener...)}. + */ + public long getPacketsIncludedCount() { + return mIncludedPackets; } @Override public boolean shouldIncludePacket(PcapPacket packet) { // New version. Simpler, but slower: the later a packet arrives, the more elements of mTriggerTimes will need to // be traversed. - return mTriggerTimes.stream().anyMatch( + boolean include = mTriggerTimes.stream().anyMatch( trigger -> trigger.isBefore(packet.getTimestamp()) && packet.getTimestamp().isBefore(trigger.plusMillis(INCLUSION_WINDOW_MILLIS)) ); + if (include) { + mIncludedPackets++; + } + return include; /* // Old version. Faster, but more complex - is it correct?