Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2020, 15:48   #1
rushaks
Новичок
Джуниор
 
Регистрация: 06.11.2014
Сообщений: 1
По умолчанию Параллельное подключение к нескольким устройствам (+ обработка json)

Приветствую форумчан!

Помогите пожалуйста разобраться в реализации следующей идеи:

Есть устройства (видеодетекторы), которые при подключении на порт выплевывают json с информацией.

json вида

Код:
{
  "CounterEvent": {
    "AreaID": 0,
    "Class": 0,
    "CounterID": 1,
    "Speed": 19.81940460205078,
    "Time": "2020-10-22T08:55:33"
  }
}
Что я пытаюсь сделать: у меня есть база с перечнем этих устройств (детекторов), которые я хочу одновременно опрашивать. Получилось пока что одно устройство опросить (не могу понять как мне сделать: цикл, создать несколько потоков или что то другое?).

Вот мой код как я это сделал :
Код:
using Newtonsoft.Json;
 
namespace JsonTest2
{
    class Program
    {
        public static int count = 0;
        public static List<string> select_ip_device = new List<string>();
        static void Main(string[] args)
        {
            Thread thread1 = new Thread(() => GetData("172.22.8.11"));
            thread1.Start();
        }
 
        static void GetIp()
        {
            SqlConnection conn = new SqlConnection(@"Data source=localhost,16252; Initial Catalog =BASE; Integrated Security = false; User ID =ID; Password=PW");
            conn.Open();
            SqlDataReader dataReader;
            SqlCommand myCommand = conn.CreateCommand();
            myCommand.CommandText = "SELECT ip FROM base_detect where active = 1";
            dataReader = myCommand.ExecuteReader();
            while (dataReader.Read())
            {
                select_ip_device.Add(dataReader.GetString(0));
            }
        }
 
 
        static void GetData(string ip)
        {
            int count;
            for (count = 1; ; count++)
            {
                GetVdt(ip);
            }
        }
 
        static void GetVdt(string ip)
        {
            // Инициализация
            string address = ip;
            int port = 41358;
            TcpClient client = new TcpClient(address, port);
            NetworkStream stream = client.GetStream();
            try
            {
                byte[] readingData = new byte[2048];
                String responseData = String.Empty;
                StringBuilder completeMessage = new StringBuilder();
                int numberOfBytesRead = 0;
                SqlConnection conn = new SqlConnection(@"Data source=localhost,16252; Initial Catalog =BASE; Integrated Security = false; User ID =USER; Password=PW");
                conn.Open();
                
                while (true)
                {
                    count++;
                    numberOfBytesRead = stream.Read(readingData, 0, readingData.Length);
                    completeMessage.AppendFormat("{0}", Encoding.UTF8.GetString(readingData, 0, numberOfBytesRead));
                    string data = completeMessage.ToString();
                    var obj = JsonConvert.DeserializeObject<Root>(data);
                    string str1 = "CounterEvent";
                    string str2 = "Statistics";
                    SqlCommand myCommand = conn.CreateCommand();
                    if (data.Contains(str1))
                    {
 
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine("*****Событие*****");
                        Console.WriteLine("ID устройства: " + address);
                        Console.WriteLine("Время: " + obj.CounterEvent.Time.ToString());
                        Console.WriteLine("Скорость: " + obj.CounterEvent.Speed.ToString());
                        Console.WriteLine("Класс ТС: " + obj.CounterEvent.Class.ToString());
                        Console.WriteLine("Номер рамки: " + obj.CounterEvent.AreaID.ToString());
                        Console.ResetColor();
                        Console.WriteLine("Номер записи(count) = " + count);
 
                        string id = Convert.ToString(address);
                        string time = Convert.ToString(obj.CounterEvent.Time.ToString());
                        string speed = Convert.ToString(obj.CounterEvent.Speed.ToString());
                        string classTs = Convert.ToString(obj.CounterEvent.Class.ToString());
                        string numArea = Convert.ToString(obj.CounterEvent.AreaID.ToString());
                        string CounterID = Convert.ToString(obj.CounterEvent.CounterID.ToString());
 
                        myCommand.CommandText = "INSERT INTO CounterEvent (AreaID, Class, CounterID, Speed, device, Time) VALUES (@AreaID, @Class, @CounterID, @Speed, @device, @Time)";
                        myCommand.Parameters.Add("@AreaID", SqlDbType.Int, 10);
                        myCommand.Parameters["@AreaID"].Value = numArea;
                        myCommand.Parameters.Add("@Class", SqlDbType.NVarChar, 10);
                        myCommand.Parameters["@Class"].Value = classTs;
                        myCommand.Parameters.Add("@CounterID", SqlDbType.NVarChar, 10);
                        myCommand.Parameters["@CounterID"].Value = CounterID;
                        myCommand.Parameters.Add("@Speed", SqlDbType.NVarChar, 20);
                        myCommand.Parameters["@Speed"].Value = speed;
                        myCommand.Parameters.Add("@Time", SqlDbType.DateTime, 50);
                        myCommand.Parameters["@Time"].Value = time;
                        myCommand.Parameters.Add("@device", SqlDbType.NVarChar, 50);
                        myCommand.Parameters["@device"].Value = id;
                        int Uspeh = myCommand.ExecuteNonQuery();
                        conn.Close();
                    }
                    else
                        if (data.Contains(str2))
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("****Статистика****");
                        Console.WriteLine("ID устройства: " + address);
                        Console.ResetColor();
                        Console.WriteLine("Номер записи(count) = " + count);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
 
    public class CounterEvent
    {
        public int AreaID { get; set; }
        public int Class { get; set; }
        public int CounterID { get; set; }
        public double Speed { get; set; }
        public DateTime Time { get; set; }
    }
 
    public class Statistics
    {
        public int AreaID { get; set; }
        public List<int> CarsBackward { get; set; }
        public List<int> CarsForward { get; set; }
        public int CounterID { get; set; }
        public double Density { get; set; }
        public double DistanceAvg { get; set; }
        public double DistanceDev { get; set; }
        public int FullnessAvg { get; set; }
        public int FullnessDev { get; set; }
        public double GapAvg { get; set; }
        public double GapDev { get; set; }
        public double Intensity { get; set; }
        public double SpeedAvg { get; set; }
        public double SpeedDev { get; set; }
    }
 
    public class Root
    {
        public CounterEvent CounterEvent { get; set; }
        public Statistics Statistics { get; set; }
    }
}
Что я хочу в итоге сделать: автоматически подгружать из базы список устройств и параллельно к ним подключаться, и соответственно обрабатывать json с каждого устройства параллельно. Помогите пожалуйста разобраться с этим. Так же хочу сделать функционал, при котором при "зависании устройства", "невозможности подключения" автоматически отправлялась команда не перезагрузку по такой ссылке http://ip:6738/reload
rushaks вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка JSON AFA JavaScript, Ajax 22 24.03.2015 16:11
проконсультируйте по wifi устройствам NSvirus Компьютерное железо 4 25.03.2014 13:30
Приём и обработка JSON в POST Anarchist666 ASP.NET 1 01.07.2013 14:20
вопросы по основным устройствам ПК nastya_m Помощь студентам 4 05.12.2011 23:35
Обработка Json Велесей Общие вопросы по Java, Java SE, Kotlin 5 18.07.2011 12:46