/// <summary> /// A sniffer entry (sniffer-mac, client-mac, rssi, and time) is added to currently built measurements. /// The procedures is the same for online and offline measurements - the only difference is that we do not track changes to /// online measurements as we are not interested in saving them persistently (at least not at the present time) /// </summary> /// <param name="snifferMac">The sniffer's mac address</param> /// <param name="clientMac">The client's mac adress</param> /// <param name="rssi">The client's rssi as measured by the sniffer</param> /// <param name="mode">'Offline' or 'Online' to help distinguish whether we want to save the data persistently</param> /// <param name="time">The time the sniffer entry was made. </param> private static void addToMeasurement(string snifferMac, string clientMac, int rssi, DateTime time) { Mode mode; //First, determine the mode. if (currentOfflineMeasurements.ContainsKey(clientMac)) { mode = Mode.Offline; } else if (currentOnlineMeasurements.ContainsKey(clientMac)) { mode = Mode.Online; } else { return; //Unknown client mac } ConcurrentDictionary <string, SnifferWifiMeasurement> dic = getMeasurementDictionary(mode); SnifferWifiMeasurement curWifiMeasurement = dic[clientMac]; //Update end meas time (even more may come..) curWifiMeasurement.meas_time_end = time; //Add or update histogram with snifferMac, rssi value SnifferHistogram curHist = curWifiMeasurement.SnifferHistograms.FirstOrDefault(h => h.Mac == snifferMac && h.value == rssi); if (curHist == null) //insert new histogram { curHist = new SnifferHistogram(); curHist.Mac = snifferMac; curHist.value = rssi; curHist.count = 0; curWifiMeasurement.SnifferHistograms.Add(curHist); curHist.SnifferWifiMeasurement = curWifiMeasurement; if (mode == Mode.Offline) { context.AddRelatedObject(curWifiMeasurement, "SnifferHistograms", curHist); } } curHist.count++; //yet another count for this rssi value //In the offline mode we actually save the data. if (mode == Mode.Offline) { context.UpdateObject(curWifiMeasurement); context.UpdateObject(curHist); } }
//Public visibility so we can test it (directly) via unit tests public static SnifferWifiMeasurement getNStrongestAPMeasurement(SnifferWifiMeasurement measurement, int n) { if (measurement.getMACs().Count < n) { return(measurement); } SortedDictionary <double, String> strongestAPs = new SortedDictionary <double, String>(); //Find the n strongest macs // foreach (String mac in measurement.getMACs()) //all APs in sample { double curMacVal = measurement.getAvgDbM(mac); while (strongestAPs.ContainsKey(curMacVal)) { curMacVal += 0.0001; } strongestAPs.Add(curMacVal, mac); //NB: TreeMap sorts members in ascending order! //Thus, we remove from the head to keep the strongest values if (strongestAPs.Count > n) { strongestAPs.Remove(strongestAPs.First().Key); } } //Create new measurement containing n strongest macs SnifferWifiMeasurement result = new SnifferWifiMeasurement(); foreach (double d in strongestAPs.Keys) { SnifferHistogram h = new SnifferHistogram(); h.Mac = strongestAPs[d]; h.value = (int)d; h.count = 1; result.SnifferHistograms.Add(h); //result.addValue(strongestAPs.get(d), (int)d); } return(result); }
public void AddToSnifferHistograms(SnifferHistogram snifferHistogram) { base.AddObject("SnifferHistograms", snifferHistogram); }
public static SnifferHistogram CreateSnifferHistogram(int ID, string mac, int value, int count, int wifiMeasurement_ID) { SnifferHistogram snifferHistogram = new SnifferHistogram(); snifferHistogram.ID = ID; snifferHistogram.Mac = mac; snifferHistogram.value = value; snifferHistogram.count = count; snifferHistogram.WifiMeasurement_ID = wifiMeasurement_ID; return snifferHistogram; }