private List <CReportData> GetWaterData(IList <string> dataSegs, DateTime recvTime)
        {
            var result = new List <CReportData>();

            foreach (var item in dataSegs)
            {
                CReportData data = new CReportData();
                //  解析时间
                data.Time = recvTime;
                //  解析电压  无电压设置为0
                data.Voltge = 0;
                //解析数据
                //  水位
                //  解析水位  4(整数位) + 2(小数位)  单位m
                Decimal water = Decimal.Parse(item.Substring(0, 6)) * (Decimal)0.01;
                data.Water = water;
                //  水势  暂时用不上
                Decimal waterPot = Decimal.Parse(item.Substring(6, 1));
                //  精度
                Int32 accuracy = Int32.Parse(item.Substring(7, 1));
                //  有效数
                Decimal EffectiveNum = Decimal.Parse(item.Substring(8, 3));
                //  流量  暂时不传
                Decimal waterflow = EffectiveNum * (10 ^ (accuracy - 3));
                //  测流方法
                String MeasureType = item.Substring(11, 1);

                result.Add(data);
            }
            return(result);
        }
        //解析数据段
        private bool GetData(string data, DateTime recvTime, decimal voltage, EStationType stationType, out CReportData report)
        {
            report = new CReportData();
            try
            {//  解析时间
                report.Time = recvTime;

                //  解析电压  2(整数位) + 2(小数位)  单位V
                report.Voltge = voltage;

                // 此处根据站点类型类判断是否需要解析相应的数据,避免因为非必要字段导致的异常信息
                //  解析水位  4(整数位) + 2(小数位)  单位m
                //  解析雨量                         单位mm,未乘以精度
                //  初始化雨量,水位,电压值
                //  雨量  包含雨量Rain
                //  水文  包含雨量Rain,水位Water
                //  水位  包含水位Water
                switch (stationType)
                {
                case EStationType.ERainFall:
                {
                    //  雨量
                    //  解析雨量                         单位mm,未乘以精度
                    Decimal rain = Decimal.Parse(data.Substring(6, 4));
                    report.Rain = rain;
                } break;

                case EStationType.EHydrology:
                {
                    //  水文
                    //  解析雨量                         单位mm,未乘以精度
                    Decimal rain = Decimal.Parse(data.Substring(6, 4));
                    //  解析水位  4(整数位) + 2(小数位)  单位m
                    Decimal water = Decimal.Parse(data.Substring(0, 6)) * (Decimal)0.01;
                    report.Rain  = rain;
                    report.Water = water;
                }
                break;

                case EStationType.ERiverWater:
                {
                    //  水位
                    //  解析水位  4(整数位) + 2(小数位)  单位m
                    Decimal water = Decimal.Parse(data.Substring(0, 6)) * (Decimal)0.01;
                    report.Water = water;
                    break;
                }

                default: break;
                }

                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine(exp.Message);
            }
            return(false);
        }
        /// <summary>
        /// 解析站点数据内容
        /// 示例数据:090227080012345600011260
        /// 0902270800      10位数据时报
        /// 123456          6位水位
        /// 0001            4位雨量
        /// 1260            4位电压
        /// </summary>
        /// <param name="data">数据</param>
        /// <param name="stype">站类</param>
        /// <returns></returns>
        public static CReportData GetData(string data, string stype)
        {
            try
            {
                //  判断数据段长度是否为24
                Debug.Assert(data.Length == 24, "数据时报+水位+雨量+电压 的总长度为14");

                Debug.WriteLine(data);

                var result = new CReportData()
                {
                    Time = new DateTime(
                        year: Int32.Parse("20" + data.Substring(0, 2)), //  年
                        month: Int32.Parse(data.Substring(2, 2)),       //  月
                        day: Int32.Parse(data.Substring(4, 2)),         //  日
                        hour: Int32.Parse(data.Substring(6, 2)),        //  时
                        minute: Int32.Parse(data.Substring(8, 2)),      //  分
                        second: 0),                                     //  秒

                    Voltge = Int32.Parse(data.Substring(20, 4))         //  电压
                };

                int water = Int32.Parse(data.Substring(10, 6));         //  水位
                int rain  = Int32.Parse(data.Substring(16, 4));         //  雨量


                //  雨量  站类为01        包含雨量Rain
                //  水文  站类为12,13    包含雨量Rain,水位Water
                //  水位  站类为02,03    包含水位Water
                switch (stype)
                {
                case "01":      //  雨量
                    result.Rain = rain;
                    break;

                case "12":      //  并行水文
                case "13":      //  串行水文
                    result.Rain  = rain;
                    result.Water = water;
                    break;

                case "02":      //  并行水位
                case "03":      //  串行水位
                    result.Water = water;
                    break;
                }

                return(result);
            }
            catch (Exception exp)
            {
                throw exp;
            }
        }
        /// <summary>
        /// 解析站点数据内容
        /// 示例数据:090227080012345600011260
        /// 0902270800      10位数据时报
        /// 123456          6位水位
        /// 0001            4位雨量
        /// 1260            4位电压
        /// </summary>
        /// <param name="data">数据</param>
        /// <param name="stationType">站类</param>
        /// <param name="report"></param>
        /// <returns></returns>
        private bool GetData(string data, EStationType stationType, out CReportData report)
        {
            report = new CReportData();
            try
            {
                //  解析时间
                report.Time = new DateTime
                              (
                    year: Int32.Parse("20" + data.Substring(0, 2)),     //  年
                    month: Int32.Parse(data.Substring(2, 2)),           //  月
                    day: Int32.Parse(data.Substring(4, 2)),             //  日
                    hour: Int32.Parse(data.Substring(6, 2)),            //  时
                    minute: Int32.Parse(data.Substring(8, 2)),          //  分
                    second: 0                                           //  秒
                              );
                //  解析电压  2(整数位) + 2(小数位)  单位V
                Decimal Voltge = Decimal.Parse(data.Substring(20, 4)) * (Decimal)0.01;
                //  解析水位  4(整数位) + 2(小数位)  单位m
                Decimal water = Decimal.Parse(data.Substring(10, 6)) * (Decimal)0.01;
                //  解析雨量                         单位mm,未乘以精度
                Decimal rain = Decimal.Parse(data.Substring(16, 4));

                //  初始化雨量,水位,电压值
                //  雨量  包含雨量Rain
                //  水文  包含雨量Rain,水位Water
                //  水位  包含水位Water
                switch (stationType)
                {
                case EStationType.ERainFall:       //  雨量
                    report.Rain = rain; break;

                case EStationType.EHydrology:      //  水文
                    report.Rain  = rain;
                    report.Water = water;
                    break;

                case EStationType.ERiverWater:     //  水位
                    report.Water = water; break;

                default: break;
                }
                report.Voltge = Voltge;

                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine(exp.Message);
            }
            return(false);
        }
        /// <summary>
        /// 读取加报报文的数据内容,加报报类:21
        /// 加报仅有1条数据
        /// </summary>
        /// <param name="dataSegs"></param>
        /// <param name="recvTime"></param>
        /// <param name="stationType"></param>
        /// <returns></returns>
        private List <CReportData> GetAddData(IList <string> dataSegs, DateTime recvTime, EStationType stationType)
        {
            var result = new List <CReportData>();

            foreach (var item in dataSegs)
            {
                CReportData data = new CReportData();
                //  解析时间
                data.Time = recvTime;
                //  根据站点类型解析数据
                switch (stationType)
                {
                case EStationType.ERainFall:
                {
                    //  雨量
                    //  解析雨量                         单位mm,未乘以精度
                    Decimal rain = Decimal.Parse(item.Substring(6, 4));
                    data.Rain = rain;
                }
                break;

                case EStationType.EHydrology:
                {
                    //  水文
                    //  解析雨量                         单位mm,未乘以精度
                    Decimal rain = Decimal.Parse(item.Substring(6, 4));
                    //  解析水位  4(整数位) + 2(小数位)  单位m
                    Decimal water = Decimal.Parse(item.Substring(0, 6)) * (Decimal)0.01;
                    data.Rain  = rain;
                    data.Water = water;
                }
                break;

                case EStationType.ERiverWater:
                {
                    //  水位
                    //  解析水位  4(整数位) + 2(小数位)  单位m
                    Decimal water = Decimal.Parse(item.Substring(0, 6)) * (Decimal)0.01;
                    data.Water = water;
                    break;
                }

                default: break;
                }
                //解析电压 2(整数位)+ 2(小数位) 单位 V
                Decimal voltage = Decimal.Parse(item.Substring(10, 4)) * (Decimal)0.01;
                data.Voltge = voltage;
                result.Add(data);
            }
            return(result);
        }
Beispiel #6
0
        private List <CReportData> GetData(IList <string> dataSegs, EStationType stationType)
        {
            var result = new List <CReportData>();

            foreach (var item in dataSegs)
            {
                CReportData data = new CReportData();
                if (GetData(item, stationType, out data))
                {
                    result.Add(data);
                }
            }
            return(result);
        }
        /// <summary>
        /// 针对后面的连续数据项,逐个数据项进行填充,最后将数据结果作为list返回。
        /// </summary>
        /// <param name="list">原数据字符串</param>
        /// <param name="recvtime">接收数据时间,作为数据项的起始时间逐个往前推算。</param>
        /// <param name="voltage">电压值,每个数据项都要填充上电压信息</param>
        /// <param name="stationType">站点类型,作为读取数据部分的依据:需要读取雨量还是水位信息。</param>
        /// <returns>列表形式的数据集</returns>
        private List <CReportData> GetData(string list, DateTime recvtime, Decimal voltage, EStationType stationType)
        {
            var    result = new List <CReportData>();
            string tmp;

            for (int i = 0; i < 12; i++)
            {
                CReportData data = new CReportData();
                tmp = list.Substring(i * 10, 10);
                if (FillData(tmp, recvtime, voltage, stationType, out data))
                {
                    result.Add(data);
                }
                recvtime = recvtime.AddMinutes(-5);
            }
            return(result);
        }
        /// <summary>
        /// 单个数据项读取函数
        /// </summary>
        /// <param name="data">原始数据信息</param>
        /// <param name="recvtime">接收时间</param>
        /// <param name="voltage">电压信息</param>
        /// <param name="stationType">站点类型,作为读取数据的依据</param>
        /// <param name="report">作为返回的结果</param>
        /// <returns>填充成功与否</returns>
        private bool FillData(string data, DateTime recvtime, Decimal voltage, EStationType stationType, out CReportData report)
        {
            report = new CReportData();
            try
            {
                //时间
                report.Time = recvtime;
                //电压
                report.Voltge = voltage;
                //根据站类读取相应的数据
                switch (stationType)
                {
                //水位站只要读水位信息
                case EStationType.ERiverWater:
                    report.Water = Decimal.Parse(data.Substring(0, 6)) * (Decimal)0.01;
                    break;

                //雨量站只要读雨量信息
                case EStationType.ERainFall:
                    report.Rain = Decimal.Parse(data.Substring(6, 4));
                    break;

                //水文站要读水位信息和雨量信息
                case EStationType.EHydrology:
                    report.Water = Decimal.Parse(data.Substring(0, 6)) * (Decimal)0.01;
                    report.Rain  = Decimal.Parse(data.Substring(6, 4));
                    break;

                default:
                    System.Diagnostics.Debug.WriteLine("解析XYJBX信息中站点类别有误!");
                    break;
                }
                return(true);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.Message);
                return(false);
            }
        }
