예제 #1
0
        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);
        }
예제 #2
0
        //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);
        }
예제 #3
0
        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}");
                }
            }
        }
예제 #4
0
        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);
        }