/** * Ricevi i pacchetti inviati dalle boards, e sincronizza tutte le boards sul timestamp corrente */ public List <Pacchetto> receivePackets() { List <Pacchetto> packet_list = new List <Pacchetto>(); byte[] buffer = new byte[1024]; writeDebugLine_("In attesa di ricevere dati"); // ricevo #pacchetti receiveBytes(buffer, 4); int packet_number = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(buffer, 0)); writeDebugLine_("Numero di pacchetti da ricevere: " + packet_number); // ricevo i pacchetti for (int i = 0; i < packet_number; i++) { Pacchetto packet = Pacchetto.RiceviPacchetto(this); packet_list.Add(packet); } writeDebugLine_("Pacchetti ricevuti"); // mi sincronizzo con le altre boards waitForTimeSync_(); // invio timestamp int epoch = EspServer.getUnixEpoch(); int network_epoch = IPAddress.HostToNetworkOrder(epoch); socket_.Send(BitConverter.GetBytes(network_epoch), 4, SocketFlags.None); writeDebugLine_("Timestamp inviato: " + epoch); return(packet_list); }
public int CountLast5MinutesPhones(int nBoards, int threshold = 0) { if (nBoards < 2) { return(-1); } int time = EspServer.getUnixEpoch() - 300; string query = " SELECT COUNT(DISTINCT P1.MAC)" + VarQuery(nBoards, time, threshold); using (MySqlConnection connessione = new MySqlConnection("Database=" + Database + ";" + "Server=" + Server + ";" + "Port=3306;" + "UID=" + Uid + ";" + "Password="******";")) using (MySqlCommand cmd = connessione.CreateCommand()) { try { connessione.Open(); cmd.CommandText = query; using (var dataReader = cmd.ExecuteReader()) { Connesso = true; if (dataReader.Read()) { return(dataReader.GetInt32(0)); } else { return(-1); } } } catch (MySqlException e) { System.Diagnostics.Debug.WriteLine("MySqlException catched." + e.ToString()); Connesso = false; return(-100); } } }
public List <string> CountHiddenPhones(DatiDispositivo p, double threshold) { int time = EspServer.getUnixEpoch() - 60; List <string> list = new List <string>(); string query = "SELECT MAC " + "FROM posizioni WHERE global = 1 AND timestamp > " + time + " AND ABS(x - " + p.Posizione.Ascissa.ToString(CultureInfo.InvariantCulture) + ") < " + threshold.ToString(CultureInfo.InvariantCulture) + " AND ABS(y - " + p.Posizione.Ordinata.ToString(CultureInfo.InvariantCulture) + ") < " + threshold.ToString(CultureInfo.InvariantCulture) + " AND MAC <> '" + p.MAC_Address + "'"; using (MySqlConnection connessione = new MySqlConnection("Database=" + Database + ";" + "Server=" + Server + ";" + "Port=3306;" + "UID=" + Uid + ";" + "Password="******";")) using (MySqlCommand cmd = connessione.CreateCommand()) { try { connessione.Open(); cmd.CommandText = query; using (var dataReader = cmd.ExecuteReader()) { while (dataReader.Read()) { list.Add(dataReader.GetString(0)); } Connesso = true; return(list); } } catch (MySqlException e) { System.Diagnostics.Debug.WriteLine("MySqlException catched." + e.ToString()); Connesso = false; return(null); } } }
/** Initializza la board * Client: <HI BoardID> * Server: <HI> * Client: aspetta di ricevere il timestamp * Server: aspetta che tutte le boards si connettano * Server: <GO timestamp> */ public bool initialize() { const int PROTOCOL_MESSAGE_LENGTH = 2; if (socket_ == null) // || !socket_.Connected) { return(false); } byte[] buffer = new byte[512 * 1024]; // ricevo HI receiveBytes(buffer, PROTOCOL_MESSAGE_LENGTH); writeDebugLine_("Aspetto HI"); String msg = Encoding.ASCII.GetString(buffer, 0, PROTOCOL_MESSAGE_LENGTH); if (msg != "HI") { writeDebugLine_("ERRORE, messaggio inaspettato: " + msg); socket_.Close(); return(false); } // ricevo BoardID 4 bytes receiveBytes(buffer, 4); board_id_ = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(buffer, 0)); writeDebugLine_("ID board ottenuto"); // segnalo board in inizializzazione try { setBoardStatus_("Waiting", board_id_); } // verifica che l'IDBoard sia valido catch (IndexOutOfRangeException ex) { writeDebugLine_("ERRORE, IDBoard non corretto: " + board_id_); socket_.Close(); return(false); } // ricevo MAC 6 bytes receiveBytes(buffer, 6); Byte[] mac_address = new Byte[6]; Array.Copy(buffer, 0, mac_address, 0, 6); py_address_ = new PhysicalAddress(mac_address); writeDebugLine_("MAC ottenuto " + py_address_); // rispondo HI msg = "HI"; Encoding.ASCII.GetBytes(msg, 0, PROTOCOL_MESSAGE_LENGTH, buffer, 0); writeDebugLine_("Invio HI"); socket_.Send(buffer, PROTOCOL_MESSAGE_LENGTH, SocketFlags.None); // mi sincronizzo con tutte le altre boards waitForTimeSync_(); // invia GO timestamp msg = "GO"; Encoding.ASCII.GetBytes(msg, 0, PROTOCOL_MESSAGE_LENGTH, buffer, 0); writeDebugLine_("Invio GO"); socket_.Send(buffer, PROTOCOL_MESSAGE_LENGTH, SocketFlags.None); int network_epoch = IPAddress.HostToNetworkOrder((int)EspServer.getUnixEpoch()); socket_.Send(BitConverter.GetBytes(network_epoch), 4, SocketFlags.None); return(true); }
/// <summary> /// se abbiamo almeno 2 schede, ricerca nel database la tupla(Distinct) MAC,timestamp,global,hash, ID scheda i,RSSI scheda i /// all'interno di pacchetti in cui prendendo in considerazione dati di schede diverse riguardanti lo stesso MAC (i-esimo) /// la cui differenza di timestamp (tra dati diversi) sia entro una certa soglia (si riferisca alla stessa lettura) e il cui /// timestamp sia entro il minuto di ricerca , prese queste tuple calcola i punti di intersezione tramite i metodi dei cerchi /// ed infine li aggiunge ad una lista /// </summary> /// <param name="nBoards">numero di schede presenti</param> /// <param name="threshold">soglia del timestamp tra dati diversi</param> /// <returns>lista di punti di intersezione</returns> public List <DatiDispositivo> GetLastMinuteData(int nBoards, int threshold = 0) { try { if (nBoards < 2) { return(null); } int time = EspServer.getUnixEpoch() - 60; //Create a list to store the result List <DatiDispositivo> list = new List <DatiDispositivo>(); using (MySqlConnection connessione = new MySqlConnection("Database=" + Database + ";" + "Server=" + Server + ";" + "Port=3306;" + "UID=" + Uid + ";" + "Password="******";")) using (MySqlCommand cmd = connessione.CreateCommand()) { connessione.Open(); //Create Query StringBuilder builder = new StringBuilder(); builder.Append("SELECT DISTINCT P1.MAC, P1.timestamp, P1.global, P1.hash"); for (int i = 0; i < nBoards; i++) { builder.Append(", P").Append(i + 1).Append(".ID_scheda, P").Append(i + 1).Append(".RSSI"); } builder.Append(VarQuery(nBoards, time, threshold)); //Create Command cmd.CommandText = builder.ToString(); cmd.ExecuteNonQuery(); using (MySqlDataReader dataReader = cmd.ExecuteReader()) { while (dataReader.Read()) { string mac = dataReader.GetString(0); int timestamp = dataReader.GetInt32(1); bool global = dataReader.GetBoolean(2); List <Cerchio> cerchi = new List <Cerchio>(); for (int i = 0; i < nBoards; i++) { int id = dataReader.GetInt32(4 + i * 2); int rssi = dataReader.GetInt32(5 + i * 2); cerchi.Add(new Cerchio(GetScheda(id).Punto, rssi)); } Punto point = Cerchio.Intersezione(cerchi); if (!(Double.IsNaN(point.Ascissa) || Double.IsNaN(point.Ordinata))) { if (point.isInside(schede)) { DatiDispositivo p = new DatiDispositivo(mac, timestamp, point, global); list.Add(p); } else { System.Diagnostics.Debug.WriteLine("Geofence discarded: (" + point.Ascissa + "; " + point.Ordinata + ")"); } } } } InserisciPosizioni(list, connessione); } Connesso = true; return(list); } catch (KeyNotFoundException e) { System.Diagnostics.Debug.WriteLine("idBoard not found..." + e.ToString()); throw e; } catch (MySqlException e) { System.Diagnostics.Debug.WriteLine("MySqlException catched." + e.ToString()); Connesso = false; return(null); } catch (Exception e) { System.Diagnostics.Debug.WriteLine("Caught exception: " + e.ToString()); return(null); } }
public chartDataHandler(MainWind window, int nBoards, EspServer esp_client, DBConnect dbC, CartesianChart scatterChart, CartesianChart fiveMinutesChart, Action errorAction) { _window = window; _nBoards = nBoards; _esp_server = esp_client; _statCalc = new StatCalc(dbC); _errorAction = errorAction; _cts = new CancellationTokenSource(); _ct = _cts.Token; this.scatterChart = scatterChart; this.fiveMinutesChart = fiveMinutesChart; boardsPos = new ChartValues <Scheda>(); hiddenPhonePos = new ChartValues <DatiDispositivo>(); phonePos = new ChartValues <DatiDispositivo>(); selectedPhonePos = new ChartValues <DatiDispositivo>(); scatterChart.Series.Add(new ScatterSeries(boardsPos) { Title = "Schede", MinPointShapeDiameter = 15, PointGeometry = DefaultGeometries.Triangle, StrokeThickness = 4, Fill = System.Windows.Media.Brushes.Transparent, Stroke = Utils.green }); scatterChart.Series.Add(new ScatterSeries(phonePos) { Title = "Dispositivi Visibili", MinPointShapeDiameter = 15, PointGeometry = DefaultGeometries.Diamond, StrokeThickness = 4, Fill = System.Windows.Media.Brushes.Transparent, Stroke = Utils.orange, }); scatterChart.Series.Add(new ScatterSeries(hiddenPhonePos) { Title = "Dispositivi Nascosti", MinPointShapeDiameter = 15, PointGeometry = DefaultGeometries.Diamond, StrokeThickness = 4, Fill = System.Windows.Media.Brushes.Transparent, Stroke = Utils.purple }); scatterChart.Series.Add(new ScatterSeries(selectedPhonePos) { Title = "MAC selezionato", MinPointShapeDiameter = 20, PointGeometry = DefaultGeometries.Cross, StrokeThickness = 4, Fill = System.Windows.Media.Brushes.Transparent, Stroke = Utils.red }); scatterChart.AxisX.Add(new Axis { MinValue = -2, MaxValue = 2, LabelFormatter = x => Math.Round(x, 2).ToString(), Title = "posizione [m]" }); scatterChart.AxisY.Add(new Axis { MinValue = -2, MaxValue = 2, LabelFormatter = x => Math.Round(x, 2).ToString(), Title = "posizione [m]" }); InitializeFiveMinuteChart(); Axis xAxis = new Axis(); Axis yAxis = new Axis(); xAxis.Separator.Step = 1; xAxis.FontSize = 15; xAxis.Title = "Tempo [minuti]"; yAxis.FontSize = 15; yAxis.Title = "Numero dispositivi"; yAxis.Separator.Step = 1; xAxis.MinValue = 0; xAxis.MaxValue = 5; yAxis.MinValue = 0; yAxis.MaxValue = 10; fiveMinutesChart.AxisX.Add(xAxis); fiveMinutesChart.AxisY.Add(yAxis); scatterChart.Series[0].Configuration = Mappers.Xy <Scheda>().X(b => b.Punto.Ascissa).Y(b => b.Punto.Ordinata); scatterChart.Series[0].Values = boardsPos; scatterChart.Series[1].Configuration = Mappers.Xy <DatiDispositivo>().X(b => b.Posizione.Ascissa).Y(b => b.Posizione.Ordinata); scatterChart.Series[1].Values = phonePos; scatterChart.Series[2].Configuration = Mappers.Xy <DatiDispositivo>().X(b => b.Posizione.Ascissa).Y(b => b.Posizione.Ordinata); scatterChart.Series[2].Values = hiddenPhonePos; scatterChart.Series[3].Configuration = Mappers.Xy <DatiDispositivo>().X(b => b.Posizione.Ascissa).Y(b => b.Posizione.Ordinata); scatterChart.Series[3].Values = selectedPhonePos; scatterChart.Series[0].LabelPoint = point => string.Format("ID scheda: {0}\n X:{1} Y:{2}", ((Scheda)point.Instance).ID_scheda, Math.Round(((Scheda)point.Instance).Punto.Ascissa, 2), Math.Round(((Scheda)point.Instance).Punto.Ordinata, 2)); scatterChart.Series[1].LabelPoint = point => string.Format(" MAC: {0}\n Timestamp:{1} \n X:{2} Y:{3}", Utils.Formatta_MAC_Address(((DatiDispositivo)point.Instance).MAC_Address), Utils.UnixTimestampToDateTime(((DatiDispositivo)point.Instance).Timestamp), Math.Round(((DatiDispositivo)point.Instance).Posizione.Ascissa, 2), Math.Round(((DatiDispositivo)point.Instance).Posizione.Ordinata, 2)); scatterChart.Series[2].LabelPoint = point => string.Format(" MAC: {0}\n Timestamp:{1} \n X:{2} Y:{3}", Utils.Formatta_MAC_Address(((DatiDispositivo)point.Instance).MAC_Address), Utils.UnixTimestampToDateTime(((DatiDispositivo)point.Instance).Timestamp), Math.Round(((DatiDispositivo)point.Instance).Posizione.Ascissa, 2), Math.Round(((DatiDispositivo)point.Instance).Posizione.Ordinata, 2)); scatterChart.Series[3].LabelPoint = point => string.Format(" MAC: {0}\n Timestamp:{1} \n X:{2} Y:{3}", Utils.Formatta_MAC_Address(((DatiDispositivo)point.Instance).MAC_Address), Utils.UnixTimestampToDateTime(((DatiDispositivo)point.Instance).Timestamp), Math.Round(((DatiDispositivo)point.Instance).Posizione.Ascissa, 2), Math.Round(((DatiDispositivo)point.Instance).Posizione.Ordinata, 2)); t = new Thread(new ThreadStart(this.ReceiverFunc)); t.Start(); }