Beispiel #9
0
        /// <summary>
        /// 处理6个报文
        /// </summary>
        /// <param name="list"></param>
        /// <param name="recvtime"></param>
        /// <param name="voltage"></param>
        /// <param name="stationType"></param>
        /// <returns></returns>
        private List <CReportData> GetData_1(string list, DateTime recvtime, decimal voltage, EStationType stationType)
        {
            var    result = new List <CReportData>();
            string tmp;

            for (int i = 0; i < 6; i++)
            {
                CReportData data = new CReportData();
                if (list.Length >= (i * 10 + 10))
                {
                    tmp = list.Substring(i * 10, 10);
                    if (FillData(tmp, recvtime, voltage, stationType, out data))
                    {
                        result.Add(data);
                    }
                    recvtime = recvtime.AddMinutes(-5);
                }
            }
            // 将结果中的数据顺序逆置
            result.Reverse();
            return(result);
        }
 //解析数据段
 private bool GetProData(int intervalMin, string data, DateTime recvtime, decimal voltage, out CReportData report)
 {
     report = new CReportData();
     try
     {
         //解析数据相关信息
         //解析时间
         report.Time = recvtime;
         //解析电压 2(整数位)+ 2(小数位) 单位 V
         report.Voltge = voltage;
         //解析水位 4(整数位)+ 2(小数位) 单位m
         //因为是定制水位定时报,所以只用解析水位数据
         Decimal water = Decimal.Parse(data) * (Decimal)0.01;
         report.Water = water;
         return(true);
     }
     catch (Exception exp)
     {
         System.Diagnostics.Debug.WriteLine(exp.Message);
     }
     return(false);
 }
        private List <CReportData> GetData(IList <string> lists, DateTime recvtime, decimal voltage, EStationType stationType)
        {
            var result = new List <CReportData>();

            foreach (var item in lists)
            {
                string itemData    = item;
                string itemProcess = item;
                for (int i = 1; i <= 12; i++)
                {
                    CReportData data = new CReportData();
                    itemProcess = itemData.Substring(0, 10);
                    if (GetData(itemProcess, recvtime, voltage, stationType, out data))
                    {
                        result.Add(data);
                    }
                    recvtime = recvtime.AddMinutes(-5);
                    itemData = itemData.Substring(10);
                }
            }
            return(result);
        }
        private List <CReportData> GetProData(int intervalMin, int dataNum, IList <string> lists, DateTime recvtime, decimal voltage)
        {
            var result = new List <CReportData>();

            foreach (var item in lists)
            {
                string itemData    = item;
                string itemProcess = itemData;
                for (int i = 1; i <= dataNum; i++)
                {
                    CReportData data = new CReportData();
                    itemProcess = itemData.Substring(0, 6);
                    if (GetProData(intervalMin, itemProcess, recvtime, voltage, out data))
                    {
                        result.Add(data);
                    }
                    recvtime = recvtime.AddMinutes(-1);
                    itemData = itemData.Substring(6);
                }
            }
            return(result);
        }
        private List <CReportData> GetMannualData(IList <string> dataSegs, DateTime recvTime)
        {
            var result = new List <CReportData>();

            foreach (var item in dataSegs)
            {
                CReportData data = new CReportData();
                //  解析时间
                data.Time = recvTime;
                //  解析电压  无电压设置为0
                data.Voltge = 0;
                //解析数据
                //  水位
                //  解析水位  4(整数位) + 2(小数位)  单位m
                Decimal water = Decimal.Parse(item.Substring(0, 6)) * (Decimal)0.01;
                data.Water = water;
                //  水势  暂时用不上
                Decimal waterPot = Decimal.Parse(item.Substring(6, 2));

                result.Add(data);
            }
            return(result);
        }
