Exemple #1
0
        private void Update_chart_err_Click(object sender, RoutedEventArgs e)
        {
            string timestart             = StartTimePickereErr.Text;
            string timestop              = StopTimePickerErr.Text;
            List <LocalAddress> AddrList = new List <LocalAddress>();
            List <double>       errors   = new List <double>();

            int    total_address   = 0;
            int    devices_count   = 0;
            double err_seq_n       = 0;
            double err_dist        = 0;
            double local_error_avg = 0;
            double error_avg       = 0;

            MySqlCommand cmm = null;

            try
            {
                cmm = new MySqlCommand("SELECT count(distinct(mac)) FROM local_macs " +
                                       "WHERE timestamp BETWEEN '" + timestart + "' AND '" + timestop + "'",
                                       DBconnection);
                MySqlDataReader r = cmm.ExecuteReader();
                while (r.Read())
                {
                    total_address = Convert.ToInt32(r[0]);
                }
                cmm.Dispose();

                // Initialize the graph structure and clear existing data
                cmm = new MySqlCommand("SELECT mac, x, y, m.timestamp, seq_ctl from local_macs AS m " +
                                       "JOIN (local_packets AS p) ON (m.mac = p.addr) " +
                                       "WHERE m.timestamp BETWEEN '" + timestart + "' AND '" + timestop + "'" +
                                       "GROUP BY m.timestamp, seq_ctl " +
                                       "ORDER BY m.timestamp", DBconnection);
                MySqlDataReader r1 = cmm.ExecuteReader();

                while (r1.Read())
                {
                    LocalAddress lA = new LocalAddress(Convert.ToString(r1[0]),
                                                       int.Parse(Convert.ToString(r1[4]), System.Globalization.NumberStyles.HexNumber),
                                                       Convert.ToInt64(Convert.ToDateTime(r1[3]).Ticks),
                                                       Convert.ToDouble(r1[1]),
                                                       Convert.ToDouble(r1[2])
                                                       );
                    AddrList.Add(lA);
                }
                cmm.Dispose();
            }
            catch (Exception ex)
            {
                if (cmm != null)
                {
                    cmm.Dispose();
                }
                output_box.AppendText("" + ex.Message);
                Console.WriteLine(ex.StackTrace);
            }


            // Versione semplice senza l'associazione del numero di mac ad ogni device
            for (int i = 0; i < AddrList.Count; i++)
            {
                LocalAddress lA = AddrList.ElementAt <LocalAddress>(i);

                TimeSpan lASpan     = new TimeSpan(lA.timestamp);
                double   lA_seconds = lASpan.TotalSeconds;

                if (!lA.isChecked)
                {
                    lA.isChecked = true;
                    devices_count++;

                    for (int j = i + 1; j < AddrList.Count; j++)
                    {
                        LocalAddress lAin = AddrList.ElementAt <LocalAddress>(j);
                        if (lAin.mac.Equals(lA.mac))
                        {
                            lAin.isChecked = true;
                            continue;
                        }
                        TimeSpan lAinSpan     = new TimeSpan(lAin.timestamp);
                        double   lAin_seconds = lAinSpan.TotalSeconds;

                        if (!lAin.isChecked)
                        {
                            double timeDiff = lAin_seconds - lA_seconds;
                            int    k        = 5;                                           //Multiply factor(meter)
                            if ((lAin.seq_n > lA.seq_n) && (lAin.seq_n - lA.seq_n < 1280)) // 1280 = 0x500
                            {
                                err_seq_n = (double)(lAin.seq_n - lA.seq_n) / 1280;
                                if (timeDiff >= 0)
                                {
                                    if (lA.getDistance(lAin) < k * timeDiff)
                                    {
                                        err_dist = (double)lA.getDistance(lAin) / (k * timeDiff);

                                        local_error_avg = (double)(err_seq_n + err_dist) / 2;
                                        errors.Add(local_error_avg);

                                        lAin.isChecked = true;
                                    }
                                }
                            }
                        }
                    }
                }
            }


            double tot = 0;

            foreach (double error in errors)
            {
                tot = tot + error;
            }
            error_avg = (double)tot / errors.Count;

            string mac_num_msg  = "Local MAC addresses detected:\t " + total_address + "\n";
            string disp_num_msg = "Real devices estimation:\t " + devices_count + "\n";
            string risk_msg     = "";

            if (errors.Count == 0)
            {
                risk_msg = "Estimation risk:\t " + 0 + " %\n";
            }
            else
            {
                risk_msg = "Estimation risk:\t " + (error_avg * 100).ToString("F1") + " %\n";
            }

            macLabel.Content     = mac_num_msg;
            devicesLabel.Content = disp_num_msg;
            riskLabel.Content    = risk_msg;
        }