Приветствую форумчан!
Помогите пожалуйста разобраться в реализации следующей идеи:
Есть устройства (видеодетекторы), которые при подключении на порт выплевывают 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