Beispiel #14
0
        public bool Parse(string msg, out CReportStruct report)
        {
            report = new CReportStruct();
            List <CReportData>    dataList     = new List <CReportData>();
            List <CReportPwdData> dataPwdList  = new List <CReportPwdData>();
            List <CReportFsfx>    dataFsfxList = new List <CReportFsfx>();

            try
            {
                string data = string.Empty;
                //去除起始符'$'
                if (!ProtocolHelpers.DeleteSpecialCharLong(msg, out data))
                {
                    return(false);
                }
                //站号(4位)
                string StationId = data.Substring(0, 10).Trim();
                //长度:1G
                string length = data.Substring(10, 4);

                DateTime recvTime;
                recvTime = new DateTime(
                    year: Int32.Parse("20" + data.Substring(14, 2)),
                    month: Int32.Parse(data.Substring(16, 2)),
                    day: Int32.Parse(data.Substring(18, 2)),
                    hour: Int32.Parse(data.Substring(20, 2)),
                    minute: Int32.Parse(data.Substring(22, 2)),
                    second: 0
                    );
                //上下行标志
                string type = data.Substring(24, 2);

                //报类(2位):22-定时报
                string reportTypeString = data.Substring(26, 2);

                //站类
                string stationTypeString = data.Substring(28, 2);

                //水位
                string  waterStr = data.Substring(30, 6);
                Decimal?water;
                if (waterStr.Contains("?"))
                {
                    water = null;
                }
                else
                {
                    water = Decimal.Parse(waterStr) / 100;
                }

                //雨量
                string  rainStr = data.Substring(36, 4);
                Decimal?rain;
                if (rainStr.Contains("?"))
                {
                    rain = null;
                }
                else
                {
                    rain = Decimal.Parse(rainStr) / 100;
                }
                //电压
                string  voltageStr = data.Substring(40, 4);
                Decimal?voltage;
                if (voltageStr.Contains("?"))
                {
                    voltage = null;
                }
                else
                {
                    voltage = Decimal.Parse(voltageStr) / 100;
                }

                //报类
                EMessageType reportType;
                reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                //站类
                EStationType stationType;
                stationType = ProtocolMaps.StationTypeMap.FindKey(stationTypeString);

                report.Stationid   = StationId;
                report.Type        = type;
                report.ReportType  = reportType;
                report.StationType = stationType;
                report.RecvTime    = recvTime;

                string allElmtData = data.Substring(44);
                //1.处理风速风向数据和散射仪数据
                CReportData    speedData = new CReportData();
                CReportPwdData pwdData   = new CReportPwdData();
                CReportFsfx    fsfxData  = new CReportFsfx();
                //1.1 风速风向信息
                int flagIndex = allElmtData.IndexOf("@@  EN2B");
                if (flagIndex >= 0)
                {
                    int    keyLength = int.Parse(allElmtData.Substring(flagIndex + 8, 4));
                    string elmtData  = allElmtData.Substring(flagIndex, keyLength);
                    //判定要素1的开始符号和结束符号
                    if (elmtData.StartsWith("@@  EN2B") && elmtData.EndsWith("**"))
                    {
                        elmtData = elmtData.Substring(12, keyLength - 14).Trim();
                        //判定时差法数据的开始符号和接受符号
                        if (elmtData.Length == (keyLength - 14))
                        {
                            CReportFsfx dataFsfx = new CReportFsfx();
                            try
                            {
                                string strtflag  = elmtData.Substring(0, 1);  //开始标志
                                string stationid = elmtData.Substring(1, 5);  //站点ID
                                string msgTime   = elmtData.Substring(6, 12); //时间
                                string shfx      = elmtData.Substring(18, 4); //瞬时风向
                                string shfs      = elmtData.Substring(22, 4); //顺时风速
                                string yxszdshfx = elmtData.Substring(26, 4); //一小时最大瞬时风向
                                string yxszdshfs = elmtData.Substring(30, 4); //一小时最大瞬时风速
                                string maxTime   = elmtData.Substring(34, 4); //一小时最大瞬时风速出现时间
                                string avg2fx    = elmtData.Substring(38, 4); //2分钟平均风向
                                string avg2fs    = elmtData.Substring(42, 4); //2分钟平均风速
                                string avg10fx   = elmtData.Substring(46, 4); //10分钟平均风向
                                string avg10fs   = elmtData.Substring(50, 4); //10分钟平均风速
                                string max10fx   = elmtData.Substring(54, 4); //10分钟平均最大风向
                                string max10fs   = elmtData.Substring(58, 4); //10分钟平均最大风速
                                string max10tm   = elmtData.Substring(62, 4); //10分钟最大风速出现时间

                                fsfxData.Water     = water;
                                fsfxData.Time      = recvTime;
                                fsfxData.shfx      = decimal.Parse(shfx);
                                fsfxData.shfs      = decimal.Parse(shfx) / 10;
                                fsfxData.yxszdshfx = decimal.Parse(yxszdshfx);
                                fsfxData.yxszdshfs = decimal.Parse(shfx) / 10;
                                fsfxData.maxTime   = new DateTime(recvTime.Year, recvTime.Month, recvTime.Day, int.Parse(maxTime.Substring(0, 2)), int.Parse(maxTime.Substring(2, 2)), 0);
                                fsfxData.avg2fx    = decimal.Parse(avg2fx);
                                fsfxData.avg2fs    = decimal.Parse(avg2fs) / 10;
                                fsfxData.avg10fx   = decimal.Parse(avg10fx);
                                fsfxData.avg10fs   = decimal.Parse(avg10fs) / 10;
                                fsfxData.max10fx   = decimal.Parse(max10fx);
                                fsfxData.max10fs   = decimal.Parse(max10fs) / 10;
                                fsfxData.max10tm   = new DateTime(recvTime.Year, recvTime.Month, recvTime.Day, int.Parse(max10tm.Substring(0, 2)), int.Parse(max10tm.Substring(2, 2)), 0);
                                fsfxData.Voltge    = voltage;
                                dataFsfxList.Add(fsfxData);
                            }
                            catch (Exception e)
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            return(false);
                            //11开头  99结束
                        }
                        report.fsfxDatas = dataFsfxList;
                    }
                    else
                    {
                        return(false);
                        //TODO 要素1开始符号和结束符合不匹配
                    }
                }
                //1.2 散射仪数据
                //015057203031023033202F2F2F2F2F2F202F2F2F2F2F030D0A
                int flagIndex2 = allElmtData.IndexOf("@@   PWD");
                if (flagIndex2 >= 0)
                {
                    int    keyLength = int.Parse(allElmtData.Substring(flagIndex2 + 8, 4));
                    string elmtData  = allElmtData.Substring(flagIndex2, keyLength);
                    if (elmtData.StartsWith("@@   PWD") && elmtData.EndsWith("**"))
                    {
                        elmtData = elmtData.Substring(12, keyLength - 14).Trim();
                        elmtData = elmtData.Substring(0, elmtData.Length - 1).Trim();
                        elmtData = new System.Text.RegularExpressions.Regex("[\\s]+").Replace(elmtData, " ");
                        string[] elmtDataList = elmtData.Split(' ');
                        pwdData.Time = recvTime;
                        try
                        {
                            pwdData.Visi1min = decimal.Parse(elmtDataList[2].Trim());
                        }
                        catch
                        {
                            pwdData.Visi1min = null;
                        }
                        try
                        {
                            pwdData.Visi10min = decimal.Parse(elmtDataList[3]);
                        }
                        catch
                        {
                            pwdData.Visi10min = null;
                        }

                        pwdData.Voltge = voltage;
                        dataPwdList.Add(pwdData);
                    }
                    else
                    {
                        return(false);
                    }

                    report.pwdDatas = dataPwdList;
                    //report.Datas = dataList;
                }
            }
            catch (Exception eee)
            {
                return(false);
            }
            return(true);
        }
        //23001G221812291500????12980064@@Z1001234Z2001234Z3001234Z4001234Z5001234Z6001234Z7001234Z8001234\r\n
        public bool Parse(String msg, out List <CReportStruct> reportList)
        {
            reportList = new List <CReportStruct>();
            CReportStruct report = new CReportStruct();

            try
            {
                //站号(4位)
                string StationId = msg.Substring(0, 4);
                //类别(2位):1G
                string type = msg.Substring(4, 2);
                //报类(2位):22-定时报
                string reportTypeString = msg.Substring(6, 2);

                EMessageType reportType;
                EStationType stationType;
                DateTime     recvTime;
                Decimal      Voltage = 0;
                Decimal      rain    = 0;

                switch (reportTypeString)
                {
                case "21":
                case "22":
                    reportType  = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                    stationType = EStationType.EReservoir;
                    recvTime    = new DateTime(
                        year: Int32.Parse("20" + msg.Substring(8, 2)),
                        month: Int32.Parse(msg.Substring(10, 2)),
                        day: Int32.Parse(msg.Substring(12, 2)),
                        hour: Int32.Parse(msg.Substring(14, 2)),
                        minute: Int32.Parse(msg.Substring(16, 2)),
                        second: 0
                        );
                    try
                    {
                        rain = Decimal.Parse(msg.Substring(18, 4));
                    }
                    catch (Exception e)
                    {
                        rain = -1;
                    }
                    try
                    {
                        Voltage = Decimal.Parse(msg.Substring(22, 4)) * (Decimal)0.01;
                    }catch (Exception e)
                    {
                        Voltage = 0;
                    }

                    if (msg.Contains("@@"))
                    {
                        int flagIndex = msg.IndexOf("@@");
                        if (flagIndex > 0)
                        {
                            //水位1
                            int    stationId1 = int.Parse(StationId);
                            string waterStr1  = msg.Substring(flagIndex + 2, 8);
                            if (waterStr1 != "-2000000")
                            {
                                Decimal water1 = decimal.Parse(waterStr1) * (Decimal)0.01;
                                if (water1 < 0 || water1 > 655)
                                {
                                    water1 = 0;
                                }
                                List <CReportData> datas = new List <CReportData>();
                                CReportData        data  = new CReportData();
                                data.Rain   = rain;
                                data.Voltge = Voltage;
                                data.Water  = water1;
                                data.Time   = recvTime;
                                datas.Add(data);
                                report = new CReportStruct()
                                {
                                    Stationid   = stationId1.ToString(),
                                    Type        = type,
                                    ReportType  = reportType,
                                    StationType = stationType,
                                    RecvTime    = DateTime.Now,
                                    Datas       = datas
                                };
                                reportList.Add(report);
                            }

                            //水位2
                            int    stationId2 = int.Parse(StationId) + 1;
                            string waterStr2  = msg.Substring(flagIndex + 2 + 8 * 1, 8);
                            if (waterStr2 != "-2000000")
                            {
                                Decimal water2 = decimal.Parse(waterStr2) * (Decimal)0.01;
                                if (water2 < 0 || water2 > 655)
                                {
                                    water2 = 0;
                                }
                                List <CReportData> datas = new List <CReportData>();
                                CReportData        data  = new CReportData();
                                data.Rain   = rain;
                                data.Voltge = Voltage;
                                data.Water  = water2;
                                data.Time   = recvTime;
                                datas.Add(data);
                                report = new CReportStruct()
                                {
                                    Stationid   = stationId2.ToString(),
                                    Type        = type,
                                    ReportType  = reportType,
                                    StationType = stationType,
                                    RecvTime    = DateTime.Now,
                                    Datas       = datas
                                };
                                reportList.Add(report);
                            }

                            //水位3
                            int    stationId3 = int.Parse(StationId) + 2;
                            string waterStr3  = msg.Substring(flagIndex + 2 + 8 * 2, 8);
                            if (waterStr3 != "-2000000")
                            {
                                Decimal water3 = decimal.Parse(waterStr3) * (Decimal)0.01;
                                if (water3 < 0 || water3 > 655)
                                {
                                    water3 = 0;
                                }
                                List <CReportData> datas = new List <CReportData>();
                                CReportData        data  = new CReportData();
                                data.Rain   = rain;
                                data.Voltge = Voltage;
                                data.Water  = water3;
                                data.Time   = recvTime;
                                datas.Add(data);
                                report = new CReportStruct()
                                {
                                    Stationid   = stationId3.ToString(),
                                    Type        = type,
                                    ReportType  = reportType,
                                    StationType = stationType,
                                    RecvTime    = DateTime.Now,
                                    Datas       = datas
                                };
                                reportList.Add(report);
                            }

                            //水位4
                            int    stationId4 = int.Parse(StationId) + 3;
                            string waterStr4  = msg.Substring(flagIndex + 2 + 8 * 3, 8);
                            if (waterStr4 != "-2000000")
                            {
                                Decimal water4 = decimal.Parse(waterStr4) * (Decimal)0.01;
                                if (water4 < 0 || water4 > 655)
                                {
                                    water4 = 0;
                                }
                                List <CReportData> datas = new List <CReportData>();
                                CReportData        data  = new CReportData();
                                data.Rain   = rain;
                                data.Voltge = Voltage;
                                data.Water  = water4;
                                data.Time   = recvTime;
                                datas.Add(data);
                                report = new CReportStruct()
                                {
                                    Stationid   = stationId4.ToString(),
                                    Type        = type,
                                    ReportType  = reportType,
                                    StationType = stationType,
                                    RecvTime    = DateTime.Now,
                                    Datas       = datas
                                };
                                reportList.Add(report);
                            }

                            //水位5
                            int    stationId5 = int.Parse(StationId) + 4;
                            string waterStr5  = msg.Substring(flagIndex + 2 + 8 * 4, 8);
                            if (waterStr5 != "-2000000")
                            {
                                Decimal water5 = decimal.Parse(waterStr5) * (Decimal)0.01;
                                if (water5 < 0 || water5 > 655)
                                {
                                    water5 = 0;
                                }
                                List <CReportData> datas = new List <CReportData>();
                                CReportData        data  = new CReportData();
                                data.Rain   = rain;
                                data.Voltge = Voltage;
                                data.Water  = water5;
                                data.Time   = recvTime;
                                datas.Add(data);
                                report = new CReportStruct()
                                {
                                    Stationid   = stationId5.ToString(),
                                    Type        = type,
                                    ReportType  = reportType,
                                    StationType = stationType,
                                    RecvTime    = DateTime.Now,
                                    Datas       = datas
                                };
                                reportList.Add(report);
                            }

                            //水位6
                            int    stationId6 = int.Parse(StationId) + 5;
                            string waterStr6  = msg.Substring(flagIndex + 2 + 8 * 5, 8);
                            if (waterStr6 != "-2000000")
                            {
                                Decimal water6 = decimal.Parse(waterStr6) * (Decimal)0.01;
                                if (water6 < 0 || water6 > 655)
                                {
                                    water6 = 0;
                                }
                                List <CReportData> datas = new List <CReportData>();
                                CReportData        data  = new CReportData();
                                data.Rain   = rain;
                                data.Voltge = Voltage;
                                data.Water  = water6;
                                data.Time   = recvTime;
                                datas.Add(data);
                                report = new CReportStruct()
                                {
                                    Stationid   = stationId6.ToString(),
                                    Type        = type,
                                    ReportType  = reportType,
                                    StationType = stationType,
                                    RecvTime    = DateTime.Now,
                                    Datas       = datas
                                };
                                reportList.Add(report);
                            }

                            //水位7
                            int    stationId7 = int.Parse(StationId) + 6;
                            string waterStr7  = msg.Substring(flagIndex + 2 + 8 * 6, 8);
                            if (waterStr7 != "-2000000")
                            {
                                Decimal water7 = decimal.Parse(waterStr7) * (Decimal)0.01;
                                if (water7 < 0 || water7 > 655)
                                {
                                    water7 = 0;
                                }
                                List <CReportData> datas = new List <CReportData>();
                                CReportData        data  = new CReportData();
                                data.Rain   = rain;
                                data.Voltge = Voltage;
                                data.Water  = water7;
                                data.Time   = recvTime;
                                datas.Add(data);
                                report = new CReportStruct()
                                {
                                    Stationid   = stationId7.ToString(),
                                    Type        = type,
                                    ReportType  = reportType,
                                    StationType = stationType,
                                    RecvTime    = DateTime.Now,
                                    Datas       = datas
                                };
                                reportList.Add(report);
                            }

                            //水位8
                            int    stationId8 = int.Parse(StationId) + 7;
                            string waterStr8  = msg.Substring(flagIndex + 2 + 8 * 7, 8);
                            if (waterStr8 != "-2000000")
                            {
                                Decimal water8 = decimal.Parse(waterStr8) * (Decimal)0.01;
                                if (water8 < 0 || water8 > 655)
                                {
                                    water8 = 0;
                                }
                                List <CReportData> datas = new List <CReportData>();
                                CReportData        data  = new CReportData();
                                data.Rain   = rain;
                                data.Voltge = Voltage;
                                data.Water  = water8;
                                data.Time   = recvTime;
                                datas.Add(data);
                                report = new CReportStruct()
                                {
                                    Stationid   = stationId8.ToString(),
                                    Type        = type,
                                    ReportType  = reportType,
                                    StationType = stationType,
                                    RecvTime    = DateTime.Now,
                                    Datas       = datas
                                };
                                reportList.Add(report);
                            }
                        }
                    }
                    break;

                default:
                    break;
                }
            }
            catch (Exception e)
            {
            }
            return(true);
        }
