Exemple #1
0
        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());
                }
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
 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;
         }
     }));
 }
Exemple #4
0
        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);
            }
        }
Exemple #7
0
        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;
            }));
        }