private void btnSalvaDevice_Click(object sender, EventArgs e) { int xPosition, yPosition; //check sui parametri (device selezionato e valore contenuto nella cella) if (lstBoxNoConfDevice.SelectedItem == null) { MessageBox.Show("Selezionare un device dall'elenco", "Seleziona il device da configurare", MessageBoxButtons.OK, MessageBoxIcon.Error); } else if (!int.TryParse(txtXPosition.Text, out xPosition)) { MessageBox.Show("Posizione X non valida", "Inserire un valore numerico per la posizione X ", MessageBoxButtons.OK, MessageBoxIcon.Error); } else if (!int.TryParse(txtYPosition.Text, out yPosition)) { MessageBox.Show("Posizione Y non valida", "Inserire un valore numerico per la posizione Y", MessageBoxButtons.OK, MessageBoxIcon.Error); } else //i parametri sono validi //leggo l'IP del device selezionato { String ipAddress = lstBoxNoConfDevice.SelectedItem.ToString(); //creo l'oggetto Device try { //devo togliere il device dalla lista dei non configurati e aggiungerlo tra quelli configurati //elimino il device dalla lista dei device non configurati e lancio il delegato associato //semaforo per gestire la concorrenza con il thread che gestisce la connessione con il device ManualResetEvent deviceEvent; NoConfDevice.lstNoConfDevices.TryRemove(ipAddress, out deviceEvent); Device device = new Device(ipAddress, xPosition, yPosition, 0, deviceEvent); //aggiungo il device alla lista degi device configurati e lancio il delegato associato ConfDevice.lstConfDevices.TryAdd(device.ipAddress, device); ConfDevice.OnLstConfDevicesChanged(this, EventArgs.Empty); //risveglio il thread che gestisce la connessione del dispositivo in quanto la configurazione è completata deviceEvent.Set(); NoConfDevice.OnLstNoConfDevicesChanged(this, EventArgs.Empty); //ripulisco la textbox txtXPosition.Clear(); txtYPosition.Clear(); } catch (Exception ex) { MessageBox.Show("Errore", "Si è verificato un errore durante la configurazione del dispositivo", MessageBoxButtons.OK, MessageBoxIcon.Error); Utils.logMessage(this.ToString(), Utils.LogCategory.Error, ex.ToString()); } } }
private void btnEliminaConfDevice_Click(object sender, EventArgs e, String deviceIp) { Device device; try { //devo togliere il device dalla lista dei configurati e aggiungerlo tra quelli non configurati //questo codice è duplicato in ThreadGestioneWifi (valutare se fare una funzione) ConfDevice.lstConfDevices.TryRemove(deviceIp, out device); ConfDevice.OnLstConfDevicesChanged(this, EventArgs.Empty); NoConfDevice.lstNoConfDevices.TryAdd(deviceIp, device.evento); NoConfDevice.OnLstNoConfDevicesChanged(this, EventArgs.Empty); } catch (Exception) { MessageBox.Show("Errore", "Si è verificato un errore durante la cancellazione del dispositivo", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void checkTwoESP(object sender, EventArgs e) { BeginInvoke((Action)(() => { if (ConfDevice.lstConfDevices.Count >= 2 && (ConfDevice.getMaxXPositionDevice() != ConfDevice.getMinXPositionDevice() || ConfDevice.getMaxYPositionDevice() != ConfDevice.getMinYPositionDevice())) { tabFeatures.Visible = true; btnRefreshConteggio.Visible = true; lblMin2device.Visible = false; } else { tabFeatures.Visible = false; btnRefreshConteggio.Visible = false; lblMin2device.Visible = true; } })); }
private void btnModificaCoordinate_Click(object sender, EventArgs e, Device device, string newX, string newY) { int xPosition, yPosition; if (!int.TryParse(newX, out xPosition)) { MessageBox.Show("Posizione X non valida", "Inserire un valore numerico per la posizione X ", MessageBoxButtons.OK, MessageBoxIcon.Error); } else if (!int.TryParse(newY, out yPosition)) { MessageBox.Show("Posizione Y non valida", "Inserire un valore numerico per la posizione Y", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { device.x_position = xPosition; device.y_position = yPosition; ConfDevice.lstConfDevices.AddOrUpdate(device.ipAddress, device, (k, v) => v); ConfDevice.OnLstConfDevicesChanged(this, EventArgs.Empty); } }
/// <summary> /// Metodo che viene elaborato nel thread per la gestione dei rilevatori /// </summary> private void elaboration() { //mi metto in ascolto su tutte le perificeriche sulla porto indicata nei NetworkSettings IPAddress localAddr = IPAddress.Any; listener = new TcpListener(localAddr, settings.servicePort); try { // starto il listener in attesa di connessione dei client listener.Start(); } catch (SocketException) { Utils.logMessage(this.ToString(), Utils.LogCategory.Error, "Errore durante l'apertura del socket"); return; } //lista che contiene i puntamenti ai threads per la gestione dei singoli rilevatori List <Thread> listaThreadSocket = new List <Thread>(); //ciclo fin quando non viene invocato il metodo stop in attesa di nuovi rilevatori while (!stopThreadElaboration) { TcpClient client = null; Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "In attesa di connessioni..."); try { //aspetto una connessione da parte di un rilevatore //con il controllo sul metodo pending evito la chiamata bloccante AcceptTcpClient() che non mi fa chiudere il thread quando chiudo la GUI while (!listener.Pending() && !stopThreadElaboration) { Thread.Sleep(2000); } if (stopThreadElaboration) { break; } client = listener.AcceptTcpClient(); } catch (SocketException) { Utils.logMessage(this.ToString(), Utils.LogCategory.Error, "Errore durante il binding del socket"); break; } catch (InvalidOperationException) { Utils.logMessage(this.ToString(), Utils.LogCategory.Error, "Errore durante il binding del socket"); break; } try { //thread per gestire il socket connesso con il device Thread threadGestioneDevice = new Thread(() => gestioneDevice(client)); threadGestioneDevice.IsBackground = false; //starto il thread threadGestioneDevice.Start(); //aggiungo il thread alla lista dei thread listaThreadSocket.Add(threadGestioneDevice); } catch (Exception) { Utils.logMessage(this.ToString(), Utils.LogCategory.Error, "Errore durante il binding del socket"); client.Close(); //devo togliere il device dalla lista dei configurati e aggiungerlo tra quelli non configurati //questo codice è duplicato in frmMain (valutare se fare una funzione) Device device; ConfDevice.lstConfDevices.TryRemove((client.Client.RemoteEndPoint as IPEndPoint).Address.ToString(), out device); ConfDevice.OnLstConfDevicesChanged(this, EventArgs.Empty); NoConfDevice.lstNoConfDevices.TryAdd((client.Client.RemoteEndPoint as IPEndPoint).Address.ToString(), device.evento); NoConfDevice.OnLstNoConfDevicesChanged(this, EventArgs.Empty); break; } } //attendo la fine di tutti i thread listaThreadSocket.ForEach(thread => thread.Join()); }
///<summary>metodo che gestisce la connessione socket con un rilevatore</summary> ///<exception cref = "SnifferAppSocketException">Eccezione lanciata in caso di errore su una operazione sul socket</exception> public void gestioneDevice(TcpClient client) { IPEndPoint remoteIpEndPoint = null; Device device; NetworkStream stream = client.GetStream(); stream.ReadTimeout = 120000; //timeout in lettura in millis stream.WriteTimeout = 15000; //timeout in scrittura in millis try { remoteIpEndPoint = client.Client.RemoteEndPoint as IPEndPoint; } catch (Exception e) { string message = "Errore nel riconoscere il socket remoto"; Utils.logMessage(this.ToString(), Utils.LogCategory.Error, message); throw new SnifferAppSocketException(message, e); } //verifico che non scattino timeout sulla connessione socket try { //verifico se il dispositivo con quell'IP era già connesso (l'IP del dispositivo era contentuto già nella lstConfDevices) if (ConfDevice.lstConfDevices.TryGetValue(remoteIpEndPoint.Address.ToString(), out device)) { //il dispositivo era gia configurato Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "RECONNECTED with device: " + remoteIpEndPoint.Address.ToString()); } else { //se non era già configurato aspetto l'evento di Configurazione dall'interfaccia grafica Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "CONNECTED with device: " + remoteIpEndPoint.Address.ToString()); //event per gestire la sincronizzazione con il thread della GUI ManualResetEvent deviceConfEvent = new ManualResetEvent(false); //aggiungo il dispositivo (con il rispettivo Event) nella lista dei dispositivi non configurati NoConfDevice.lstNoConfDevices.TryAdd(remoteIpEndPoint.Address.ToString(), deviceConfEvent); //delegato per gestire la variazione della lista dei device da configurare NoConfDevice.OnLstNoConfDevicesChanged(this, EventArgs.Empty); //mi risveglio quando dalla GUI è richiesta la configurazione del dispositivo o si vuole inviare al rilevatore il segnale "IDENTIFICA" bool isSignalled = false; while (!isSignalled && !stopThreadElaboration) { isSignalled = deviceConfEvent.WaitOne(TimeSpan.FromSeconds(20)); } //mi sono risvegliato dall'evento ma il thread deve fermarsi if (stopThreadElaboration) { //chiudo il client TCP client.Close(); Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "Socket chiuso"); return; } do { //controllo se il device è stato eliminato dalla lista dei device non configurati if (!NoConfDevice.lstNoConfDevices.TryGetValue(remoteIpEndPoint.Address.ToString(), out deviceConfEvent)) { //il device è stato configurato break; } else { //il device non è stato configurato e quindi il thread si è risvegliato per richiedere un "IDENTIFICA" Utils.sendMessage(stream, remoteIpEndPoint, "IDENTIFICA"); deviceConfEvent.Reset(); //come su, volutare se realizzare un wrapper sull'evento isSignalled = false; while (!isSignalled && !stopThreadElaboration) { isSignalled = deviceConfEvent.WaitOne(TimeSpan.FromSeconds(20)); } //mi sono risvegliato dall'evento ma il thread deve fermarsi if (stopThreadElaboration) { //chiudo il client TCP client.Close(); Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "Socket chiuso"); return; } } } while (true); } //incremento il numero di socket associati al device //non faccio il check se il device c'è nella lista perchè in questo punto del codice c'è sicuramente ConfDevice.lstConfDevices.TryGetValue(remoteIpEndPoint.Address.ToString(), out device); device.openSocket = device.openSocket + 1; ConfDevice.lstConfDevices.AddOrUpdate(device.ipAddress, device, (k, v) => v); Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "Socket aperti con " + remoteIpEndPoint.Address.ToString() + ": " + device.openSocket); string messageReceived; //count per triggerare la sincronizzazione dei clock tra il server e il rilevatore int countSyncTimestamp = 0; //ciclo fin quando non viene invocato il metodo stop in attesa di messaggi da parte dei rilevatori while (!stopThreadElaboration) { //se il count è a 0 eseguo la sincronizzazione if (countSyncTimestamp == 0) { //invio il messaggio per iniziare la sincronizzazione Utils.sendMessage(stream, remoteIpEndPoint, "SYNC_CLOCK"); messageReceived = Utils.receiveMessage(stream, remoteIpEndPoint); //posso ricevere SYNC_CLOCK_START (devo sincronizzare) o SYNC_CLOCK_STOP (sincronizzazione terminata) while (messageReceived == "SYNC_CLOCK_START") { //invio il segnale di sincronizzazione Utils.syncClock(client.Client); messageReceived = Utils.receiveMessage(stream, remoteIpEndPoint); } //resetto il count; sincronizzo i timestamp ogni 50 interazioni countSyncTimestamp = 50; } //invio messaggio per indicare che può iniziare l'invio dei dati Utils.sendMessage(stream, remoteIpEndPoint, "START_SEND"); //attendo il JSON dal rilevatore con i pacchetti catturati dall'ultima interazione messageReceived = Utils.receiveMessage(stream, remoteIpEndPoint); PacketsInfo packetsInfo = null; try { //deserializzazione del JSON ricevuto packetsInfo = Newtonsoft.Json.JsonConvert.DeserializeObject <PacketsInfo>(messageReceived); } catch (Exception) { Utils.logMessage(this.ToString(), Utils.LogCategory.Warning, "Errore nella deserializzazione del messaggio JSON. Il messaggio verrà scartato"); } //controllo che ci siano messaggi e che ci siano almeno 2 device configurati if (packetsInfo != null && packetsInfo.listPacketInfo.Count > 0 && ConfDevice.lstConfDevices.Count >= 2) { //salvo i dati nella tabella raw del DB dbManager.saveReceivedData(packetsInfo, remoteIpEndPoint.Address); } Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "Device: " + remoteIpEndPoint.Address.ToString() + " -- Numero pacchetti ricevuti: " + packetsInfo.listPacketInfo.Count); //decremento il contatore per la sincronizzazione dei timestamp countSyncTimestamp--; } } catch (SnifferAppSocketTimeoutException e) { Utils.logMessage(this.ToString(), Utils.LogCategory.Warning, "Device:" + remoteIpEndPoint.Address.ToString() + " -- " + e.Message); } //chiudo il client TCP stream.Close(); client.Close(); Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "Socket con " + remoteIpEndPoint.Address.ToString() + " chiuso"); //decremento il numero di socket aperti sul device ConfDevice.lstConfDevices.TryGetValue(remoteIpEndPoint.Address.ToString(), out device); device.openSocket = device.openSocket - 1; ConfDevice.lstConfDevices.AddOrUpdate(device.ipAddress, device, (k, v) => v); Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "Socket aperti con " + remoteIpEndPoint.Address.ToString() + ": " + device.openSocket); //se il numero di socket aperti è zero devo togliere il device dalla lista dei configurati if (device.openSocket <= 0 && !stopThreadElaboration) { ConfDevice.lstConfDevices.TryRemove(remoteIpEndPoint.Address.ToString(), out device); Utils.logMessage(this.ToString(), Utils.LogCategory.Info, "Device " + remoteIpEndPoint.Address.ToString() + " eliminato dalla lista dei device configurati"); ConfDevice.OnLstConfDevicesChanged(this, EventArgs.Empty); } }
private void updateConfDevice(object sender, EventArgs e) { BeginInvoke((Action)(() => { lblNumDeviceConf.Text = "Numero device configurati: " + ConfDevice.lstConfDevices.Count; if (ConfDevice.lstConfDevices.Count == 0) { lblNoDeviceConf.Visible = true; tabDeviceConf.Visible = false; return; } tabDeviceConf.TabPages.Clear(); //cancello tutti i punti ESP dai grafici delle posizioni e dei movimenti chartPositionDevice.Series["ESP"].Points.Clear(); chartMovimentoDevice.Series["ESP"].Points.Clear(); foreach (KeyValuePair <String, Device> device in ConfDevice.lstConfDevices) { //setto le dimensioni degli assi del grafico che mostra le posizioni dei dispositivi rilevati chartPositionDevice.ChartAreas[0].AxisX.Maximum = ConfDevice.getMaxXPositionDevice(); chartPositionDevice.ChartAreas[0].AxisX.Minimum = ConfDevice.getMinXPositionDevice(); //aggiungo sul grafico delle posizioni il punto del device ESP int point = chartPositionDevice.Series["ESP"].Points.AddXY(device.Value.x_position, device.Value.y_position); chartPositionDevice.Series["ESP"].Points[point].ToolTip = device.Key; //setto le dimensioni degli assi del grafico che mostra il movimento dispositivi rilevati chartMovimentoDevice.ChartAreas[0].AxisX.Maximum = ConfDevice.getMaxXPositionDevice(); chartMovimentoDevice.ChartAreas[0].AxisX.Minimum = ConfDevice.getMinXPositionDevice(); //aggiungo sul grafico dei movimenti il punto del device ESP point = chartMovimentoDevice.Series["ESP"].Points.AddXY(device.Value.x_position, device.Value.y_position); chartMovimentoDevice.Series["ESP"].Points[point].ToolTip = device.Key; // // lblIpDeviceConf // Label lblIpDeviceConf = new Label(); lblIpDeviceConf.AutoSize = true; lblIpDeviceConf.Location = new Point(7, 4); lblIpDeviceConf.Size = new Size(80, 18); lblIpDeviceConf.Text = "Indirizzo IP: "; lblIpDeviceConf.ForeColor = SystemColors.WindowText; // // lblIndirizzoIpValue // Label lblIndirizzoIpValue = new Label(); lblIndirizzoIpValue.AutoSize = true; lblIndirizzoIpValue.Location = new Point(7, 27); lblIndirizzoIpValue.Font = new Font("Calibri", 11F, FontStyle.Bold); lblIndirizzoIpValue.Text = device.Value.ipAddress; lblIndirizzoIpValue.ForeColor = SystemColors.WindowText; // // lblPosizioneDevice // Label lblPosizioneDeviceConf = new Label(); lblPosizioneDeviceConf.AutoSize = true; lblPosizioneDeviceConf.Location = new Point(108, 4); lblPosizioneDeviceConf.Text = "Posizione attuale:"; lblPosizioneDeviceConf.ForeColor = SystemColors.WindowText; // // lblPosizioneValue // Label lblPosizioneValue = new Label(); lblPosizioneValue.AutoSize = true; lblPosizioneValue.Location = new Point(108, 27); lblPosizioneValue.Font = new Font("Calibri", 11F, FontStyle.Bold); lblPosizioneValue.Text = "(" + device.Value.x_position + "," + device.Value.y_position + ")"; lblPosizioneValue.ForeColor = SystemColors.WindowText; // // lblModificaPosizione // Label lblModificaPosizione = new Label(); lblModificaPosizione.AutoSize = true; lblModificaPosizione.Location = new Point(238, 4); lblModificaPosizione.Text = "Modifica posizione:"; lblModificaPosizione.ForeColor = SystemColors.WindowText; // // lblModificaX // Label lblModificaX = new Label(); lblModificaX.AutoSize = true; lblModificaX.Location = new Point(238, 27); lblModificaX.Size = new Size(72, 18); lblModificaX.Text = "X:"; lblModificaX.ForeColor = SystemColors.WindowText; // // txtModificaX // TextBox txtModificaX = new TextBox(); txtModificaX.Location = new Point(262, 27); txtModificaX.Size = new Size(57, 25); // // lblModificaY // Label lblModificaY = new Label(); lblModificaY.AutoSize = true; lblModificaY.Location = new Point(321, 27); lblModificaY.Size = new Size(72, 18); lblModificaY.Text = "Y:"; lblModificaY.ForeColor = SystemColors.WindowText; // // txtModificaY // TextBox txtModificaY = new TextBox(); txtModificaY.Location = new Point(343, 27); txtModificaY.Size = new Size(57, 25); // // btnSalvaModificaDevice // PictureBox btnSalvaModificaDevice = new PictureBox(); btnSalvaModificaDevice.Image = Properties.Resources.success; btnSalvaModificaDevice.Location = new Point(405, 27); btnSalvaModificaDevice.Size = new Size(25, 25); btnSalvaModificaDevice.SizeMode = PictureBoxSizeMode.StretchImage; btnSalvaModificaDevice.TabStop = false; toolTipApp.SetToolTip(btnSalvaModificaDevice, "Salva la nuova popsizione"); btnSalvaModificaDevice.Click += delegate { btnModificaCoordinate_Click(sender, e, device.Value, txtModificaX.Text, txtModificaY.Text); }; // // btnEliminaDevice // PictureBox btnEliminaDevice = new PictureBox(); btnEliminaDevice.Image = Properties.Resources.error; btnEliminaDevice.Location = new Point(436, 27); btnEliminaDevice.Size = new Size(25, 25); btnEliminaDevice.SizeMode = PictureBoxSizeMode.StretchImage; btnEliminaDevice.TabStop = false; toolTipApp.SetToolTip(btnEliminaDevice, "Elimina il device"); btnEliminaDevice.Click += delegate { btnEliminaConfDevice_Click(sender, e, device.Key); }; //aggiorno elenco devices configurati TabPage tabPage = new TabPage(); tabPage.Controls.Add(lblIpDeviceConf); tabPage.Controls.Add(lblIndirizzoIpValue); tabPage.Controls.Add(lblPosizioneDeviceConf); tabPage.Controls.Add(lblPosizioneValue); tabPage.Controls.Add(lblModificaPosizione); tabPage.Controls.Add(lblModificaX); tabPage.Controls.Add(txtModificaX); tabPage.Controls.Add(lblModificaY); tabPage.Controls.Add(txtModificaY); tabPage.Controls.Add(btnSalvaModificaDevice); tabPage.Controls.Add(btnEliminaDevice); tabPage.Location = new Point(4, 27); tabPage.Padding = new Padding(3); tabPage.Size = new Size(300, 59); tabPage.Text = device.Value.ipAddress; tabPage.UseVisualStyleBackColor = true; tabDeviceConf.TabPages.Add(tabPage); } lblNoDeviceConf.Visible = false; tabDeviceConf.Visible = true; })); }