Beispiel #16
0
        /// <summary>
        /// 解析站点数据内容
        /// 示例数据:090227080012345600011260
        /// 0902270800      10位数据时报
        /// 123456          6位水位
        /// 0001            4位雨量
        /// 1260            4位电压
        ///
        /// </summary>
        /// <param name="data">数据</param>
        /// <param name="stationType">站类</param>
        /// <param name="report"></param>
        /// <returns></returns>
        private bool GetData(string data, EStationType stationType, out CReportData report)
        {
            report = new CReportData();
            try
            {
                //  解析时间
                report.Time = new DateTime
                              (
                    year: Int32.Parse("20" + data.Substring(0, 2)),     //  年
                    month: Int32.Parse(data.Substring(2, 2)),           //  月
                    day: Int32.Parse(data.Substring(4, 2)),             //  日
                    hour: Int32.Parse(data.Substring(6, 2)),            //  时
                    minute: Int32.Parse(data.Substring(8, 2)),          //  分
                    second: 0                                           //  秒
                              );


                Decimal Voltge, rain, water;

                //  解析电压  2(整数位) + 2(小数位)  单位V
                try
                {
                    Voltge = Decimal.Parse(data.Substring(20, 4)) * (Decimal)0.01;
                }catch (Exception e1)
                {
                    Voltge = -1;
                }

                // cln:20141110修改,此处根据站点类型类判断是否需要解析相应的数据,避免因为非必要字段导致的异常信息
                //  解析水位  4(整数位) + 2(小数位)  单位m
                //Decimal water = Decimal.Parse(data.Substring(10, 6)) * (Decimal)0.01;
                //  解析雨量                         单位mm,未乘以精度
                //Decimal rain = Decimal.Parse(data.Substring(16, 4));

                //  初始化雨量,水位,电压值
                //  雨量  包含雨量Rain
                //  水文  包含雨量Rain,水位Water
                //  水位  包含水位Water
                switch (stationType)
                {
                case EStationType.ERainFall:
                {
                    //  雨量
                    //  解析雨量                         单位mm,未乘以精度
                    try
                    {
                        rain = Decimal.Parse(data.Substring(16, 4));
                    }catch (Exception e)
                    {
                        rain = -1;
                    }
                    report.Rain = rain;
                } break;

                case EStationType.EHydrology:
                {
                    //  水文
                    //  解析雨量                         单位mm,未乘以精度
                    try
                    {
                        rain = Decimal.Parse(data.Substring(16, 4));
                    }
                    catch (Exception e)
                    {
                        rain = -1;
                    }
                    //  解析水位  4(整数位) + 2(小数位)  单位m
                    try
                    {
                        water = Decimal.Parse(data.Substring(10, 6)) * (Decimal)0.01;
                    }catch (Exception e)
                    {
                        water = -200;
                    }
                    report.Rain  = rain;
                    report.Water = water;
                }
                break;

                case EStationType.ERiverWater:
                {
                    //  水位
                    //  解析水位  4(整数位) + 2(小数位)  单位m
                    try
                    {
                        water = Decimal.Parse(data.Substring(10, 6)) * (Decimal)0.01;
                    }
                    catch (Exception e)
                    {
                        water = -200;
                    }
                    report.Water = water;
                    break;
                }

                default: break;
                }
                report.Voltge = Voltge;

                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine(exp.Message);
            }
            return(false);
        }
Beispiel #17
0
        /// <summary>
        /// 非卫星报文数据解析过程
        /// </summary>
        /// <param name="msg">原始报文数据</param>
        /// <param name="report">报文最终解析出的结果数据结构</param>
        /// <returns>是否解析成功</returns>
        public bool Parse(String msg, out CReportStruct report)
        {
            //2019年07月04日08时53分24秒(流速中,最高位为符号位,正数最高位为0,负数最高位为 -,小数位为三位!!!)
            //$      0001010919070408401G2172??????????1432@@  RG300062000195000000000000000000........................**
            //$      0001010919070408401G2172??????????1431@@  RG300062000195000000000000000000........................**
            //$      0001010919070408451G2172??????????1432@@  RG300062000000000000000000000000........................**
            //$      0001010919070408451G2172??????????1432@@  RG300062000000000000000000000000........................**
            //$      0001010919070408501G2172??????????1430@@  RG300062000000000000000000000000........................**
            report = new CReportStruct();
            List <CReportData> dataList = new List <CReportData>();

            try
            {
                string data = string.Empty;
                //去除起始符'$'
                if (!ProtocolHelpers.DeleteSpecialCharLong(msg, out data))
                {
                    return(false);
                }
                //站号(4位)
                string StationId = data.Substring(0, 10).Trim();
                //长度:1G
                string length = data.Substring(10, 4);

                DateTime recvTime;
                recvTime = new DateTime(
                    year: Int32.Parse("20" + data.Substring(14, 2)),
                    month: Int32.Parse(data.Substring(16, 2)),
                    day: Int32.Parse(data.Substring(18, 2)),
                    hour: Int32.Parse(data.Substring(20, 2)),
                    minute: Int32.Parse(data.Substring(22, 2)),
                    second: 0
                    );
                //上下行标志
                string type = data.Substring(24, 2);

                //报类(2位):22-定时报
                string reportTypeString = data.Substring(26, 2);

                //站类
                string stationTypeString = data.Substring(28, 2);

                //水位
                string  waterStr = data.Substring(30, 6);
                Decimal?water;
                if (waterStr.Contains("?"))
                {
                    water = null;
                }
                else
                {
                    water = Decimal.Parse(waterStr) / 100;
                }

                //雨量
                string  rainStr = data.Substring(36, 4);
                Decimal?rain;
                if (rainStr.Contains("?"))
                {
                    rain = null;
                }
                else
                {
                    rain = Decimal.Parse(rainStr) / 100;
                }
                //电压
                string  voltageStr = data.Substring(40, 4);
                Decimal?voltage;
                if (voltageStr.Contains("?"))
                {
                    voltage = null;
                }
                else
                {
                    voltage = Decimal.Parse(voltageStr) / 100;
                }

                //报类
                EMessageType reportType;
                reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                //站类
                EStationType stationType;
                stationType = ProtocolMaps.StationTypeMap.FindKey(stationTypeString);

                string allElmtData = data.Substring(44);

                //1.处理RG30数据
                CReportData speedData = new CReportData();
                int         flagIndex = allElmtData.IndexOf("@@  RG30");
                if (flagIndex >= 0)
                {
                    int    keyLength = int.Parse(allElmtData.Substring(8, 4));
                    string elmtData  = allElmtData.Substring(flagIndex, keyLength);
                    //判定要素1的开始符号和结束符号
                    if (elmtData.StartsWith("@@  RG30") && elmtData.EndsWith("**"))
                    {
                        elmtData = elmtData.Substring(12, keyLength - 14).Trim();
                        //判定时差法数据的开始符号和接受符号
                        if (elmtData.Length % 6 == 0)
                        {
                            List <string> elmtDataList           = new List <string>();
                            List <Nullable <Decimal> > speedList = new List <decimal?>();
                            for (int i = 0; i < elmtData.Length / 6; i++)
                            {
                                elmtDataList.Add(elmtData.Substring(i * 6, 6));
                            }
                            try
                            {
                                for (int i = 0; i < elmtDataList.Count; i++)
                                {
                                    if (elmtDataList[i].Contains(".") || elmtDataList[i].Contains("-"))
                                    {
                                        speedList.Add(null);
                                    }
                                    else
                                    {
                                        try
                                        {
                                            speedList.Add(decimal.Parse(elmtDataList[i]));
                                        }
                                        catch (Exception e)
                                        {
                                            speedList.Add(null);
                                        }
                                    }
                                }
                                try
                                {
                                    speedData.Rain   = rain;
                                    speedData.Water  = water;
                                    speedData.Voltge = voltage;
                                    speedData.v1     = speedList[0];
                                    speedData.v2     = speedList[1];
                                    speedData.v3     = speedList[2];
                                    speedData.v4     = speedList[3];
                                    speedData.v5     = speedList[4];
                                    speedData.v6     = speedList[5];
                                    speedData.v7     = speedList[6];
                                    speedData.v8     = speedList[7];
                                }catch (Exception ee)
                                {
                                }
                                dataList.Add(speedData);
                            }
                            catch (Exception ee)
                            {
                                //解析失败
                                return(false);
                            }
                        }
                        else
                        {
                            return(false);
                            //11开头  99结束
                        }
                        report.Stationid   = StationId;
                        report.Type        = type;
                        report.ReportType  = reportType;
                        report.StationType = stationType;
                        report.RecvTime    = recvTime;
                        report.Datas       = dataList;
                    }
                    else
                    {
                        return(false);
                        //TODO 要素1开始符号和结束符合不匹配
                    }
                }
            }
            catch (Exception eee)
            {
                return(false);
            }
            return(true);
        }
