private StationData parsing_data_string(DateString dateString) { string[][] id = Agent.Agency.Context.Fields; string line_src = dateString.Line; StationData res = new StationData { StationId = -1, NodeId = -1 }; //результирующий объект для вывода //номер станции Match match = Regex.Match(line_src, @"^[\d]{5}"); // 5 подряд идущих цифр с начала строки if (match.Success) { res.StationId = Convert.ToInt32(match.Value); } //номер узла станции Regex regex = new Regex(@"[\d]{5}"); // 5 подряд идущих цифр match = regex.Match(line_src, 5, 5); // поиск по шаблону, начиная с 5-го символа строки, поиск в 5 символах if (match.Success) { res.NodeId = Convert.ToInt32(match.Value); } if (!(res.StationId < 0) && !(res.NodeId < 0)) { //----- Датчики string pattern_decimal = @"-?\d+(\.\d+)?"; res.Time = dateString.Time; //int i = 0; string cur_pattern; for (int i = 0; i < id[0].Length - 2; i++) { cur_pattern = $"{id[0][i]}{pattern_decimal}"; PropertyInfo info = res.GetType().GetProperty($"Fid{i:d2}"); if (id[1][i] != "float") { int?val = (int?)find_sensor(dateString.Line, cur_pattern); info.SetValue(res, val); } else { float?val = (float?)find_sensor(dateString.Line, cur_pattern); info.SetValue(res, val); } } //10 --- время приема пакета tcp-сервером (в мс) ----- res.TcpTime = GetMsFromTime(dateString.Time); //11 --- время выдачи строки из буфера (в мс) ---- cur_pattern = $"{id[0][11]}{pattern_decimal}"; res.GetSTime = (int)find_sensor(dateString.Line, cur_pattern); } else { res = null; } return(res); }
//parser -------------------------------------------------------------- public bool ParseInputString(Startmode mode) { bool res = false; switch (mode) { case Startmode.Setup: res = true; break; case Startmode.Main: DateString dstr = Agent.Agency.Context.InputStrings.GetItem() as DateString; if (dstr != null) { int t = DeltaTimeMs(GetMsFromTime(dstr.Time)); //время (в мс) нахождения строки принятых данных в буфере (с учетом lock`а) dstr.Line = $"{dstr.Line}-gets{t}"; //убрать отсюда, убрать из парсинга и ниже вместо "+ dbset.GetSTime)" написать "+ t)" //WriteLog($"{RefAgent.Name}: in->{dstr.Line}"); Match match = Regex.Match(dstr.Line, @"^[\d]{5}"); // 5 подряд идущих цифр с начала строки if (!match.Success) { Writeln(dstr.Line); } StationData dbset = parsing_data_string(dstr); if (dbset != null) { dbset.PutDbTime = DeltaTimeMs(dbset.TcpTime + dbset.GetSTime); //время (в мс) парсинга строки агентом Agent.Agency.Context.StationDataBuffer.PutItem(dbset); //для сравнения //string out_str = parsing_data_string_to_str(dstr.Line); //string from_db_str = join_string_from_db(set, dstr.Line.Substring(0, 7)); //WriteLog($"{RefAgent.Name}: out->{out_str}\n{RefAgent.Name}: -db->{from_db_str}"); } else { WriteLog($"{Agent.Name}: out->!!! -Drop- {dstr.Line}"); } } else { //буфер опустел //если режим не Infinity(бесконечный), агент завершает работу if (Agent.Mode == AgentMode.NotEmptyBuffer) { WriteLog($"{Agent.Name}.{Agent.Role.Name} режим{Agent.Mode}: завершена работа по причине -= буфер пуст =- "); break; } } res = true; break; default: res = true; break; } return(res); }
private void receiveStationData(IAsyncResult tcpList) { var tcp_listener = tcpList.AsyncState as TcpListener; //аналог = (TcpListener) tcpList.AsyncState; if (tcp_listener != null) { try { // пробуем получить текущего клиента и что то с ним делаем var client = tcp_listener.EndAcceptTcpClient(tcpList); int time_ms = DateTime.Now.Millisecond; // получаем сетевой поток для чтения и записи NetworkStream stream = client.GetStream(); byte[] data = new byte[256]; StringBuilder response = new StringBuilder(); do { int bytes = stream.Read(data, 0, data.Length); response.Append(Encoding.UTF8.GetString(data, 0, bytes)); }while (stream.DataAvailable); // пока данные есть в потоке // закрываем поток stream.Close(); //!!!!! м.б. его и не надо закрывать - уточнить!!!!! закрываем подключение //client.Close(); //Полученную строку данных снабжаем текущим временем сервера DateString dstr = new DateString(); //dstr.Time = new DateTime(); dstr.Time = DateTime.Now; //str.Line = $"{++str_cnt:d5}: {str.Line}"; dstr.Line = response.ToString(); //+$"-tcp{dstr.Time}"); Agent.Agency.Context.InputStrings.PutItem(dstr); //Writeln($"{response.ToString()}"); //Writeln(string.Format("Accept {0}", client)); //принимаем следующего клиента tcp_listener.BeginAcceptTcpClient(receiveStationData, tcp_listener); } catch (Exception e) { WriteLog($"{Agent.Name}.{Agent.Role}: Оборван сеанс связи со шлюзом с сообщением: {e.Message}"); } } }
private StationData ____parsing_data_string_old(DateString dateString) { string[] id = { "idto", "crat", // 1-f "icrh", // 2-f "crdp", // 3-f "crpa", "crwd", "crws", "crcl", "crhc", "crhv", "tcp", "gets" }; // float и int - @"icrh-?\d+(\.\d+)?" //string str_num = dateString.Line.Substring(0, 7); string line_src = dateString.Line; //.Remove(0, 7); StationData res = new StationData { StationId = -1, NodeId = -1 }; //результирующий объект для вывода //номер станции Match match = Regex.Match(line_src, @"^[\d]{5}"); // 5 подряд идущих цифр с начала строки if (match.Success) { res.StationId = Convert.ToInt32(match.Value); } //номер узла станции Regex regex = new Regex(@"[\d]{5}"); // 5 подряд идущих цифр match = regex.Match(line_src, 5, 5); // поиск по шаблону, начиная с 5-го символа строки, поиск в 5 символах if (match.Success) { res.NodeId = Convert.ToInt32(match.Value); } if (!(res.StationId < 0) && !(res.NodeId < 0)) { //----- Датчики string pattern_decimal = @"-?\d+(\.\d+)?"; int i = 0; res.Time = dateString.Time; //0 -------- idto ---------- string cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid00 = (int?)find_sensor(dateString.Line, cur_pattern); //Idto i++; //1 -------- crat - float -------- cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid01 = find_sensor(dateString.Line, cur_pattern); //Crat i++; //2 -------- icrh ---------- cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid02 = (float?)find_sensor(dateString.Line, cur_pattern); //Icrh i++; //3 -------- crdp - float -------- cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid03 = find_sensor(dateString.Line, cur_pattern); //Crdp i++; //4 -------- crpa ---------- cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid04 = (int?)find_sensor(dateString.Line, cur_pattern); //Crpa i++; //5 -------- crwd ---------- cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid05 = (int?)find_sensor(dateString.Line, cur_pattern); //Crwd i++; //6 -------- crws ---------- cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid06 = (int?)find_sensor(dateString.Line, cur_pattern); //Crws i++; //7 -------- crcl ---------- cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid07 = (int?)find_sensor(dateString.Line, cur_pattern); //Crcl i++; //8 -------- crhc ---------- cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid08 = (int?)find_sensor(dateString.Line, cur_pattern); //Crhc i++; //9 -------- crhv ---------- cur_pattern = $"{id[i]}{pattern_decimal}"; res.Fid09 = (int?)find_sensor(dateString.Line, cur_pattern); //Crhv i++; //10 --- время приема пакета tcp-сервером ----- //cur_pattern = $"{id[i]}{pattern_decimal}"; //res.TcpTime = (int)find_sensor(dateString.Line, cur_pattern); res.TcpTime = GetMsFromTime(dateString.Time); i++; //11 --- время выдачи строки из буфера ---- cur_pattern = $"{id[i]}{pattern_decimal}"; res.GetSTime = (int)find_sensor(dateString.Line, cur_pattern); } else { res = null; } return(res); }