Beispiel #18
0
        public bool Parse(string msg, out CReportStruct report)
        {
            report = new CReportStruct();
            List <CReportData> dataList = new List <CReportData>();

            try
            {
                string data = string.Empty;
                //去除起始符'$'
                if (!ProtocolHelpers.DeleteSpecialCharLong(msg, out data))
                {
                    return(false);
                }
                //站号(4位)
                string StationId = data.Substring(0, 10).Trim();
                //长度:1G
                string length = data.Substring(10, 4);

                DateTime recvTime;
                recvTime = new DateTime(
                    year: Int32.Parse("20" + data.Substring(14, 2)),
                    month: Int32.Parse(data.Substring(16, 2)),
                    day: Int32.Parse(data.Substring(18, 2)),
                    hour: Int32.Parse(data.Substring(20, 2)),
                    minute: Int32.Parse(data.Substring(22, 2)),
                    second: 0
                    );
                //上下行标志
                string type = data.Substring(24, 2);

                //报类(2位):22-定时报
                string reportTypeString = data.Substring(26, 2);

                //站类
                string stationTypeString = data.Substring(28, 2);

                //水位
                string  waterStr = data.Substring(30, 6);
                Decimal?water;
                if (waterStr.Contains("?"))
                {
                    water = null;
                }
                else
                {
                    water = Decimal.Parse(waterStr) / 100;
                }

                //雨量
                string  rainStr = data.Substring(36, 4);
                Decimal?rain;
                if (rainStr.Contains("?"))
                {
                    rain = null;
                }
                else
                {
                    rain = Decimal.Parse(rainStr) / 100;
                }
                //电压
                string  voltageStr = data.Substring(40, 4);
                Decimal?voltage;
                if (voltageStr.Contains("?"))
                {
                    voltage = null;
                }
                else
                {
                    voltage = Decimal.Parse(voltageStr) / 100;
                }

                //报类
                EMessageType reportType;
                reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                //站类
                EStationType stationType;
                stationType = ProtocolMaps.StationTypeMap.FindKey(stationTypeString);

                string allElmtData = data.Substring(44);

                //1.处理SM100H数据
                CReportData speedData = new CReportData();
                int         flagIndex = allElmtData.IndexOf("@@SM100H");
                if (flagIndex >= 0)
                {
                    int    keyLength = int.Parse(allElmtData.Substring(8, 4));
                    string elmtData  = allElmtData.Substring(flagIndex, keyLength);
                    //判定要素1的开始符号和结束符号
                    if (elmtData.StartsWith("@@SM100H") && elmtData.EndsWith("**"))
                    {
                        elmtData = elmtData.Substring(12, keyLength - 14).Trim();
                        //判定时差法数据的开始符号和接受符号
                        if (elmtData.Length == 78)
                        {
                            try
                            {
                                string waterSpeedStr = elmtData.Substring(38, 8);
                                string waterFlowStr  = elmtData.Substring(48, 8);
                                string waterFlow2Str = elmtData.Substring(58, 8);

                                //字符串转16进制32位无符号整数
                                UInt32 waterSpeedInt = Convert.ToUInt32(waterSpeedStr, 16);
                                UInt32 waterFlowInt  = Convert.ToUInt32(waterFlowStr, 16);
                                UInt32 waterFlow2Int = Convert.ToUInt32(waterFlow2Str, 16);

                                //IEEE754 字节转换float
                                float waterSpeed = BitConverter.ToSingle(BitConverter.GetBytes(waterSpeedInt), 0);
                                float waterFlow  = BitConverter.ToSingle(BitConverter.GetBytes(waterFlowInt), 0);
                                float waterFlow2 = BitConverter.ToSingle(BitConverter.GetBytes(waterFlow2Int), 0);

                                //UInt32 x = Convert.ToUInt32(waterFlowStr, 16);//字符串转16进制32位无符号整数
                                //float fy = BitConverter.ToSingle(BitConverter.GetBytes(x), 0);//IEEE754 字节转换float
                                //UInt32 x2 = Convert.ToUInt32(waterFlow2Str, 16);//字符串转16进制32位无符号整数
                                //float fy2 = BitConverter.ToSingle(BitConverter.GetBytes(x2), 0);//IEEE754 字节转换float
                                speedData.v1     = (decimal?)waterSpeed;
                                speedData.Q      = (decimal?)waterFlow;
                                speedData.Q2     = (decimal?)waterFlow2;
                                speedData.Voltge = voltage;
                                dataList.Add(speedData);
                            }
                            catch (Exception e)
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            return(false);
                            //11开头  99结束
                        }
                        report.Stationid   = StationId;
                        report.Type        = type;
                        report.ReportType  = reportType;
                        report.StationType = stationType;
                        report.RecvTime    = recvTime;
                        report.Datas       = dataList;
                    }
                    else
                    {
                        return(false);
                        //TODO 要素1开始符号和结束符合不匹配
                    }
                }
            }
            catch (Exception eee)
            {
                return(false);
            }
            return(true);
        }
        public bool Parse(string msg, out CReportStruct report)
        {
            report = new CReportStruct();
            List <CReportData> dataList = new List <CReportData>();

            try
            {
                string data = string.Empty;
                //去除起始符'$'
                if (!ProtocolHelpers.DeleteSpecialCharLong(msg, out data))
                {
                    return(false);
                }
                //站号(4位)
                string StationId = data.Substring(0, 10).Trim();
                //长度:1G
                string length = data.Substring(10, 4);

                DateTime recvTime;
                recvTime = new DateTime(
                    year: Int32.Parse("20" + data.Substring(14, 2)),
                    month: Int32.Parse(data.Substring(16, 2)),
                    day: Int32.Parse(data.Substring(18, 2)),
                    hour: Int32.Parse(data.Substring(20, 2)),
                    minute: Int32.Parse(data.Substring(22, 2)),
                    second: 0
                    );
                //上下行标志
                string type = data.Substring(24, 2);

                //报类(2位):22-定时报
                string reportTypeString = data.Substring(26, 2);

                //站类
                string stationTypeString = data.Substring(28, 2);

                //水位
                string  waterStr = data.Substring(30, 6);
                Decimal?water;
                if (waterStr.Contains("?"))
                {
                    water = null;
                }
                else
                {
                    water = Decimal.Parse(waterStr) / 100;
                }

                //雨量
                string  rainStr = data.Substring(36, 4);
                Decimal?rain;
                if (rainStr.Contains("?"))
                {
                    rain = null;
                }
                else
                {
                    rain = Decimal.Parse(rainStr) / 100;
                }
                //电压
                string  voltageStr = data.Substring(40, 4);
                Decimal?voltage;
                if (voltageStr.Contains("?"))
                {
                    voltage = null;
                }
                else
                {
                    voltage = Decimal.Parse(voltageStr) / 100;
                }

                //报类
                EMessageType reportType;
                reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                //站类
                EStationType stationType;
                stationType = ProtocolMaps.StationTypeMap.FindKey(stationTypeString);

                string allElmtData = data.Substring(44);

                //1.处理风速风向数据和散射仪数据
                CReportData speedData = new CReportData();
                //1.1 风速风向信息
                int flagIndex = allElmtData.IndexOf("@@  EN2B");
                if (flagIndex >= 0)
                {
                    int    keyLength = int.Parse(allElmtData.Substring(8, 4));
                    string elmtData  = allElmtData.Substring(flagIndex, keyLength);
                    //判定要素1的开始符号和结束符号
                    if (elmtData.StartsWith("@@  EN2B") && elmtData.EndsWith("**"))
                    {
                        elmtData = elmtData.Substring(12, keyLength - 14).Trim();
                        //判定时差法数据的开始符号和接受符号
                        if (elmtData.Length == (keyLength - 14))
                        {
                            try
                            {
                                string strtflag  = elmtData.Substring(0, 1);  //开始标志
                                string stationid = elmtData.Substring(1, 5);  //站点ID
                                string msgTime   = elmtData.Substring(6, 12); //时间
                                string shfx      = elmtData.Substring(18, 4); //瞬时风向
                                string shfs      = elmtData.Substring(22, 4); //顺时风速
                                string yxszdshfx = elmtData.Substring(26, 4); //一小时最大瞬时风向
                                string yxszdshfs = elmtData.Substring(30, 4); //一小时最大瞬时风速
                                string maxTime   = elmtData.Substring(34, 4); //一小时最大瞬时风速出现时间
                                string avg2fx    = elmtData.Substring(38, 4); //2分钟平均风向
                                string avg2fs    = elmtData.Substring(42, 4); //2分钟平均风速
                                string avg10fx   = elmtData.Substring(46, 4); //10分钟平均风向
                                string avg10fs   = elmtData.Substring(50, 4); //10分钟平均风速
                                string max10fx   = elmtData.Substring(54, 4); //10分钟平均最大风向
                                string max10fs   = elmtData.Substring(58, 4); //10分钟平均最大风速
                                string max10tm   = elmtData.Substring(62, 4); //10分钟最大风速出现时间
                            }
                            catch (Exception e)
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            return(false);
                            //11开头  99结束
                        }
                        report.Stationid   = StationId;
                        report.Type        = type;
                        report.ReportType  = reportType;
                        report.StationType = stationType;
                        report.RecvTime    = recvTime;
                        report.Datas       = dataList;
                    }
                    else
                    {
                        return(false);
                        //TODO 要素1开始符号和结束符合不匹配
                    }
                }
                //1.2 散射仪数据
                int flagIndex2 = allElmtData.IndexOf("@@   PWD");
                if (flagIndex >= 0)
                {
                    int    keyLength = int.Parse(allElmtData.Substring(8, 4));
                    string elmtData  = allElmtData.Substring(flagIndex, keyLength);
                    if (elmtData.StartsWith("@@  EN2B") && elmtData.EndsWith("**"))
                    {
                    }
                }
            }
            catch (Exception eee)
            {
                return(false);
            }
            return(true);
        }
Beispiel #20
0
        /// <summary>
        /// 非卫星报文数据解析过程
        /// </summary>
        /// <param name="msg">原始报文数据</param>
        /// <param name="report">报文最终解析出的结果数据结构</param>
        /// <returns>是否解析成功</returns>
        public bool Parse(String msg, out CReportStruct report)
        {
            //$      1900020919060308101G21??????????1066@@  QTFM0164        11     0.163     1.171     2.546     0.000     0.334     0.000     0.000    -999.0      -0.2       0.0       0.0      14.7       1.5        99**
            report = new CReportStruct();
            List <CReportData> dataList = new List <CReportData>();

            try
            {
                string data = string.Empty;
                //去除起始符'$'
                if (!ProtocolHelpers.DeleteSpecialCharLong(msg, out data))
                {
                    return(false);
                }
                //站号(4位)
                string StationId = data.Substring(0, 10).Trim();
                //类别(长度):1G
                string length = data.Substring(10, 4);

                DateTime recvTime;
                recvTime = new DateTime(
                    year: Int32.Parse("20" + data.Substring(14, 2)),
                    month: Int32.Parse(data.Substring(16, 2)),
                    day: Int32.Parse(data.Substring(18, 2)),
                    hour: Int32.Parse(data.Substring(20, 2)),
                    minute: Int32.Parse(data.Substring(22, 2)),
                    second: 0
                    );
                //上下行标志
                string type = data.Substring(24, 2);

                //报类(2位):22-定时报
                string reportTypeString = data.Substring(26, 2);

                //水位
                string  waterStr = data.Substring(28, 6);
                Decimal?water;
                if (waterStr.Contains("?"))
                {
                    water = null;
                }
                else
                {
                    water = Decimal.Parse(waterStr) / 100;
                }

                //雨量
                string  rainStr = data.Substring(34, 4);
                Decimal?rain;
                if (rainStr.Contains("?"))
                {
                    rain = null;
                }
                else
                {
                    rain = Decimal.Parse(rainStr) / 100;
                }
                //电压
                string  voltageStr = data.Substring(38, 4);
                Decimal?voltage;
                if (voltageStr.Contains("?"))
                {
                    voltage = null;
                }
                else
                {
                    voltage = Decimal.Parse(voltageStr) / 100;
                }

                //报类
                EMessageType reportType;
                reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                //站类
                EStationType stationType;
                stationType = EStationType.EO;
                string allElmtData = data.Substring(42);

                //1.处理时差法数据
                CReportData speedData = new CReportData();
                int         flagIndex = allElmtData.IndexOf("@@  QTFM");
                if (flagIndex >= 0)
                {
                    int    keyLength = int.Parse(allElmtData.Substring(8, 4));
                    string elmtData  = allElmtData.Substring(flagIndex, keyLength);
                    //判定要素1的开始符号和结束符号
                    if (elmtData.StartsWith("@@  QTFM") && elmtData.EndsWith("**"))
                    {
                        elmtData = elmtData.Substring(12, keyLength - 14).Trim();
                        //判定时差法数据的开始符号和接受符号
                        if (elmtData.StartsWith("11") && elmtData.EndsWith("99"))
                        {
                            try
                            {
                                elmtData = new System.Text.RegularExpressions.Regex("[\\s]+").Replace(elmtData, " ");
                                string[] elmtDataList = elmtData.Split(' ');
                                speedData.Voltge    = voltage;
                                speedData.Vm        = Decimal.Parse(elmtDataList[1]);
                                speedData.W1        = Decimal.Parse(elmtDataList[2]);
                                speedData.Q         = Decimal.Parse(elmtDataList[3]);
                                speedData.v1        = Decimal.Parse(elmtDataList[4]);
                                speedData.v2        = Decimal.Parse(elmtDataList[5]);
                                speedData.v3        = Decimal.Parse(elmtDataList[6]);
                                speedData.v4        = Decimal.Parse(elmtDataList[7]);
                                speedData.beta1     = Decimal.Parse(elmtDataList[8]);
                                speedData.beta2     = Decimal.Parse(elmtDataList[9]);
                                speedData.beta3     = Decimal.Parse(elmtDataList[10]);
                                speedData.beta4     = Decimal.Parse(elmtDataList[11]);
                                speedData.W2        = Decimal.Parse(elmtDataList[12]);
                                speedData.errorCode = elmtDataList[13];
                                dataList.Add(speedData);
                            }
                            catch (Exception ee)
                            {
                                //解析失败
                                return(false);
                            }
                        }
                        else
                        {
                            return(false);
                            //11开头  99结束
                        }
                        report.Stationid   = StationId;
                        report.Type        = type;
                        report.ReportType  = reportType;
                        report.StationType = stationType;
                        report.RecvTime    = recvTime;
                        report.Datas       = dataList;
                    }
                    else
                    {
                        return(false);
                        //TODO 要素1开始符号和结束符合不匹配
                    }
                }
            }
            catch (Exception eee)
            {
                return(false);
            }
            return(true);
        }
        /// <summary>
        /// 解析上行报文数据
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="report"></param>
        /// <returns></returns>
        public bool Parse(string msg, out CReportStruct report)
        {
            ///$12345678+140331080400+1257+0251+0078+990+PP
            report = null;
            if (!msg.Contains("+"))
            {
                return(false);
            }
            try
            {
                string data = string.Empty;
                //去除$
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }
                string[] dataList = data.Split('+');

                DateTime           dataTime;
                string             evpType    = string.Empty;
                string             stationId  = string.Empty;
                List <CReportData> datas      = new List <CReportData>();
                CReportData        reportData = new CReportData();
                if (dataList.Length != 6 && dataList.Length != 7)
                {
                    return(false);
                }

                for (int i = 0; i < dataList.Length; i++)
                {
                    if (i == 0)
                    {
                        if (dataList[i].Length == 8)
                        {
                            stationId = dataList[i];
                            continue;
                        }
                        else
                        {
                            System.Diagnostics.Debug.Write("数据:" + msg);
                            System.Diagnostics.Debug.Write("站号格式不对");
                            return(false);
                        }
                    }
                    if (i == 1)
                    {
                        if (dataList[i].Length == 14)
                        {
                            dataTime = new DateTime(
                                year: Int32.Parse(dataList[i].Substring(0, 4)),
                                month: Int32.Parse(dataList[i].Substring(4, 2)),
                                day: Int32.Parse(dataList[i].Substring(6, 2)),
                                hour: Int32.Parse(dataList[i].Substring(8, 2)),
                                minute: Int32.Parse(dataList[i].Substring(10, 2)),
                                second: Int32.Parse(dataList[i].Substring(12, 2))
                                );
                            reportData.Time = dataTime;
                            continue;
                        }
                        else
                        {
                            System.Diagnostics.Debug.Write("数据:" + msg);
                            System.Diagnostics.Debug.Write("时间格式不对");
                            return(false);
                        }
                    }
                    else if (i == 2)
                    {
                        reportData.Voltge = Decimal.Parse(dataList[i]) * (Decimal)0.01;
                        continue;
                    }
                    else if (i == 3)
                    {
                        reportData.Rain = Decimal.Parse(dataList[i]) * (Decimal)0.01;
                        continue;
                    }
                    else if (i == 4)
                    {
                        reportData.Evp = Decimal.Parse(dataList[i]) * (Decimal)0.01;
                        continue;
                    }
                    else if (i == 5)
                    {
                        reportData.Temperature = Decimal.Parse(dataList[i]) * (Decimal)0.01;
                        continue;
                    }
                    else if (i == 6)
                    {
                        reportData.EvpType = dataList[i];
                        continue;
                    }
                }
                datas.Add(reportData);
                report = new CReportStruct()
                {
                    Stationid   = stationId,
                    Type        = string.Empty,
                    ReportType  = EMessageType.Evp,
                    StationType = EStationType.EHydrology,
                    RecvTime    = DateTime.Now,
                    Datas       = datas
                };
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.Write("数据:" + msg);
                System.Diagnostics.Debug.Write("格式不对");
                return(false);
            }
            return(true);
        }
Beispiel #22
0
        public bool DealData(string msg, string reportType, out CReportStruct report)
        {
            EStationType type = new EStationType();

            report = new CReportStruct();
            try
            {
                string data = msg;
                // 丢弃流水号(4位)
                data = data.Substring(4);
                // 丢弃发报时间(12位)
                DateTime sendTime = new DateTime(
                    year: int.Parse("20" + data.Substring(0, 2)),
                    month: int.Parse(data.Substring(2, 2)),
                    day: int.Parse(data.Substring(4, 2)),
                    hour: int.Parse(data.Substring(6, 2)),
                    minute: int.Parse(data.Substring(8, 2)),
                    second: int.Parse(data.Substring(10, 2))
                    );
                //删除发送时间
                data = data.Substring(12);
                //删除ST  站号引导符号
                data = data.Substring(2);
                //删除空格
                data = data.Substring(1);
                //获取站点ID
                string stationId = data.Substring(0, 10);
                //删除站点ID
                data = data.Substring(10);
                //删除空格
                data = data.Substring(1);
                string stationTypeString = data.Substring(0, 1);
                if (stationTypeString == "H")
                {
                    type = EStationType.EH;
                }
                if (stationTypeString == "P")
                {
                    type = EStationType.ERainFall;
                }
                //删除站点类型
                data = data.Substring(1);

                // report中的数据初始化
                List <CReportData> datas = new List <CReportData>();
                TimeSpan           span  = new TimeSpan(0);

                DateTime dataTime = sendTime;
                //int dataAccuracyLength;
                //int dataLength;
                //Decimal dataAccuracy;
                //Decimal dayRain;

                Nullable <Decimal> diffRain   = null;
                Nullable <Decimal> totalRain  = null;
                Nullable <Decimal> waterStage = null;
                Nullable <Decimal> voltage    = null;
                //string dataDefine, dataDefine1, dataDefine2;
                //int flag = 0;
                if (data.Length >= 10)
                {
                    string[] dataArr = Regex.Split(data, "TT", RegexOptions.IgnoreCase);
                    for (int i = 0; i < dataArr.Length; i++)
                    {
                        string         oneGram   = dataArr[i].Trim();
                        List <decimal> rainList  = new List <decimal>();
                        List <decimal> waterList = new List <decimal>();
                        if (oneGram.Length < 10)
                        {
                            continue;
                        }
                        dataTime = new DateTime(
                            year: int.Parse("20" + oneGram.Substring(0, 2)),
                            month: int.Parse(oneGram.Substring(2, 2)),
                            day: int.Parse(oneGram.Substring(4, 2)),
                            hour: int.Parse(oneGram.Substring(6, 2)),
                            minute: int.Parse(oneGram.Substring(8, 2)),
                            second: 0
                            );
                        //观测时间引导符
                        if (oneGram.Contains("TT"))
                        {
                        }
                        if (oneGram.Contains("RGZS"))
                        {
                        }
                        if (oneGram.Contains("PIC"))
                        {
                        }
                        if (oneGram.Contains("DRP"))
                        {
                            int    index       = oneGram.IndexOf("DRP");
                            string rainListStr = oneGram.Substring(index + 4, 24).Trim();
                            for (int j = 0; j < 12; j++)
                            {
                                rainList.Add((System.Int32.Parse(rainListStr.Substring(j * 2, 2), System.Globalization.NumberStyles.HexNumber)) * (decimal)(0.1));
                            }
                        }
                        if (oneGram.Contains("DRZ"))
                        {
                        }
                        if (oneGram.Contains("DRZ1"))
                        {
                            int    index        = oneGram.IndexOf("DRZ1");
                            string waterListStr = oneGram.Substring(index + 5, 48).Trim();
                            for (int j = 0; j < 12; j++)
                            {
                                waterList.Add((System.Int32.Parse(waterListStr.Substring(j * 4, 4), System.Globalization.NumberStyles.HexNumber)) * (decimal)0.01);
                            }
                        }
                        if (oneGram.Contains("DATA"))
                        {
                        }
                        if (oneGram.Contains("AC"))
                        {
                        }
                        if (oneGram.Contains("AI"))
                        {
                        }
                        if (oneGram.Contains("C"))
                        {
                        }
                        if (oneGram.Contains("DRxnn"))
                        {
                        }
                        if (oneGram.Contains("DT"))
                        {
                        }
                        if (oneGram.Contains("ED"))
                        {
                        }
                        if (oneGram.Contains("EJ"))
                        {
                        }
                        if (oneGram.Contains("FL"))
                        {
                        }
                        if (oneGram.Contains("GH"))
                        {
                        }
                        if (oneGram.Contains("GN"))
                        {
                        }
                        if (oneGram.Contains("GS"))
                        {
                        }
                        if (oneGram.Contains("GT"))
                        {
                        }
                        if (oneGram.Contains("GTP"))
                        {
                        }
                        if (oneGram.Contains("H"))
                        {
                        }
                        if (oneGram.Contains("HW"))
                        {
                        }
                        if (oneGram.Contains("M10"))
                        {
                        }
                        if (oneGram.Contains("M20"))
                        {
                        }
                        if (oneGram.Contains("M30"))
                        {
                        }
                        if (oneGram.Contains("M40"))
                        {
                        }
                        if (oneGram.Contains("M50"))
                        {
                        }
                        if (oneGram.Contains("M60"))
                        {
                        }
                        if (oneGram.Contains("M80"))
                        {
                        }
                        if (oneGram.Contains("M100"))
                        {
                        }
                        if (oneGram.Contains("MST"))
                        {
                        }
                        if (oneGram.Contains("P1"))
                        {
                        }
                        if (oneGram.Contains("P2"))
                        {
                        }
                        if (oneGram.Contains("P3"))
                        {
                        }
                        if (oneGram.Contains("P6"))
                        {
                        }
                        if (oneGram.Contains("P12"))
                        {
                        }
                        //日降水量
                        if (oneGram.Contains("PD"))
                        {
                        }
                        //当前降水量
                        if (oneGram.Contains("PJ"))
                        {
                            int      index          = oneGram.IndexOf("PJ");
                            string   endStr         = oneGram.Substring(index).Trim();
                            string[] endStrList     = endStr.Split(' ');
                            string   diffRainString = endStrList[1];
                            try
                            {
                                diffRain = Decimal.Parse(diffRainString);
                            }
                            catch (Exception e)
                            {
                                System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                            }
                        }
                        //1分钟时段降水量
                        if (oneGram.Contains("PN01"))
                        {
                        }
                        //5分钟时段降水量
                        if (oneGram.Contains("PN05"))
                        {
                        }
                        //10分钟时段降水量
                        if (oneGram.Contains("PN10"))
                        {
                        }
                        //30分钟时段降水量
                        if (oneGram.Contains("PN30"))
                        {
                        }
                        //暴雨量
                        if (oneGram.Contains("PR"))
                        {
                        }
                        if (oneGram.Contains("PT"))
                        {
                            int      index           = oneGram.IndexOf("PT");
                            string   endStr          = oneGram.Substring(index).Trim();
                            string[] endStrList      = endStr.Split(' ');
                            string   totalRainString = endStrList[1];
                            try
                            {
                                totalRain = Decimal.Parse(totalRainString);
                            }
                            catch (Exception e)
                            {
                                System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                            }
                        }
                        //瞬时河道水位、潮位
                        if (oneGram.Contains("Z "))
                        {
                            int      index            = oneGram.IndexOf("Z ");
                            string   endStr           = oneGram.Substring(index).Trim();
                            string[] endStrList       = endStr.Split(' ');
                            string   waterStageString = endStrList[1];
                            try
                            {
                                waterStage = Decimal.Parse(waterStageString);
                            }
                            catch (Exception e)
                            {
                                System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                            }
                        }
                        //电压
                        if (oneGram.Contains("VT"))
                        {
                            int      index         = oneGram.IndexOf("VT");
                            string   endStr        = oneGram.Substring(index).Trim();
                            string[] endStrList    = endStr.Split(' ');
                            string   voltageString = endStrList[1];
                            try
                            {
                                voltage = Decimal.Parse(voltageString);
                            }
                            catch (Exception e)
                            {
                                System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                            }
                        }
                        //定时报和均匀时段报处理
                        // 雨量组 和 水位组 均有数据 且数量相等。
                        if (rainList != null && rainList.Count > 0 && waterList != null && rainList.Count == waterList.Count)
                        {
                            CReportData oneData = new CReportData();
                            for (int k = 0; k < rainList.Count; k++)
                            {
                                DateTime tmpDate = dataTime.AddMinutes(5 * k);
                                oneData.Time     = tmpDate;
                                oneData.DiffRain = rainList[k];
                                oneData.Water    = waterList[k];
                                datas.Add(DeepClone(oneData));
                            }
                        }
                        // 雨量组数据 和 水位组数据不匹配
                        else
                        {
                            //
                            if (rainList != null && rainList.Count > 0)
                            {
                                CReportData oneData = new CReportData();
                                for (int k = 0; k < rainList.Count; k++)
                                {
                                    DateTime tmpDate = dataTime.AddMinutes(5 * k);
                                    oneData.Time     = tmpDate;
                                    oneData.DiffRain = rainList[k];
                                    datas.Add(DeepClone(oneData));
                                }
                            }

                            if (waterList != null && waterList.Count > 0)
                            {
                                CReportData oneData = new CReportData();
                                for (int k = 0; k < waterList.Count; k++)
                                {
                                    DateTime tmpDate = dataTime.AddMinutes(5 * k);
                                    oneData.Time  = tmpDate;
                                    oneData.Water = waterList[k];
                                    datas.Add(DeepClone(oneData));
                                }
                            }
                        }
                        //普通报文处理
                        if (diffRain != null || totalRain != null || voltage != null)
                        {
                            CReportData oneData = new CReportData();
                            oneData.Time     = dataTime;
                            oneData.Rain     = totalRain;
                            oneData.DiffRain = diffRain;
                            oneData.Water    = waterStage;
                            oneData.Voltge   = voltage;
                            datas.Add(DeepClone(oneData));
                        }
                    }
                }
                #region 废码代码
                //while (data.Length >= 2)
                //{
                //    // 截取要素标识符
                //    string sign = data.Substring(0, 2);
                //    flag = flag + 1;
                //    if(flag > 100)
                //    {
                //        break;
                //    }
                //    // 根据要素标识符取数据
                //    switch (sign)
                //    {
                //        case "ST":
                //            // 丢弃标识符
                //            data = data.Substring(2);
                //            // 丢弃一个字节
                //            data = data.Substring(1);
                //            // 丢弃一个测站地址
                //            data = data.Substring(10);
                //            // 丢弃一个字节
                //            data = data.Substring(1);

                //            // 遥测站分类码,不确定是不是一定在这个后面
                //            string stationTypeString = data.Substring(0,1);
                //            if(stationTypeString == "H")
                //            {
                //                type = EStationType.EH;
                //            }
                //            if(stationTypeString == "P")
                //            {
                //                type = EStationType.ERainFall;
                //            }
                //            data = data.Substring(1);
                //            //type = stationTypeString == "50" ? EStationType.ERainFall : EStationType.EHydrology;
                //            data = data.Substring(1);
                //            break;
                //        case "TT":
                //            // 丢弃标识符
                //            data = data.Substring(2);
                //            //丢弃一个字节
                //            data = data.Substring(1);
                //            dataTime = new DateTime(
                //                year: int.Parse("20" + data.Substring(0, 2)),
                //                month: int.Parse(data.Substring(2, 2)),
                //                day: int.Parse(data.Substring(4, 2)),
                //                hour: int.Parse(data.Substring(6, 2)),
                //                minute: int.Parse(data.Substring(8, 2)),
                //                second: 0
                //            );
                //            data = data.Substring(10);
                //            //丢弃一个字节
                //            data = data.Substring(1);
                //            break;
                //        case "PD":
                //            // 丢弃标识符
                //            data = data.Substring(2);
                //            // 丢弃数据定义19 3个字节、精度1
                //            dataDefine1 = Convert.ToString(int.Parse(data.Substring(0, 1)), 2);
                //            dataDefine2 = Convert.ToString(int.Parse(data.Substring(1, 1)), 2);
                //            dataDefine = dataDefine1.PadLeft(4, '0') + dataDefine2.PadLeft(4, '0');
                //            dataLength = Convert.ToInt32(dataDefine.Substring(0, 5), 2) * 2;
                //            dataAccuracyLength = Convert.ToInt32(dataDefine.Substring(5, 3), 2);
                //            dataAccuracy = 1;
                //            while (dataAccuracyLength > 0)
                //            {
                //                dataAccuracy *= (decimal)0.1;
                //                dataAccuracyLength--;
                //            }
                //            data = data.Substring(2);

                //            string dayRainString = data.Substring(0, dataLength);
                //            data = data.Substring(dataLength);
                //            try
                //            {
                //                dayRain = Decimal.Parse(dayRainString) * dataAccuracy;
                //            }
                //            catch (Exception e)
                //            {
                //                System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                //            }
                //            break;
                //        case "PJ":
                //            // 丢弃标识符
                //            data = data.Substring(2);
                //            // 丢掉一个字节
                //            data = data.Substring(1);
                //            string[] rainArr = data.Split('.');
                //            int rainLen = rainArr[0].Length;

                //            string rainStr = data.Substring(0,rainLen + 2);
                //            data = data.Substring(rainLen + 2);
                //            data = data.Substring(1);
                //            // 丢弃数据定义19 3个字节、精度1



                //            string diffRainString = rainStr;

                //            try
                //            {
                //                diffRain = Decimal.Parse(diffRainString);
                //            }
                //            catch (Exception e)
                //            {
                //                System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                //            }
                //            break;
                //        case "PT":
                //            // 丢弃标识符
                //            data = data.Substring(2);
                //            // 丢掉一个字节
                //            data = data.Substring(1);

                //            string[] dataArr = data.Split('.');
                //            int tmp = dataArr[0].Length;
                //            string totalRain = data.Substring(0,tmp + 2);

                //            data = data.Substring(tmp + 2);
                //            data = data.Substring(1);

                //            // 根据长度精度解析数据
                //            if (reportType == "31")
                //            {
                //                for (int i = 0; i < 13; i++)
                //                {
                //                    try
                //                    {
                //                        // 数据截取
                //                        string rainString = totalRain;

                //                        if (i != 0)
                //                        {
                //                            dataTime = dataTime + span;
                //                        }
                //                        Decimal rain = 0;
                //                        rain = Decimal.Parse(rainString);

                //                        // 数据封包
                //                        bool isExists = false;
                //                        if (datas.Count != 0)
                //                        {
                //                            foreach (var d in datas)
                //                            {
                //                                if (d.Time == dataTime)
                //                                {
                //                                    isExists = true;
                //                                    d.Rain = rain;
                //                                }
                //                            }
                //                        }
                //                        if (isExists == false)
                //                        {
                //                            CReportData reportData = new CReportData
                //                            {
                //                                Rain = rain,
                //                                Time = dataTime
                //                            };
                //                            datas.Add(reportData);
                //                        }

                //                    }
                //                    catch (Exception e)
                //                    {
                //                        System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                //                    }
                //                }
                //            }
                //            else if (reportType == "32" || reportType == "33" || reportType == "30")
                //            {
                //                try
                //                {
                //                    // 数据截取
                //                    string rainString = totalRain;

                //                    Decimal rain = 0;
                //                    rain = Decimal.Parse(rainString);

                //                    // 数据封包
                //                    bool isExists = false;
                //                    if (datas.Count != 0)
                //                    {
                //                        foreach (var d in datas)
                //                        {
                //                            if (d.Time == dataTime)
                //                            {
                //                                isExists = true;
                //                                d.Rain = rain;
                //                            }
                //                        }
                //                    }
                //                    if (isExists == false)
                //                    {
                //                        CReportData reportData = new CReportData
                //                        {
                //                            Rain = rain,
                //                            Time = dataTime
                //                        };
                //                        datas.Add(reportData);
                //                    }

                //                }
                //                catch (Exception e)
                //                {
                //                    System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                //                }
                //            }
                //            break;
                //        case "VT":
                //            // 丢弃标识符
                //            data = data.Substring(2);
                //            //丢掉一个位置
                //            data = data.Substring(1);
                //            // 丢弃数据定义?? ?个字节、精度?
                //            string[] voltageArr = data.Split('.');
                //            int voltageLen = voltageArr[0].Length;
                //            string voltageStr = data.Substring(0,voltageLen + 3);
                //            data = data.Substring(voltageLen + 3);
                //            data = data.Substring(1);

                //            // 根据长度精度解析数据
                //            if (reportType == "31")
                //            {
                //                for (int i = 0; i < 13; i++)
                //                {
                //                    try
                //                    {
                //                        // 数据截取
                //                        string voltageString = voltageStr;
                //                        if (i != 0)
                //                        {
                //                            dataTime = dataTime + span;
                //                        }
                //                        Decimal voltage = 0;
                //                        voltage = Decimal.Parse(voltageString);

                //                        // 数据封包
                //                        bool isExists = false;
                //                        if (datas.Count != 0)
                //                        {
                //                            foreach (var d in datas)
                //                            {
                //                                if (d.Time == dataTime)
                //                                {
                //                                    isExists = true;
                //                                    d.Voltge = voltage;
                //                                }
                //                            }
                //                        }
                //                        if (isExists == false)
                //                        {
                //                            CReportData reportData = new CReportData
                //                            {
                //                                Voltge = voltage,
                //                                Time = dataTime
                //                            };
                //                            datas.Add(reportData);
                //                        }
                //                    }
                //                    catch (Exception e)
                //                    {
                //                        System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                //                    }
                //                }
                //            }
                //            else if (reportType == "32" || reportType == "33" ||reportType == "30")
                //            {
                //                try
                //                {
                //                    // 数据截取
                //                    string voltageString = voltageStr;

                //                    Decimal voltage = 0;
                //                    voltage = Decimal.Parse(voltageString);

                //                    // 数据封包
                //                    bool isExists = false;
                //                    if (datas.Count != 0)
                //                    {
                //                        foreach (var d in datas)
                //                        {
                //                            if (d.Time == dataTime)
                //                            {
                //                                isExists = true;
                //                                d.Voltge = voltage;
                //                            }
                //                        }
                //                    }
                //                    if (isExists == false)
                //                    {
                //                        CReportData reportData = new CReportData
                //                        {
                //                            Voltge = voltage,
                //                            Time = dataTime
                //                        };
                //                        datas.Add(reportData);
                //                    }
                //                }
                //                catch (Exception e)
                //                {
                //                    System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                //                }
                //            }
                //            break;
                //        default:
                //            if (data.StartsWith("Z"))
                //            {
                //                // 丢弃标识符
                //                data = data.Substring(1);
                //                //丢掉一个字节
                //                data = data.Substring(1);
                //                string[] dataArr2 = data.Split('.');
                //                int tmp2 = dataArr2[0].Length;
                //                // 丢弃数据定义23 4个字节、精度3
                //                string waterStr = data.Substring(0,tmp2 + 4);
                //                data = data.Substring(tmp2 + 4);
                //                data = data.Substring(1);

                //                // 根据长度精度解析数据
                //                if (reportType == "31")
                //                {
                //                    for (int i = 0; i < 13; i++)
                //                    {
                //                        try
                //                        {
                //                            // 数据截取
                //                            string waterString = waterStr;
                //                            if (i != 0)
                //                            {
                //                                dataTime = dataTime + span;
                //                            }
                //                            Decimal water = 0;
                //                            water = Decimal.Parse(waterString);

                //                            // 数据封包
                //                            bool isExists = false;
                //                            if (datas.Count != 0)
                //                            {
                //                                foreach (var d in datas)
                //                                {
                //                                    if (d.Time == dataTime)
                //                                    {
                //                                        isExists = true;
                //                                        d.Water = water;
                //                                    }
                //                                }
                //                            }
                //                            if (isExists == false)
                //                            {
                //                                CReportData reportData = new CReportData
                //                                {
                //                                    Water = water,
                //                                    Time = dataTime
                //                                };
                //                                datas.Add(reportData);
                //                            }
                //                        }
                //                        catch (Exception e)
                //                        {
                //                            System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                //                        }
                //                    }
                //                }
                //                else if (reportType == "32" || reportType == "33" || reportType == "30")
                //                {
                //                    try
                //                    {
                //                        // 数据截取
                //                        string waterString = waterStr;
                //                        Decimal water = 0;
                //                        water = Decimal.Parse(waterString);

                //                        // 数据封包
                //                        bool isExists = false;
                //                        if (datas.Count != 0)
                //                        {
                //                            foreach (var d in datas)
                //                            {
                //                                if (d.Time == dataTime)
                //                                {
                //                                    isExists = true;
                //                                    d.Water = water;
                //                                }
                //                            }
                //                        }
                //                        if (isExists == false)
                //                        {
                //                            CReportData reportData = new CReportData
                //                            {
                //                                Water = water,
                //                                Time = dataTime
                //                            };
                //                            datas.Add(reportData);
                //                        }
                //                    }
                //                    catch (Exception e)
                //                    {
                //                        System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString());
                //                    }
                //                }
                //            }
                //            else if (data.StartsWith("DRxnn"))
                //            {
                //                // 丢弃标识符
                //                data = data.Substring(2);
                //                // 丢弃数据定义18 3个字节、精度0
                //                data = data.Substring(2);
                //                // 时间步长
                //                string timeSpanString = data.Substring(0, 6);
                //                data = data.Substring(6);
                //                TimeSpan timeSpan = new TimeSpan(Int32.Parse(timeSpanString.Substring(0, 2)), Int32.Parse(timeSpanString.Substring(2, 2)), Int32.Parse(timeSpanString.Substring(4, 2)), 0);
                //                span = span + timeSpan;
                //            }

                //            break;
                //    }
                //}
                #endregion

                foreach (var d in datas)
                {
                    if (!d.Rain.HasValue)
                    {
                        d.Rain = -1;
                    }
                    if (!d.Water.HasValue)
                    {
                        d.Water = -20000;
                    }
                    if (d.Voltge <= 0)
                    {
                        d.Voltge = -20;
                    }
                }

                report = new CReportStruct
                {
                    StationType = type,
                    Datas       = datas
                };

                return(true);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("数据:" + msg);
                System.Diagnostics.Debug.WriteLine("规约协议正文解析错误" + e.Message);
                return(false);
            }
        }
        /// <summary>
        /// #S1209110500705141749 000.87001.06000.98000.76000.82
        /// #S1209110500705141755 000.67000.96000.90
        /// </summary>
        /// <param name="rawStr"></param>
        /// <param name="soil"></param>
        /// <returns></returns>
        ///
        public bool Parse(string resp, out CEntitySoilData soil, out CReportStruct report)
        {
            soil   = null;
            report = null;
            report = new CReportStruct();
            try
            {
                string rawStr = resp.Trim();

                if (rawStr.StartsWith("#S1"))
                {
                    soil = new CEntitySoilData();
                    //  终端机号
                    soil.StrDeviceNumber = rawStr.Substring(3, 8);

                    //  数据采集时间
                    int year   = Int32.Parse("20" + rawStr.Substring(11, 2));
                    int month  = Int32.Parse(rawStr.Substring(13, 2));
                    int day    = Int32.Parse(rawStr.Substring(15, 2));
                    int hour   = Int32.Parse(rawStr.Substring(17, 2));
                    int minute = Int32.Parse(rawStr.Substring(19, 2));
                    soil.DataTime = new DateTime(year, month, day, hour, minute, 0);

                    // #S1209110500705141749 000.87001.06000.98000.76000.82
                    if (rawStr.Length.Equals(22 + 30))
                    {
                        soil.Voltage10 = float.Parse(rawStr.Substring(22, 6));
                        soil.Voltage20 = float.Parse(rawStr.Substring(28, 6));
                        soil.Voltage30 = float.Parse(rawStr.Substring(34, 6));
                        soil.Voltage40 = float.Parse(rawStr.Substring(40, 6));
                        soil.Voltage60 = float.Parse(rawStr.Substring(46, 6));
                    }
                    // #S1209110500705141755 000.67000.96000.90
                    if (rawStr.Length.Equals(22 + 18))
                    {
                        soil.Voltage10 = float.Parse(rawStr.Substring(22, 6));
                        soil.Voltage20 = float.Parse(rawStr.Substring(28, 6));
                        soil.Voltage40 = float.Parse(rawStr.Substring(34, 6));
                    }
                    return(true);
                }
                else if (rawStr.StartsWith("$") && "1G" == rawStr.Substring(5, 2))
                {
                    soil = new CEntitySoilData();
                    string StationID = rawStr.Substring(1, 4);
                    soil.StationID = StationID;
                    //  $70521G25142523453124
                    string cmd = rawStr.Substring(7, 2);
                    if ("25" == cmd)
                    {
                        var now = DateTime.Now;
                        soil.DataTime = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0);
                        //  $70521G25142523453124
                        if (21 == rawStr.Length)
                        {
                            soil.Voltage10 = float.Parse(rawStr.Substring(9, 4)) / 100;
                            soil.Voltage20 = float.Parse(rawStr.Substring(13, 4)) / 100;
                            soil.Voltage40 = float.Parse(rawStr.Substring(17, 4)) / 100;
                        }
                        else if (29 == rawStr.Length)//  $70521G2514252345312412345678
                        {
                            soil.Voltage10 = float.Parse(rawStr.Substring(9, 4)) / 100;
                            soil.Voltage20 = float.Parse(rawStr.Substring(13, 4)) / 100;
                            soil.Voltage30 = float.Parse(rawStr.Substring(17, 4)) / 100;
                            soil.Voltage40 = float.Parse(rawStr.Substring(21, 4)) / 100;
                            soil.Voltage60 = float.Parse(rawStr.Substring(25, 4)) / 100;
                        }
                        else
                        {
                            return(false);
                        }
                        return(true);
                    }
                    else if ("22" == cmd || "21" == cmd)
                    {
                        //  $70521G2217yymmddhhmm12345600011256000100020003
                        EStationType stationType = EStationType.EHydrology;
                        decimal      water       = decimal.Parse(rawStr.Substring(21, 6)) / 100;
                        decimal      rain        = decimal.Parse(rawStr.Substring(27, 4));
                        decimal      volegate    = decimal.Parse(rawStr.Substring(31, 4)) / 100;
                        CReportData  reportData  = new CReportData();
                        switch (rawStr.Substring(9, 2))
                        {
                        case "04":
                            stationType = EStationType.ESoil;
                            if ("21" == cmd)
                            {
                                report.ReportType = EMessageType.EAdditional;
                            }
                            if ("22" == cmd)
                            {
                                report.ReportType = EMessageType.ETimed;
                            }
                            break;

                        case "05":
                            stationType       = EStationType.ESoilRain;
                            reportData.Rain   = rain;
                            reportData.Voltge = volegate;
                            break;

                        case "06":
                        case "16":
                            stationType       = EStationType.ESoilWater;
                            reportData.Water  = water;
                            reportData.Voltge = volegate;
                            break;

                        case "07":
                        case "17":
                            reportData.Rain   = rain;
                            reportData.Water  = water;
                            reportData.Voltge = volegate;
                            stationType       = EStationType.ESoilHydrology;
                            break;

                        default: throw new Exception(); break;
                        }

                        int      year        = Int32.Parse("20" + rawStr.Substring(11, 2));
                        int      month       = Int32.Parse(rawStr.Substring(13, 2));
                        int      day         = Int32.Parse(rawStr.Substring(15, 2));
                        int      hour        = Int32.Parse(rawStr.Substring(17, 2));
                        int      minute      = Int32.Parse(rawStr.Substring(19, 2));
                        DateTime collectTime = new DateTime(year, month, day, hour, minute, 0);

                        soil.DataTime = collectTime;

                        //gm  20161030  下1行
                        soil.DVoltage = volegate;

                        if (47 == rawStr.Length)
                        {
                            //  $7052 1G2217 yymmddhhmm 123456 0001 1256 0001 0002 0003
                            soil.Voltage10 = float.Parse(rawStr.Substring(35, 4)) / 100;
                            soil.Voltage20 = float.Parse(rawStr.Substring(39, 4)) / 100;
                            soil.Voltage40 = float.Parse(rawStr.Substring(43, 4)) / 100;

                            //  report = new CReportStruct();
                            report.Datas       = new List <CReportData>();
                            report.Stationid   = StationID;
                            report.StationType = stationType;
                            report.RecvTime    = DateTime.Now;
                            reportData.Time    = DateTime.Now;
                            report.Datas.Add(reportData);
                        }
                        else if (47 + 8 == rawStr.Length)
                        {
                            //  $70521G2217yymmddhhmm123456 0001 1256 0001 0002 0003 0004 0005
                            soil.Voltage10 = float.Parse(rawStr.Substring(35, 4)) / 100;
                            soil.Voltage20 = float.Parse(rawStr.Substring(39, 4)) / 100;
                            soil.Voltage30 = float.Parse(rawStr.Substring(43, 4)) / 100;
                            soil.Voltage40 = float.Parse(rawStr.Substring(47, 4)) / 100;
                            soil.Voltage60 = float.Parse(rawStr.Substring(51, 4)) / 100;

                            report             = new CReportStruct();
                            report.Stationid   = StationID;
                            report.StationType = stationType;
                            report.RecvTime    = DateTime.Now;
                            reportData.Time    = DateTime.Now;
                            report.Datas       = new List <CReportData>();
                            report.Datas.Add(reportData);
                        }
                        else
                        {
                            return(false);
                        }
                        return(true);
                    }
                }
            }
            catch (Exception exp) { }
            return(false);
        }