Exemple #1
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);
        }
Exemple #2
0
        //  批量数据flash下行解析
        public bool Parse_Flash(String msg, out CBatchStruct batch)
        {
            batch = new CBatchStruct();
            try
            {
                string data = string.Empty;
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }

                //  解析站点ID , 4位     0001
                batch.StationID = data.Substring(0, 4);
                //  解析命令指令 ,2位     1K
                batch.Cmd = data.Substring(4, 2);
                //  解析站点类型, 2位     01
                batch.StationType = ProtocolHelpers.ProtoStr2StationType(data.Substring(6, 2));
                //  解析传输类型, 2位     02/03
                batch.TransType = ProtocolMaps.TransMap.FindKey(data.Substring(8, 2));

                //创建返回的数据对象
                var datas = new List <CTimeAndData>();
                //ByDay ByHour区分
                //02 按天传   03按小时  04暂时不需要处理
                switch (batch.TransType)
                {
                //按天传 02
                case ETrans.ByDay:
                {
                    int dateYear  = Int32.Parse("20" + data.Substring(10, 2));  // 年
                    int dateMonth = Int32.Parse(data.Substring(12, 2));         // 月

                    //数据处理
                    var lists = data.Substring(14).Split(CSpecialChars.BALNK_CHAR);
                    foreach (var item in lists)
                    {
                        DateTime recvTime = new DateTime(
                            year: dateYear,                            //年
                            month: dateMonth,                          //月
                            day: Int32.Parse(item.Substring(0, 2)),    //日
                            hour: Int32.Parse(item.Substring(2, 2)),   //时
                            minute: Int32.Parse(item.Substring(4, 2)), //分
                            second: 0
                            );
                        string datasegs = item.Substring(6, 6);
                        datas.Add(new CTimeAndData
                            {
                                Time = recvTime,
                                Data = datasegs
                            });
                    }
                } break;

                //按小时传 03
                case ETrans.ByHour:
                {
                    //判断是GSM还是GPRS传送方式
                    //GSM:yymmddhh  GPRS:yymm
                    string difference = data.Substring(10, 5).Replace(" ", "");

                    if (difference.Length <= 4)
                    {
                        //GPRS类型
                        int dateYear  = Int32.Parse("20" + data.Substring(10, 2));     // 年
                        int dateMonth = Int32.Parse(data.Substring(12, 2));            // 月

                        //数据处理
                        var lists = data.Substring(14).Split(CSpecialChars.BALNK_CHAR);
                        foreach (var item in lists)
                        {
                            DateTime recvTime = new DateTime(
                                year: dateYear,                            //年
                                month: dateMonth,                          //月
                                day: Int32.Parse(item.Substring(0, 2)),    //日
                                hour: Int32.Parse(item.Substring(2, 2)),   //时
                                minute: Int32.Parse(item.Substring(4, 2)), //分
                                second: 0
                                );
                            string datasegs = item.Substring(6, 6);
                            datas.Add(new CTimeAndData
                                {
                                    Time = recvTime,
                                    Data = datasegs
                                });
                        }
                    }
                    else
                    {
                        //GSM类型
                        int dateYear  = Int32.Parse("20" + data.Substring(10, 2));  // 年
                        int dateMonth = Int32.Parse(data.Substring(12, 2));         // 月
                        int dateDay   = Int32.Parse(data.Substring(14, 2));         // 日
                        int dateHour  = Int32.Parse(data.Substring(16, 2));         // 时

                        //数据处理
                        var lists = data.Substring(18).Split(CSpecialChars.BALNK_CHAR);
                        foreach (var item in lists)
                        {
                            DateTime recvTime = new DateTime(
                                year: dateYear,                            //年
                                month: dateMonth,                          //月
                                day: dateDay,                              //日
                                hour: dateHour,                            //时
                                minute: Int32.Parse(item.Substring(0, 2)), //分
                                second: 0
                                );
                            string datasegs = item.Substring(2, 6);
                            datas.Add(new CTimeAndData
                                {
                                    Time = recvTime,
                                    Data = datasegs
                                });
                        }
                    }
                } break;
                }
                batch.Datas = datas;
                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("数据:" + msg);
                System.Diagnostics.Debug.WriteLine("批量数据解析不完整" + exp.Message);
            }
            return(false);
        }
Exemple #3
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);
        }
Exemple #4
0
        public bool Parse_Old(string msg, out List <CUpReport> upReport)
        {
            upReport = new List <CUpReport>();
            var msgSegs = msg.Split(CSpecialChars.BALNK_CHAR);

            foreach (var msgItem in msgSegs)
            {
                try
                {
                    CUpReport report = null;
                    string    data   = string.Empty;
                    if (!ProtocolHelpers.DeleteSpecialChar(msgItem, out data))
                    {
                        return(false);
                    }

                    //  解析站点ID
                    String StationID = data.Substring(0, 4);
                    //  解析通信类别
                    String type = data.Substring(4, 2);
                    //  解析报文类别
                    EMessageType reportType = ProtocolMaps.MessageTypeMap.FindKey(data.Substring(6, 2));
                    //  解析站点类别
                    EStationType stationType = ProtocolHelpers.ProtoStr2StationType(data.Substring(8, 2));
                    // 解析接收时间
                    DateTime recvTime = new DateTime(
                        year: Int32.Parse("20" + data.Substring(10, 2)),              //年
                        month: Int32.Parse(data.Substring(12, 2)),                    //月
                        day: Int32.Parse(data.Substring(14, 2)),                      //日
                        hour: Int32.Parse(data.Substring(16, 2)),                     //时
                        minute: Int32.Parse(data.Substring(18, 2)),                   //分
                        second: 0
                        );
                    //  解析包序号
                    string packageNum = data.Substring(20, 2);
                    //  解析数据
                    string  item   = data.Substring(22);
                    CUpData upData = new CUpData();

                    while (item.Length > 2)
                    {
                        try
                        {
                            //  数据分为两部分
                            //  2 Byte 指令  +  剩下的为数据,数据的长度>= 1
                            //  解析指令类型param
                            EOldParam param = OldTypeMaps.OldParamMap.FindKey(item.Substring(0, 2));
                            //  如果接收到的数据段长度大于2,表示对应的字段有值
                            //  默认为String.Empty
                            string info   = string.Empty;
                            int    length = Int32.Parse(OldTypeMaps.OldParamLengthMap.FindValue(param));
                            info = item.Substring(2);
                            if (String.IsNullOrEmpty(info) && ProtocolHelpers.isLegalCharacters(info))
                            {
                                continue;
                            }

                            switch (param)
                            {
                            case EOldParam.Rain:
                                upData.Rain = Decimal.Parse(info.Substring(0, length)); break;

                            case EOldParam.Water:
                                upData.Water1 = Decimal.Parse(info.Substring(0, length)) * (Decimal)0.01; break;

                            case EOldParam.WaterTimed:
                                //  将水位定时报中的数据储存到list中
                                var waterList = new Dictionary <DateTime, Decimal>();
                                int roundNum  = Int32.Parse(info.Substring(0, 2));
                                var watersegs = info;
                                if (roundNum == 01 || roundNum == 02)
                                {
                                    roundNum  = roundNum == 01 ? 12 : 24;
                                    length    = roundNum == 24 ? 96 : 48;
                                    watersegs = info.Substring(2);
                                }
                                else
                                {
                                    roundNum = 12;
                                }
                                recvTime = recvTime.AddMinutes(-5 * roundNum);

                                for (int i = 1; i <= roundNum; i++)
                                {
                                    DateTime WaterTime  = recvTime.AddMinutes(5);
                                    Decimal  TimedWater = Decimal.Parse(watersegs.Substring(0, 4)) * (Decimal)0.01;
                                    waterList.Add(WaterTime, TimedWater);
                                    watersegs = watersegs.Substring(4);
                                }
                                upData.WaterList = waterList;
                                break;

                            case EOldParam.HalfVoltage:
                                //  将电压值存入list中
                                var      halfVoltageList = new Dictionary <DateTime, Decimal>();
                                DateTime HalfVoltageTime = recvTime;
                                for (int i = 1; i <= 12; i++)
                                {
                                    Decimal Voltage = Decimal.Parse(info.Substring(0, 4)) * (Decimal)0.01;
                                    HalfVoltageTime = recvTime.AddHours(-1 * (i - 1));
                                    halfVoltageList.Add(HalfVoltageTime, Voltage);
                                    info = info.Substring(4);
                                }
                                upData.VoltageList = halfVoltageList;
                                break;

                            case EOldParam.Voltage:
                                upData.Voltage = (Decimal.Parse(info.Substring(0, length)) * (Decimal)0.01); break;

                            case EOldParam.AllVoltage:
                                //  将电压值存入list中
                                var      allVoltageList = new Dictionary <DateTime, Decimal>();
                                DateTime AllVoltageTime = recvTime;
                                for (int i = 1; i <= 24; i++)
                                {
                                    Decimal Voltage = Decimal.Parse(info.Substring(0, 4)) * (Decimal)0.01;
                                    AllVoltageTime = recvTime.AddHours(-1 * (i - 1));
                                    allVoltageList.Add(AllVoltageTime, Voltage);
                                    info = info.Substring(4);
                                }
                                upData.VoltageList = allVoltageList;
                                break;

                            case EOldParam.Interval:
                                int Interval = Int32.Parse(info.Substring(0, length)); break;

                            case EOldParam.ESaveNum:
                                int ESaveNum = Int32.Parse(info.Substring(0, length)); break;

                            case EOldParam.ETimedNum:
                                int ETimedNum = Int32.Parse(info.Substring(0, length)); break;

                            case EOldParam.WaterBase:
                                decimal WaterBase = Decimal.Parse(info.Substring(0, length)) * (Decimal)0.01; break;

                            case EOldParam.MannualWater:
                                DateTime MannualWaterTime = new DateTime(
                                    year: Int32.Parse(info.Substring(0, 2)),
                                    month: Int32.Parse(info.Substring(2, 2)),
                                    day: Int32.Parse(info.Substring(4, 2)),
                                    hour: Int32.Parse(data.Substring(6, 2)),
                                    minute: Int32.Parse(data.Substring(8, 2)),
                                    second: 0
                                    );
                                recvTime = MannualWaterTime;
                                Decimal MannualWater = Decimal.Parse(info.Substring(10, 6)) * (Decimal)0.01;
                                upData.WaterList.Add(MannualWaterTime, MannualWater);
                                break;

                            case EOldParam.WaterAddRange:
                                Decimal WaterAddRange = Decimal.Parse(info.Substring(0, length)); break;

                            case EOldParam.RainAddRange:
                                Decimal RainAddRange = Decimal.Parse(info.Substring(0, length)); break;

                            case EOldParam.DestPhoneNum:
                                string DestPhoneNum = info.Substring(0, length); break;

                            case EOldParam.TerminalNum:
                                string TerminalNum = info.Substring(0, length); break;

                            case EOldParam.RespWave:
                                string RespWave = info.Substring(0, length); break;

                            case EOldParam.WavePost:
                                int WavePost = Int32.Parse(info.Substring(0, length)); break;

                            case EOldParam.WorkStatus:
                                EWorkStatus WorkStatus = OldTypeMaps.WorkStatus4ProtoMap.FindKey(info.Substring(0, length)); break;

                            case EOldParam.StandbyChannel:
                                ChannelType MainChannel = OldTypeMaps.ChannelType4ProtoMap.FindKey(info.Substring(0, 2));
                                System.Diagnostics.Debug.Assert(MainChannel != ChannelType.None, "主用信道不能为NONE");
                                ChannelType ViceChannel = OldTypeMaps.ChannelType4ProtoMap.FindKey(info.Substring(2, 2));
                                break;

                            case EOldParam.GSMSignal:
                                Decimal GSMSignal = Decimal.Parse(info.Substring(0, length)); break;

                            case EOldParam.MannualFlow:
                                DateTime MannualFlowTime = new DateTime(
                                    year: Int32.Parse(info.Substring(0, 2)),
                                    month: Int32.Parse(info.Substring(2, 2)),
                                    day: Int32.Parse(info.Substring(4, 2)),
                                    hour: Int32.Parse(data.Substring(6, 2)),
                                    minute: Int32.Parse(data.Substring(8, 2)),
                                    second: 0
                                    );
                                recvTime         = MannualFlowTime;
                                upData.WaterFlow = Decimal.Parse(info.Substring(10, 6)) * (Decimal)0.01;
                                break;

                            case EOldParam.GSMElec:
                                EGSMElec GSMElec = OldTypeMaps.GSMElec4ProtoMap.FindKey(info.Substring(0, length)); break;

                            case EOldParam.WaterTemp:
                                upData.WaterTemp = Decimal.Parse(info.Substring(0, length)) * (Decimal)0.1; break;

                            case EOldParam.DataPackNum:
                                int dataPackNum = Int32.Parse(info.Substring(0, length)); break;

                            default: break;
                            }
                            item = item.Substring(2 + length);
                        }
                        catch (Exception e)
                        {
                            System.Diagnostics.Debug.WriteLine("数据:" + msg);
                            System.Diagnostics.Debug.WriteLine("下行指令解析数据不完整!" + e.Message);
                            break;
                        }

                        //填充基本数据
                        report = new CUpReport()
                        {
                            Stationid   = StationID,
                            Type        = type,
                            ReportType  = reportType,
                            StationType = stationType,
                            RecvTime    = recvTime,
                            PackageNum  = packageNum,
                            Data        = upData
                        };
                        upReport.Add(report);
                    }
                }
                catch (Exception exp)
                {
                    System.Diagnostics.Debug.WriteLine(exp.Message);
                    continue;
                }
            }
            return(true);
        }
Exemple #5
0
        public bool Parse(String msg, out CReportStruct report)
        {
            //6013 $60131G2201161111040003046112271367
            report = null;
            try
            {
                string data = string.Empty;
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }

                //  解析站点ID
                String stationID = data.Substring(0, 4);
                //  解析通信类别
                String type = data.Substring(4, 2);
                //  解析报文类别
                EMessageType reportType = ProtocolMaps.MessageTypeMap.FindKey(data.Substring(6, 2));

                //  解析站点类别
                //EStationType stationType = EStationType.EHydrology;
                //String stationTypeStr = data.Substring(8, 2);
                //switch (stationTypeStr)
                //{
                //    case "01":  //  雨量
                //        stationType = EStationType.ERainFall;
                //        break;
                //    case "02":  //  水位
                //    case "12":
                //        stationType = EStationType.ERiverWater;
                //        break;
                //    case "03":  //  水文
                //    case "13":
                //        stationType = EStationType.EHydrology;
                //        break;
                //}
                EStationType stationType = ProtocolHelpers.ProtoStr2StationType(data.Substring(8, 2));

                //  解析接收时间
                DateTime recvTime = DateTime.Now;

                //  获取数据段,不包含站号、类别、报类、站类信息
                var lists = data.Substring(10).Split(CSpecialChars.BALNK_CHAR);
                var datas = GetData(lists, stationType);

                report = new CReportStruct()
                {
                    Stationid   = stationID,
                    Type        = type,
                    ReportType  = reportType,
                    StationType = stationType,
                    RecvTime    = recvTime,
                    Datas       = datas
                };
                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("数据:" + msg);
                System.Diagnostics.Debug.WriteLine("上行指令解析数据不完整!" + exp.Message);
            }
            return(false);
        }
Exemple #6
0
        //  批量数据flash下行解析
        public bool Parse_Flash(String msg, EChannelType ctype, out CBatchStruct batch)
        {
            batch = new CBatchStruct();
            try
            {
                string data = string.Empty;
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }

                //  解析站点ID , 4位     0001
                batch.StationID = data.Substring(0, 4);
                //  解析命令指令 ,2位     1K
                batch.Cmd = data.Substring(4, 2);
                //  解析站点类型, 2位     01
                batch.StationType = ProtocolHelpers.ProtoStr2StationType_1(data.Substring(6, 2));
                //  解析传输类型, 2位     02/03
                batch.TransType = ProtocolMaps.TransMap.FindKey(data.Substring(8, 2));

                //创建返回的数据对象
                var datas = new List <CTimeAndData>();
                //ByDay ByHour区分
                //02 按天传   03按小时  04按一天整点
                switch (batch.TransType)
                {
                //按天传 02
                case ETrans.ByDay:
                {
                    int dateYear  = Int32.Parse("20" + data.Substring(10, 2));  // 年
                    int dateMonth = Int32.Parse(data.Substring(12, 2));         // 月

                    //数据处理
                    data = data.Substring(14);
                    while (data.Length >= 12)
                    {
                        DateTime recvTime = new DateTime(
                            year: dateYear,                            //年
                            month: dateMonth,                          //月
                            day: Int32.Parse(data.Substring(0, 2)),    //日
                            hour: Int32.Parse(data.Substring(2, 2)),   //时
                            minute: Int32.Parse(data.Substring(4, 2)), //分
                            second: 0
                            );
                        string datasegs = data.Substring(6, 6);
                        datas.Add(new CTimeAndData
                            {
                                Time = recvTime,
                                Data = datasegs
                            });
                        data = data.Substring(12);
                    }
                }
                break;

                //按小时传 03
                case ETrans.ByHour:
                {
                    //判断是GSM还是GPRS传送方式
                    //GSM:yymmddhh  GPRS:yymm
                    if (ctype == EChannelType.GPRS)
                    {
                        //GPRS类型
                        int dateYear  = Int32.Parse("20" + data.Substring(10, 2));     // 年
                        int dateMonth = Int32.Parse(data.Substring(12, 2));            // 月

                        //数据处理
                        data = data.Substring(14);
                        while (data.Length >= 12)
                        {
                            DateTime recvTime = new DateTime(
                                year: dateYear,                            //年
                                month: dateMonth,                          //月
                                day: Int32.Parse(data.Substring(0, 2)),    //日
                                hour: Int32.Parse(data.Substring(2, 2)),   //时
                                minute: Int32.Parse(data.Substring(4, 2)), //分
                                second: 0
                                );
                            string datasegs = data.Substring(6, 6);
                            datas.Add(new CTimeAndData
                                {
                                    Time = recvTime,
                                    Data = datasegs
                                });
                            data = data.Substring(12);
                        }
                    }
                    else if (ctype == EChannelType.GSM)
                    {
                        //GSM类型
                        int dateYear  = Int32.Parse("20" + data.Substring(10, 2));  // 年
                        int dateMonth = Int32.Parse(data.Substring(12, 2));         // 月
                        int dateDay   = Int32.Parse(data.Substring(14, 2));         // 日
                        int dateHour  = Int32.Parse(data.Substring(16, 2));         // 时

                        //数据处理
                        data = data.Substring(14);
                        while (data.Length >= 12)
                        {
                            DateTime recvTime = new DateTime(
                                year: dateYear,                            //年
                                month: dateMonth,                          //月
                                day: dateDay,                              //日
                                hour: dateHour,                            //时
                                minute: Int32.Parse(data.Substring(0, 2)), //分
                                second: 0
                                );
                            string datasegs = data.Substring(2, 6);
                            datas.Add(new CTimeAndData
                                {
                                    Time = recvTime,
                                    Data = datasegs
                                });
                            data = data.Substring(8);
                        }
                    }
                }
                break;

                //按一天整点传 04
                case ETrans.ByDayHour:
                {
                    int dateYear  = Int32.Parse("20" + data.Substring(10, 2)); // 年
                    int dateMonth = Int32.Parse(data.Substring(12, 2));        // 月
                    int dateDay   = Int32.Parse(data.Substring(14, 2));        // 日

                    //数据处理
                    data = data.Substring(16);
                    while (data.Length >= 8)
                    {
                        DateTime recvTime = new DateTime(
                            year: dateYear,                          //年
                            month: dateMonth,                        //月
                            day: dateDay,                            //日
                            hour: Int32.Parse(data.Substring(0, 2)), //时
                            minute: 0,                               //分
                            second: 0
                            );
                        string datasegs = data.Substring(2, 6);
                        datas.Add(new CTimeAndData
                            {
                                Time = recvTime,
                                Data = datasegs
                            });
                        data = data.Substring(8);
                    }
                }
                break;
                }
                batch.Datas = datas;
                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("数据:" + msg);
                System.Diagnostics.Debug.WriteLine("批量数据解析不完整" + exp.Message);
            }
            return(false);
        }
        /// <summary>
        /// 设置指令设置
        /// </summary>
        /// <param name="sid"></param>
        /// <param name="cmds"></param>
        /// <param name="down"></param>
        /// <param name="ctype"></param>
        /// <returns>
        /// GMS:
        ///     如果返回结果的长度>140字符,发送命令为String.Empty,即不发送命令
        ///     否则发送设置指令
        /// GPRS:
        ///     发送指令长度字节数的限制
        /// Beidou:
        ///      判断最终查询后的长度是否大于79*2Byte
        ///          如果大于79*2Byte,返回String.Empty
        /// </returns>
        public String BuildSet(string sid, IList <EDownParam> cmds, CDownConf down, EChannelType ctype)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(ProtocolMaps.ChannelProtocolStartCharMap.FindValue(ctype));
            sb.Append(String.Format("{0:D4}", Int32.Parse(sid.Trim())));
            sb.Append("0S");

            int length = 6;

            foreach (var cmd in cmds)
            {
                length = length + 3 + Int32.Parse(ProtocolMaps.DownParamLengthMap[cmd]);

                sb.Append(CSpecialChars.BALNK_CHAR);
                sb.Append(ProtocolMaps.DownParamMap.FindValue(cmd));
                switch (cmd)
                {
                case EDownParam.Clock: sb.Append(down.Clock.Value.ToString("yyMMddHHmmss")); break;

                case EDownParam.NormalState: sb.Append(ProtocolMaps.NormalState4ProtoMap.FindValue(down.NormalState.Value)); break;

                case EDownParam.Voltage: sb.Append(String.Format("{0:D4}", (int)down.Voltage.Value)); break;

                case EDownParam.StationCmdID: sb.Append(down.StationCmdID); break;

                case EDownParam.TimeChoice: sb.Append(ProtocolMaps.TimeChoice4ProtoMap.FindValue(down.TimeChoice.Value)); break;

                case EDownParam.TimePeriod: sb.Append(ProtocolMaps.TimePeriodMap.FindValue(down.TimePeriod.Value)); break;

                case EDownParam.WorkStatus: sb.Append(ProtocolMaps.WorkStatus4ProtoMap.FindValue(down.WorkStatus.Value)); break;

                case EDownParam.VersionNum: sb.Append(down.VersionNum); break;

                case EDownParam.StandbyChannel:
                    sb.Append(ProtocolMaps.ChannelType4ProtoMap.FindValue(down.MainChannel.Value));
                    sb.Append(ProtocolMaps.ChannelType4ProtoMap.FindValue(down.ViceChannel.Value));
                    break;

                case EDownParam.TeleNum: sb.Append(down.TeleNum); break;

                case EDownParam.RingsNum: sb.Append(String.Format("{0:D2}", (int)down.RingsNum.Value)); break;

                case EDownParam.DestPhoneNum: sb.Append(down.DestPhoneNum); break;

                case EDownParam.TerminalNum: sb.Append(down.TerminalNum); break;

                case EDownParam.RespBeam: sb.Append(down.RespBeam); break;

                case EDownParam.AvegTime: sb.Append(String.Format("{0:D2}", (int)down.AvegTime.Value)); break;

                case EDownParam.KC: sb.Append(down.KC); break;

                case EDownParam.RainPlusReportedValue: sb.Append(String.Format("{0:D2}", (int)down.RainPlusReportedValue.Value)); break;

                case EDownParam.Rain: sb.Append(String.Format("{0:D4}", (int)down.Rain.Value)); break;

                case EDownParam.Water: sb.Append(String.Format("{0:D6}", (int)down.StorageWater.Value)); break;

                case EDownParam.WaterPlusReportedValue: sb.Append(String.Format("{0:D2}", (int)down.WaterPlusReportedValue.Value)); break;

                case EDownParam.SelectCollectionParagraphs: sb.Append(ProtocolMaps.SelectCollectionParagraphs4ProtoMap.FindValue(down.SelectCollectionParagraphs.Value)); break;

                case EDownParam.StationType: sb.Append(ProtocolHelpers.StationType2ProtoStr_set(down.StationType.Value)); break;

                case EDownParam.UserName: sb.Append(down.UserName); break;

                case EDownParam.StationName: sb.Append(down.StationName); break;

                default:
                    throw new Exception("设置下行指令参数错误");
                }
            }
            sb.Append(CSpecialChars.ENTER_CHAR);
            if (ctype == EChannelType.GSM)
            {
                //  GSM类型
                //  判断最终查询后的长度是否大于140Byte
                //      如果大于140Byte,返回String.Empty
                return(length > 140 ? string.Empty : sb.ToString());
            }
            else if (ctype == EChannelType.GPRS)
            {
                return(sb.ToString());
            }
            else if (ctype == EChannelType.BeiDou)
            {
                //  Beidou类型
                //  判断最终查询后的长度是否大于79*2Byte
                //      如果大于79*2Byte,返回String.Empty
                return((length > 79 * 2) ? string.Empty : sb.ToString());
            }
            throw new Exception("信道协议未编写!");
        }
        /// <summary>
        /// 对下游局报讯报文进行处理
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="report"></param>
        /// <returns></returns>
        public bool Parse(String msg, out CReportStruct report)
        {
            //$30151G22010201120326001297065535323906553532390655353239065535323906553532390655353239065535323906553532390655353239065535323906553532390655353239
            report = null;
            try
            {
                string data = string.Empty;
                //卫星信道报
                if (msg.StartsWith("$"))
                {
                    data = ProtocolHelpers.dealBCD(data);
                }
                //去除起始符'$'
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }
                //站号(4位)
                string StationId = data.Substring(0, 4);
                //类别(2位):1G
                string type = data.Substring(4, 2);
                //报类(2位):22-定时报
                string reportTypeString = data.Substring(6, 2);
                //站类(2位)
                string stationTypeString = data.Substring(8, 2);
                ///0201120326001297065535323906553532390655353239065535323906553532390655353239065535323906553532390655353239065535323906553532390655353239
                //站类区别处理
                switch (reportTypeString)
                {
                //定时报
                case "22":
                {
                    //获取报类
                    EMessageType reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                    //获取站类
                    EStationType stationType = ProtocolHelpers.ProtoStr2StationType(stationTypeString);
                    //包序号暂不处理
                    string packageNum = data.Substring(10, 4);
                    //接收时间
                    DateTime 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: 0,
                        second: 0
                        );
                    //电压值:1297=12.97V
                    Decimal voltage = Decimal.Parse(data.Substring(22, 4)) * (Decimal)0.01;
                    //数据段
                    var lists = data.Substring(26).Replace(" ", "");
                    var datas = GetData(lists, recvTime, voltage, stationType);
                    report = new CReportStruct()
                    {
                        Stationid   = StationId,
                        Type        = type,
                        ReportType  = reportType,
                        StationType = stationType,
                        RecvTime    = recvTime,
                        Datas       = datas
                    };
                    break;
                }

                //报讯系统加报
                case "21":
                {
                    if (data.Substring(8, 2) != "11")
                    {
                        //  解析报文类别
                        EMessageType reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                        //  解析站点类别
                        EStationType stationType = ProtocolHelpers.ProtoStr2StationType(stationTypeString);
                        //  解析接收时间
                        DateTime recvTime = new DateTime(
                            year: Int32.Parse("20" + data.Substring(10, 2)), //年
                            month: Int32.Parse(data.Substring(12, 2)),       //月
                            day: Int32.Parse(data.Substring(14, 2)),         //日
                            hour: Int32.Parse(data.Substring(16, 2)),        //时
                            minute: Int32.Parse(data.Substring(18, 2)),      //分
                            second: 0                                        //秒
                            );

                        var lists = data.Substring(20).Split(CSpecialChars.BALNK_CHAR);
                        var datas = GetAddData(lists, recvTime, stationType);

                        report = new CReportStruct()
                        {
                            Stationid   = StationId,
                            Type        = type,
                            ReportType  = reportType,
                            StationType = stationType,
                            RecvTime    = recvTime,
                            Datas       = datas
                        };
                    }
                    else
                    {
                        //1G2111为人工水位

                        //  解析报文类别
                        EMessageType reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                        //  解析站点类别
                        EStationType stationType = EStationType.ERiverWater;
                        //  解析接收时间
                        DateTime recvTime = new DateTime(
                            year: DateTime.Now.Year,                    //年
                            month: DateTime.Now.Month,                  //月
                            day: DateTime.Now.Day,                      //日
                            hour: Int32.Parse(data.Substring(10, 2)),   //时
                            minute: Int32.Parse(data.Substring(12, 2)), //分
                            second: 0                                   //秒
                            );

                        var lists = data.Substring(14).Split(CSpecialChars.BALNK_CHAR);
                        var datas = GetMannualData(lists, recvTime);

                        //处理datas为空情况
                        if (datas.Count == 0)
                        {
                            return(false);
                        }

                        report = new CReportStruct()
                        {
                            Stationid   = StationId,
                            Type        = type,
                            ReportType  = reportType,
                            StationType = stationType,
                            RecvTime    = recvTime,
                            Datas       = datas
                        };
                    }
                    break;
                }

                //人工报
                case "23":
                {
                    //1G23为人工流量
                    //  解析报文类别
                    EMessageType reportType = EMessageType.EMannual;
                    //  解析站点类别
                    EStationType stationType = EStationType.ERiverWater;
                    //  解析接收时间
                    DateTime recvTime = new DateTime(
                        year: DateTime.Now.Year,                    //年
                        month: DateTime.Now.Month,                  //月
                        day: Int32.Parse(data.Substring(8, 2)),     //日
                        hour: Int32.Parse(data.Substring(10, 2)),   //时
                        minute: Int32.Parse(data.Substring(12, 2)), //分
                        second: 0                                   //秒
                        );

                    var lists = data.Substring(14).Split(CSpecialChars.BALNK_CHAR);
                    var datas = GetWaterData(lists, recvTime);

                    report = new CReportStruct()
                    {
                        Stationid   = StationId,
                        Type        = type,
                        ReportType  = reportType,
                        StationType = stationType,
                        RecvTime    = recvTime,
                        Datas       = datas
                    };
                    break;
                }
                }
                return(true);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("数据:" + msg);
                System.Diagnostics.Debug.WriteLine("数据协议解析不完整" + e.Message);
                return(false);
            }
        }
Exemple #9
0
        //批量传输Flash解析
        public bool Parse_Flash(String msg, out CBatchStruct batch)
        {
            batch = new CBatchStruct();
            try
            {
                string data = string.Empty;
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }
                Debug.WriteLine(msg);
                //  解析站点ID , 4位     0001
                batch.StationID = data.Substring(0, 4);
                //  解析命令指令 ,2位     1K
                batch.Cmd = data.Substring(4, 2);
                //  解析站点类型, 2位     01
                batch.StationType = ProtocolHelpers.ProtoStr2StationType(data.Substring(6, 2));

                //  解析传输类型, 2位      03
                batch.TransType = ProtocolMaps.TransMap.FindKey(data.Substring(8, 2));

                var datas = new List <CTimeAndData>();
                //  按小时传
                int    year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;
                int    segLength = 0;
                string dataSegs  = string.Empty;
                switch (batch.TransType)
                {
                case ETrans.ByHour:
                    year  = Int32.Parse("20" + data.Substring(10, 2)); //  年       yy
                    month = Int32.Parse(data.Substring(12, 2));        //  月       mm

                    //  截取日、小时、分钟和数据段 ,以\r结尾
                    //  ddhhmm123456ddhhmm123456ddhhmm123456ddhhmm123456ddhhmm123456ddhhmm123456ddhhmm123456ddhhmm123456ddhhmm123456ddhhmm123456ddhhmm123456ddhhmm123456#13
                    dataSegs  = data.Substring(14);
                    segLength = 12;
                    while (dataSegs.Length >= segLength)
                    {
                        //  读取前8位数据
                        day    = Int32.Parse(dataSegs.Substring(0, 2));    //  日       dd
                        hour   = Int32.Parse(dataSegs.Substring(2, 2));    //  小时      hh
                        minute = Int32.Parse(dataSegs.Substring(4, 2));    //  分钟   mm
                        string value = dataSegs.Substring(6, 6);
                        datas.Add(new CTimeAndData()
                        {
                            Time = new DateTime(year, month, day, hour, minute, 0),
                            Data = value
                        });
                        //  取剩下的分钟和数据段
                        dataSegs = dataSegs.Substring(segLength);
                    }
                    break;

                case ETrans.ByDay:                                     //  按天传
                    year  = Int32.Parse("20" + data.Substring(10, 2)); //  年     yy
                    month = Int32.Parse(data.Substring(12, 2));        //  月     mm
                    DateTime dt = new DateTime();

                    //day = Int32.Parse(data.Substring(14, 2));        //  日     dd
                    //hour = Int32.Parse(data.Substring(16, 2));       //  小时   hh
                    //DateTime dt = new DateTime(year, month, day, hour, 0, second);
                    ////  截取分钟和数据段
                    ////  mm123456mm123456mm123456mm123456mm123456mm123456mm123456mm123456mm123456mm123456mm123456mm123456#13
                    dataSegs  = data.Substring(14);
                    segLength = 12;
                    // int previousMinute = 0;
                    //bool isFirst = true;
                    while (dataSegs.Length >= segLength)
                    {
                        day    = Int32.Parse(dataSegs.Substring(0, 2));     //  日     dd
                        hour   = Int32.Parse(dataSegs.Substring(2, 2));     //  小时   hh
                        minute = Int32.Parse(dataSegs.Substring(4, 2));     //  分钟   mm
                        second = 0;
                        //  第一段数据
                        //if (isFirst)
                        //{
                        //    dt = new DateTime(year, month, day, hour, minute, second);
                        //}

                        //  不是第一段数据
                        dt = new DateTime(year, month, day, hour, minute, second);
                        //if (!isFirst)
                        //{
                        //    if (previousMinute >= minute)
                        //    {
                        //        dt = dt.AddHours(1);
                        //        //double addhour = 1;
                        //        //dt.AddHours(addhour);
                        //    }
                        //    dt = new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, minute, dt.Second);
                        //}

                        //Int32 value = Int32.Parse(dataSegs.Substring(2, 6));//  数据   123456
                        string value = dataSegs.Substring(6, 6);
                        datas.Add(new CTimeAndData()
                        {
                            Time = dt,
                            Data = value
                        });

                        Debug.WriteLine(string.Format("{0:D2}  {1:D6}  ------ {2}   {3:D6}", minute, value, dt.ToString("yyyyMMdd HH:mm:ss"), value));

                        //  取剩下的日,小时,分钟和数据段
                        dataSegs = dataSegs.Substring(segLength);
                        //previousMinute = minute;
                        //isFirst = false;
                    }
                    break;
                }
                batch.Datas = datas;
                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("数据:" + msg);
                System.Diagnostics.Debug.WriteLine("Flash批量传输解析数据不完整!" + exp.Message);
            }
            return(false);
        }
Exemple #10
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);
        }
Exemple #11
0
        public bool Parse(string msg, out CReportStruct report)
        {
            report = new CReportStruct();
            //List<CReportData> dataList = new List<CReportData>();
            List <CReportObs> dataList = new List <CReportObs>();

            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.处理obs信息
                //CReportData speedData = new CReportData();
                CReportObs obsData = new CReportObs();
                //1.1 obs信息
                int flagIndex = allElmtData.IndexOf("@@ OBS3A");

                int    keyLength = int.Parse(allElmtData.Substring(8, 4));
                string elmtData  = allElmtData.Substring(flagIndex, keyLength);
                //判定要素1的开始符号和结束符号
                if (elmtData.StartsWith("@@ OBS3A") && elmtData.EndsWith("**"))
                {
                    elmtData = elmtData.Substring(12, keyLength - 14).Trim();
                    //判定时差法数据的开始符号和接受符号

                    try
                    {
                        elmtData = new System.Text.RegularExpressions.Regex("[\\s]+").Replace(elmtData, " ");
                        string[] elmtDataList = elmtData.Split(' ');
                        if (elmtDataList.Length == 10)
                        {
                            decimal?deepth   = decimal.Parse(elmtDataList[2]);
                            decimal?ntu      = decimal.Parse(elmtDataList[3]);
                            decimal?mud      = decimal.Parse(elmtDataList[4]);
                            decimal?tmp      = decimal.Parse(elmtDataList[5]);
                            decimal?cndcty   = decimal.Parse(elmtDataList[6]);
                            decimal?salinity = decimal.Parse(elmtDataList[7]);
                            decimal?batt     = decimal.Parse(elmtDataList[8]);
                            obsData.Depth    = deepth;
                            obsData.Ntu      = ntu;
                            obsData.Mud      = mud;
                            obsData.Tmp      = tmp;
                            obsData.Cndcty   = cndcty;
                            obsData.Salinity = salinity;
                            obsData.Batt     = batt;
                            dataList.Add(obsData);
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    catch (Exception e)
                    {
                        return(false);
                    }



                    report.Stationid   = StationId;
                    report.Type        = type;
                    report.ReportType  = reportType;
                    report.StationType = stationType;
                    report.RecvTime    = recvTime;
                    report.obsDatas    = 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);
        }
Exemple #13
0
        //  批量数据UBatch下行解析
        public bool Parse(String msg, out CBatchStruct batch)
        {
            batch = new CBatchStruct();
            try
            {
                string data = string.Empty;
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }

                //  解析站点ID , 4位     0001
                batch.StationID = data.Substring(0, 4);
                //  解析命令指令 ,2位     1K
                batch.Cmd = data.Substring(4, 2);
                //  解析站点类型, 2位     01
                batch.StationType = ProtocolHelpers.ProtoStr2StationType(data.Substring(6, 2));
                int DataYear  = Int32.Parse(data.Substring(8, 2));
                int DataMonth = Int32.Parse(data.Substring(10, 2));
                int DataDay   = Int32.Parse(data.Substring(12, 2));
                //创建返回的数据对象
                var datas = new List <CTimeAndData>();
                var lists = data.Substring(14).Split(CSpecialChars.BALNK_CHAR);

                foreach (var item in lists)
                {
                    string itemData = item;
                    while (itemData.Length > 0)
                    {
                        int DataHour   = Int32.Parse(itemData.Substring(0, 2));
                        int DataMinute = Int32.Parse(itemData.Substring(2, 2));
                        //  解析出数据时间
                        DateTime recvTime = new DateTime(
                            year: DataYear,
                            month: DataMonth,
                            day: DataDay,
                            hour: DataHour,
                            minute: DataMinute,
                            second: 0
                            );
                        //  解析出16进制的数据
                        string itemDatas = itemData.Substring(4, 4);
                        //  将16进制数据转化为10进制
                        itemDatas = int.Parse(itemDatas, System.Globalization.NumberStyles.AllowHexSpecifier).ToString();

                        //  创建CTimeAndData对象
                        CTimeAndData result = new CTimeAndData();
                        result.Time = recvTime;
                        result.Data = itemDatas;
                        //  将对像填充至list中
                        datas.Add(result);

                        //构成循环
                        itemData = itemData.Substring(10);
                    }
                }

                batch.Datas = datas;
                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("数据:" + msg);
                System.Diagnostics.Debug.WriteLine("批量数据解析不完整" + exp.Message);
            }
            return(false);
        }
        // 处理COUT类型数据
        private void DealCOUT(string msg)
        //  private String DealCOUT(string msg)
        {
            string result = null;

            InvokeMessage("通信输出  " + msg, "接收");
            SendBackTTCAString = msg;
            if (msg.Contains("COUT"))
            {
                if (msg.Contains("COUT"))
                {
                    num = num + 1;
                    FileStream   fs = new FileStream("numbd.txt", FileMode.Create);
                    StreamWriter sw = new StreamWriter(fs);
                    //开始写入
                    sw.Write(num);
                    //清空缓冲区
                    sw.Flush();
                    //关闭流
                    sw.Close();
                    fs.Close();
                }
            }
            // InvokeString(msg);
            var cout = BeidouHelper.GetCOUTInfo(msg);

            if (cout == null)
            {
                return;
            }

            //  return result;
            //  发送COSS指令
            //  必须在1秒内发送给卫星终端,否则会重新发送“通信输出”
            var coss = new CCOSSStruct();

            coss.SuccessStatus = true;          //  终端接收到外设通信申请,并校验成功
            SendCOSS(coss);
            //  发送CACA指令
            //  每隔一分钟发送回执$CACA
            //  65秒左右发一条
            var caca = new CCACAStruct();

            caca.SenderID              = "1";                 //  发信方ID为1,表示本机ID,默认
            caca.RecvType              = cout.SenderType;     //  回执的收信方类型  ==  通信输出中的发信方类型
            caca.RecvAddr              = cout.SenderAddr;     //  回执的收信方地址  ==  通信输出中的发信方地址
            caca.Requirements          = "1";                 //  不保密
            caca.ReceiptMsgSequenceNum = cout.MsgSequenceNum; // 回执的报文顺序号  ==  通信输出中的报文顺序号
            caca.ReceiptContent        = "1";
            SendCACA(caca);

            //  解析通信输出中的内容
            string content = cout.MsgContent;

            //通信输出gm8  $60131G2201161111040003046112271367
            try
            {
                string rawMsg  = content;
                string sid     = null;
                string dealMsg = ProtocolHelpers.dealBCD(rawMsg);
                InvokeMessage("COUT数据  " + dealMsg, "接收");
                WriteToFileClass writeClass = new WriteToFileClass("ReceivedLog");
                Thread           t          = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile));
                t.Start("COUT Message: " + " " + dealMsg + "\r\n");
                string bdid = cout.SenderAddr;
                //InvokeMessage("gm3  " + content, "接收");
                //sid需要根据北斗卫星号获取
                try
                {
                    sid = Manager.XmlStationData.Instance.GetStationByBDID(bdid);
                }
                catch (Exception e)
                {
                    sid = "5712";
                    Debug.WriteLine("获取站号失败" + e.Message);
                }
                EMessageType type       = ProtocolMaps.MessageTypeMap.FindKey(dealMsg.Substring(0, 2));
                string       reportType = dealMsg.Substring(0, 2);
                if (reportType == "21" || reportType == "22")   //   定时报,加报
                {
                    //  YAC设备的墒情协议:
                    string stationType = dealMsg.Substring(2, 2);
                    switch (stationType)
                    {
                    //  站类为04时墒情站 05墒情雨量站 06,16墒情水位站 07,17墒情水文站
                    case "04":
                    case "05":
                    case "06":
                    case "07":
                    case "17":
                    {
                        //    var station = FindStationByBeidouID(cout.SenderAddr);
                        //    string currentMsg = rawMsg.Insert(0, "$" + station.StationID + "1G");
                        //    CEntitySoilData soil = new CEntitySoilData();
                        //    CReportStruct soilReport = new CReportStruct();
                        //    if (Soil.Parse(currentMsg, out soil, out soilReport))
                        //    {
                        //        soil.ChannelType = EChannelType.BeiDou;

                        //        if (null != this.SoilDataReceived)
                        //            this.SoilDataReceived(null, new CEventSingleArgs<CEntitySoilData>(soil));

                        //        if (null != soilReport && null != this.UpDataReceived)
                        //        {
                        //            soilReport.ChannelType = EChannelType.BeiDou;
                        //            soilReport.ListenPort = "COM" + this.Port.PortName;
                        //            this.UpDataReceived(null, new UpEventArgs() { RawData = rawMsg, Value = soilReport });
                        //        }
                        //    }

                        //}
                        //1111gm
                        string          newMsg     = dealMsg.Substring(1, dealMsg.Length - 1);
                        CEntitySoilData soil       = new CEntitySoilData();
                        CReportStruct   soilReport = new CReportStruct();
                        if (Soil.Parse(newMsg, out soil, out soilReport))
                        {
                            soilReport.ChannelType = EChannelType.BeiDou;
                            if (null != this.SoilDataReceived)
                            {
                                this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                            }

                            if (null != soilReport && null != this.UpDataReceived)
                            {
                                soilReport.ChannelType = EChannelType.GPRS;
                                soilReport.ListenPort  = "COM" + this.Port.PortName;
                                soilReport.flagId      = bdid;
                                this.UpDataReceived(null, new UpEventArgs()
                                    {
                                        RawData = newMsg, Value = soilReport
                                    });
                            }
                        }
                    }
                    break;

                    //  站类为01,02,03,12,13时,不是墒情站
                    case "01":
                    case "02":
                    case "03":
                    case "12":
                    case "13":
                    {
                        //1111gm
                        //string newMsg = dealMsg.Substring(1, dealMsg.Length - 1);
                        //CReportStruct report = new CReportStruct();
                        //if (Up.Parse(newMsg, out report))
                        //{
                        //    //6013 $60131G2201161111040003046112271367
                        //    report.ChannelType = EChannelType.BeiDou;
                        //    report.ListenPort = "COM" + this.Port.PortName;
                        //    if (this.UpDataReceived != null)
                        //    {
                        //        this.UpDataReceived.Invoke(null, new UpEventArgs() { Value = report, RawData = newMsg });
                        //    }
                        //}
                        CReportStruct report   = new CReportStruct();
                        string        protocol = Manager.XmlStationData.Instance.GetProtocolBySId(sid);

                        if (protocol == "YNXY")
                        {
                            Up = new Data.YNXY.UpParser();
                        }
                        else if (protocol == "ZYJBX")
                        {
                            Up = new UpParser();
                        }
                        if (Up.Parse_beidou(sid, type, rawMsg, out report))
                        {
                            //InvokeMessage("gm6  " + rawMsg, "接收");
                            //$60131G2201161111040003046112271367
                            report.ChannelType = EChannelType.BeiDou;
                            report.ListenPort  = "COM" + this.Port.PortName;
                            report.flagId      = bdid;
                            if (this.UpDataReceived != null)
                            {
                                //InvokeMessage("gm7  " + rawMsg, "接收");
                                this.UpDataReceived.Invoke(null, new UpEventArgs()
                                    {
                                        Value = report, RawData = rawMsg
                                    });
                            }
                        }
                    }
                    break;

                    default:
                        break;
                    }
                }
                else if (reportType == "11")    //  人工水位
                {
                }
                else if (reportType == "23")    //  人工流量
                {
                }
                else if (reportType == "25")
                {
                    var    station    = FindStationByBeidouID(cout.SenderAddr);
                    string currentMsg = dealMsg.Insert(0, "$" + station.StationID + "1G");

                    CEntitySoilData soil       = new CEntitySoilData();
                    CReportStruct   soilReport = new CReportStruct();
                    if (Soil.Parse(currentMsg, out soil, out soilReport))
                    {
                        soil.ChannelType = EChannelType.BeiDou;

                        if (null != this.SoilDataReceived)
                        {
                            this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                        }

                        if (null != soilReport && null != this.UpDataReceived)
                        {
                            soilReport.ChannelType = EChannelType.BeiDou;
                            soilReport.ListenPort  = "COM" + this.Port.PortName;
                            soilReport.flagId      = bdid;
                            this.UpDataReceived(null, new UpEventArgs()
                            {
                                RawData = dealMsg, Value = soilReport
                            });
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("Beidou 数据解析出错 !" + content + "\r\n" + exp.Message);
            }
            //result = msg;
            //return result;
        }
Exemple #15
0
        /// <summary>
        /// 非卫星报文数据解析过程
        /// </summary>
        /// <param name="msg">原始报文数据</param>
        /// <param name="report">报文最终解析出的结果数据结构</param>
        /// <returns>是否解析成功</returns>
        public bool Parse(String msg, out CReportStruct report)
        {
            //$30151G22010201120326001297065535323906553532390655353239065535323906553532390655353239065535323906553532390655353239065535323906553532390655353239
            report = null;
            try
            {
                if (msg == "")
                {
                    return(false);
                }
                string data = string.Empty;
                //去除起始符'$'
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }
                //站号(4位)
                string StationId = data.Substring(0, 4);
                //类别(2位):1G
                string type = data.Substring(4, 2);
                //报类(2位):22-定时报
                string reportTypeString = data.Substring(6, 2);
                //站类(2位)
                string stationTypeString = data.Substring(8, 2);

                EMessageType       reportType;
                EStationType       stationType;
                string             packageNum;
                DateTime           recvTime;
                Decimal            Voltage;
                string             lists;
                List <CReportData> datas;
                ///0201120326001297065535323906553532390655353239065535323906553532390655353239065535323906553532390655353239065535323906553532390655353239
                //站类区别处理
                switch (reportTypeString)
                {
                //定时报新增48段次定时报类
                case "25":
                    //获取报类
                    reportTypeString = "22";
                    reportType       = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                    //获取站类
                    stationType = ProtocolHelpers.ProtoStr2StationType(stationTypeString);
                    //包序号暂不处理
                    packageNum = data.Substring(10, 4);
                    //接收时间
                    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
                        );
                    //电压值:1297=12.97V
                    Voltage = Decimal.Parse(data.Substring(24, 4)) * (Decimal)0.01;
                    //数据段
                    lists  = data.Substring(28).Replace(" ", "");
                    datas  = GetData_1(lists, recvTime, Voltage, stationType);
                    report = new CReportStruct()
                    {
                        Stationid   = StationId,
                        Type        = type,
                        ReportType  = reportType,
                        StationType = stationType,
                        RecvTime    = DateTime.Now,
                        Datas       = datas
                    };
                    break;

                //定时报
                case "22":
                    //获取报类
                    reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                    //获取站类
                    stationType = ProtocolHelpers.ProtoStr2StationType(stationTypeString);
                    //包序号
                    packageNum = data.Substring(10, 4);
                    //接收时间
                    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: 0,
                        second: 0
                        );
                    //把包序号写入缓存
                    CEntityPackage package = new CEntityPackage()
                    {
                        StrStationID = StationId,
                        PackageNum   = packageNum,
                        time         = recvTime
                    };
                    if (cEntityPackage.ContainsKey(StationId))
                    {
                        cEntityPackage[StationId] = package;
                    }
                    else
                    {
                        cEntityPackage.Add(StationId, package);
                    }
                    //电压值:1297=12.97V
                    Voltage = Decimal.Parse(data.Substring(22, 4)) * (Decimal)0.01;
                    //数据段
                    lists  = data.Substring(26).Replace(" ", "");
                    datas  = GetData(lists, recvTime, Voltage, stationType);
                    report = new CReportStruct()
                    {
                        Stationid   = StationId,
                        Type        = type,
                        ReportType  = reportType,
                        StationType = stationType,
                        RecvTime    = DateTime.Now,
                        Datas       = datas
                    };
                    break;

                //报讯系统加报
                case "21":
                {
                    if (data.Substring(8, 2) != "11")
                    {
                        //  解析报文类别
                        reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                        //  解析站点类别
                        stationType = ProtocolHelpers.ProtoStr2StationType(stationTypeString);
                        //  解析接收时间
                        recvTime = new DateTime(
                            year: Int32.Parse("20" + data.Substring(10, 2)), //年
                            month: Int32.Parse(data.Substring(12, 2)),       //月
                            day: Int32.Parse(data.Substring(14, 2)),         //日
                            hour: Int32.Parse(data.Substring(16, 2)),        //时
                            minute: Int32.Parse(data.Substring(18, 2)),      //分
                            second: 0                                        //秒
                            );

                        var dataLists = data.Substring(20).Split(CSpecialChars.BALNK_CHAR);
                        datas = GetAddData(dataLists, recvTime, stationType);

                        report = new CReportStruct()
                        {
                            Stationid   = StationId,
                            Type        = type,
                            ReportType  = reportType,
                            StationType = stationType,
                            RecvTime    = DateTime.Now,
                            Datas       = datas
                        };
                    }
                    break;
                }
                }
                return(true);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("数据:" + msg);
                System.Diagnostics.Debug.WriteLine("中游局协议解析不完整" + e.Message);
                //return false;
            }
            return(false);
        }
Exemple #16
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)
        {
            //$30011G2512010030yymmddhhmm1297001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100001100;
            report = null;
            try
            {
                string data = string.Empty;
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }

                //  解析站号
                String StationId = data.Substring(0, 4);
                //  解析通信类别
                String type = data.Substring(4, 2);
                //定义报文类别
                String reportTypeString = data.Substring(6, 2);
                //定义站点类别
                String stationTypeString = data.Substring(8, 2);
                //  根据报文类别进行区别处理
                switch (reportTypeString)
                {
                case "25":
                {
                    //  解析报文类别
                    reportTypeString = "22";
                    EMessageType reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                    //  解析站点类别
                    EStationType stationType = ProtocolHelpers.ProtoStr2StationType(stationTypeString);
                    //解析间隔分钟
                    int intervalMin = Int32.Parse(data.Substring(10, 2));
                    //解析数据个数
                    int dataNum = Int32.Parse(data.Substring(12, 4));
                    //解析接收时间
                    DateTime recvTime = new DateTime(
                        year: Int32.Parse("20" + data.Substring(16, 2)),          //年
                        month: Int32.Parse(data.Substring(18, 2)),                //月
                        day: Int32.Parse(data.Substring(20, 2)),                  //日
                        hour: Int32.Parse(data.Substring(22, 2)),                 //时
                        minute: Int32.Parse(data.Substring(24, 2)),               //分
                        second: 0
                        );
                    //解析电压 2(整数位)+ 2(小数位) 单位 V
                    Decimal Voltage = Decimal.Parse(data.Substring(26, 4)) * (Decimal)0.01;
                    //获取数据段,不包括间隔分钟、数据个数、电压等
                    var lists = data.Substring(30).Split(CSpecialChars.BALNK_CHAR);
                    var datas = GetProData(intervalMin, dataNum, lists, recvTime, Voltage);

                    report = new CReportStruct()
                    {
                        Stationid   = StationId,
                        Type        = type,
                        ReportType  = reportType,
                        StationType = stationType,
                        RecvTime    = recvTime,
                        Datas       = datas
                    };
                } break;

                case "22":
                {
                    //  解析报文类别
                    EMessageType reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                    //  解析站点类别
                    EStationType stationType = ProtocolHelpers.ProtoStr2StationType(stationTypeString);
                    //解析包序号
                    String PackageNum = data.Substring(10, 4);
                    //解析接收时间
                    DateTime 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: 0,                                       //分
                        second: 0                                        //秒
                        );
                    //把包序号写入缓存
                    CEntityPackage package = new CEntityPackage()
                    {
                        StrStationID = StationId,
                        PackageNum   = PackageNum,
                        time         = recvTime
                    };
                    if (cEntityPackage.ContainsKey(StationId))
                    {
                        cEntityPackage[StationId] = package;
                    }
                    else
                    {
                        cEntityPackage.Add(StationId, package);
                    }
                    //解析电压 2(整数位)+ 2(小数位) 单位 V
                    Decimal Voltage = Decimal.Parse(data.Substring(22, 4)) * (Decimal)0.01;
                    //获取数据段,不包括间隔分钟、数据个数、电压等
                    var lists = data.Substring(26).Split(CSpecialChars.BALNK_CHAR);
                    var datas = GetData(lists, recvTime, Voltage, stationType);

                    report = new CReportStruct()
                    {
                        Stationid   = StationId,
                        Type        = type,
                        ReportType  = reportType,
                        StationType = stationType,
                        RecvTime    = recvTime,
                        Datas       = datas
                    };
                } break;

                case "21":
                {
                    if (data.Substring(8, 2) != "11")
                    {
                        //  解析报文类别
                        EMessageType reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString);
                        //  解析站点类别
                        EStationType stationType = ProtocolHelpers.ProtoStr2StationType(stationTypeString);
                        //  解析接收时间
                        DateTime recvTime = new DateTime(
                            year: Int32.Parse("20" + data.Substring(10, 2)), //年
                            month: Int32.Parse(data.Substring(12, 2)),       //月
                            day: Int32.Parse(data.Substring(14, 2)),         //日
                            hour: Int32.Parse(data.Substring(16, 2)),        //时
                            minute: Int32.Parse(data.Substring(18, 2)),      //分
                            second: 0                                        //秒
                            );

                        var lists = data.Substring(20).Split(CSpecialChars.BALNK_CHAR);
                        var datas = GetAddData(lists, recvTime, stationType);

                        report = new CReportStruct()
                        {
                            Stationid   = StationId,
                            Type        = type,
                            ReportType  = reportType,
                            StationType = stationType,
                            RecvTime    = recvTime,
                            Datas       = datas
                        };
                    }
                    else
                    {
                        //1G2111为人工水位

                        //  解析报文类别
                        EMessageType reportType = EMessageType.EMannual;
                        //  解析站点类别
                        EStationType stationType = EStationType.ERiverWater;
                        //  解析接收时间
                        DateTime recvTime = new DateTime(
                            year: DateTime.Now.Year,                    //年
                            month: DateTime.Now.Month,                  //月
                            day: DateTime.Now.Day,                      //日
                            hour: Int32.Parse(data.Substring(10, 2)),   //时
                            minute: Int32.Parse(data.Substring(12, 2)), //分
                            second: 0                                   //秒
                            );

                        var lists = data.Substring(14).Split(CSpecialChars.BALNK_CHAR);
                        var datas = GetMannualData(lists, recvTime);

                        report = new CReportStruct()
                        {
                            Stationid   = StationId,
                            Type        = type,
                            ReportType  = reportType,
                            StationType = stationType,
                            RecvTime    = recvTime,
                            Datas       = datas
                        };
                    }
                } break;

                case "23":
                {
                    //1G23为人工流量
                    //  解析报文类别
                    EMessageType reportType = EMessageType.EMannual;
                    //  解析站点类别
                    EStationType stationType = EStationType.ERiverWater;
                    //  解析接收时间
                    DateTime recvTime = new DateTime(
                        year: DateTime.Now.Year,                    //年
                        month: DateTime.Now.Month,                  //月
                        day: Int32.Parse(data.Substring(8, 2)),     //日
                        hour: Int32.Parse(data.Substring(10, 2)),   //时
                        minute: Int32.Parse(data.Substring(12, 2)), //分
                        second: 0                                   //秒
                        );

                    var lists = data.Substring(14).Split(CSpecialChars.BALNK_CHAR);
                    var datas = GetWaterData(lists, recvTime);

                    report = new CReportStruct()
                    {
                        Stationid   = StationId,
                        Type        = type,
                        ReportType  = reportType,
                        StationType = stationType,
                        RecvTime    = recvTime,
                        Datas       = datas
                    };
                } break;

                case "29":
                {
                    string doubleMsg = data.Substring(8);
                    Parse(doubleMsg, out report);
                } break;
                }
                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("数据:" + msg);
                System.Diagnostics.Debug.WriteLine("数据协议解析不完整" + exp.Message);
            }
            return(false);
        }
        private bool ParseData(string msg, string gprs, uint modemId)
        {
            //           InvokeMessage("协议。。。 ", "进入函数7");
            try
            {
                string rawData = msg;
                string sid;
                try
                {
                    sid = Manager.XmlStationData.Instance.GetStationByGprsID(gprs);
                }
                catch (Exception e)
                {
                    Debug.WriteLine("查找站点id失败,赋值为9999" + e.ToString());
                    sid = "9999";
                }
                if (msg.Contains("$"))
                {
                    string data = string.Empty;
                    if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                    {
                        return(false);
                    }
                    msg = data;

                    CReportStruct report     = new CReportStruct();
                    CDownConf     downReport = new CDownConf();
                    string        protocol   = Manager.XmlStationData.Instance.GetProtocolBySId(sid);

                    if (protocol == "YNXY")
                    {
                        Up   = new Data.YNXY.UpParser();
                        Down = new Data.YNXY.DownParser();
                    }
                    else if (protocol == "ZYJBX")
                    {
                        Up   = new Data.ZYJBX.UpParser();
                        Down = new Data.ZYJBX.DownParser();
                    }


                    #region 1K
                    //批量传输解析
                    if (msg.Contains("1K"))
                    {
                        var station = FindStationBySID(sid);
                        if (station == null)
                        {
                            throw new Exception("批量传输,站点匹配错误");
                        }
                        CBatchStruct batch = new CBatchStruct();
                        InvokeMessage(String.Format("{0,-10}   ", "批量传输") + msg, "接收");

                        if (Down.Parse_Flash(msg, EChannelType.GPRS, out batch))
                        {
                            if (this.BatchDataReceived != null)
                            {
                                this.BatchDataReceived.Invoke(null, new BatchEventArgs()
                                {
                                    Value = batch, RawData = msg
                                });
                            }
                        }
                    }
                    #endregion

                    #region 1G
                    if (msg.Contains("1G"))
                    {
                        //if (msg.Contains("RG"))
                        //{
                        //    var lists = msg.Split('$');
                        //    foreach (var segMsg in lists)
                        //    {
                        //        if (segMsg.Length < 5)
                        //        {
                        //            continue;
                        //        }
                        //        string plusMsg = "$" + segMsg;
                        //        string rtype = "人工报";
                        //        InvokeMessage("gprs号码:  " + gprs + "   " + String.Format("{0,-10}   ", rtype) + plusMsg, "接收");
                        //        string package = Up.Parse_1(plusMsg, out report);
                        //        if (package != "")
                        //        {
                        //            report.ChannelType = EChannelType.GPRS;
                        //            report.ListenPort = this.GetListenPort().ToString();
                        //            report.flagId = gprs;
                        //            SendTru(modemId, package);
                        //            //TODO 重新定义事件
                        //            if (this.UpDataReceived != null)
                        //            {
                        //                this.UpDataReceived.Invoke(null, new UpEventArgs() { Value = report, RawData = plusMsg });
                        //            }
                        //        }
                        //        else
                        //        {
                        //            InvokeMessage(" " + rawData, "接收");
                        //        }
                        //    }
                        //}
                        //else
                        if (msg.Contains("1G21") || msg.Contains("1G22") || msg.Contains("1G25"))   //   定时报,加报
                        {
                            if (msg.Contains("1G29"))
                            {
                                var station = FindStationBySID(sid);
                                if (station == null)
                                {
                                    throw new Exception("批量传输,站点匹配错误");
                                }
                                CBatchStruct batch = new CBatchStruct();
                                InvokeMessage(String.Format("{0,-10}   ", "批量传输") + msg, "接收");
                                if (Down.Parse_Batch(msg, out batch))
                                {
                                    if (this.BatchDataReceived != null)
                                    {
                                        this.BatchDataReceived.Invoke(null, new BatchEventArgs()
                                        {
                                            Value = batch, RawData = msg
                                        });
                                    }
                                }
                            }
                            else
                            {
                                var lists = msg.Split('$');
                                foreach (var segMsg in lists)
                                {
                                    if (segMsg.Length < 5)
                                    {
                                        continue;
                                    }
                                    string plusMsg = "$" + segMsg;
                                    if (Up.Parse(plusMsg, out report))
                                    {
                                        report.ChannelType = EChannelType.GPRS;
                                        report.ListenPort  = this.GetListenPort().ToString();
                                        report.flagId      = gprs;
                                        string rtype = report.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                        InvokeMessage("gprs号码:  " + gprs + "   " + String.Format("{0,-10}   ", rtype) + plusMsg, "接收");
                                        //TODO 重新定义事件
                                        if (this.UpDataReceived != null)
                                        {
                                            this.UpDataReceived.Invoke(null, new UpEventArgs()
                                            {
                                                Value = report, RawData = plusMsg
                                            });
                                        }
                                    }
                                    else
                                    {
                                        InvokeMessage(" " + rawData, "接收");
                                    }
                                }
                            }
                        }
                        else
                        {
                            Down.Parse(rawData, out downReport);
                            if (downReport != null)
                            {
                                InvokeMessage(String.Format("{0,-10}   ", "下行指令读取参数") + rawData, "接收");
                                if (this.DownDataReceived != null)
                                {
                                    this.DownDataReceived.Invoke(null, new DownEventArgs()
                                    {
                                        Value = downReport, RawData = rawData
                                    });
                                }
                            }
                        }
                        #endregion
                    }
                }
                else if (msg.Contains("BEG"))
                {
                    CSDStruct sd = new CSDStruct();
                    if (Down.Parse_SD(msg, sid, out sd))
                    {
                        InvokeMessage(String.Format("{0,-10}   ", "批量SD传输") + msg, "接收");

                        if (this.BatchSDDataReceived != null)
                        {
                            this.BatchSDDataReceived.Invoke(null, new BatchSDEventArgs()
                            {
                                Value = sd, RawData = msg
                            });
                        }
                    }
                }
                else if (msg.Contains("#"))
                {
                    CEntitySoilData soil       = new CEntitySoilData();
                    CReportStruct   soilReport = new CReportStruct();
                    if (Soil.Parse(rawData, out soil, out soilReport))
                    {
                        soil.ChannelType = EChannelType.GPRS;

                        if (null != this.SoilDataReceived)
                        {
                            this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                        }

                        if (null != soilReport && null != this.UpDataReceived)
                        {
                            soilReport.ChannelType = EChannelType.GPRS;
                            soilReport.ListenPort  = this.GetListenPort().ToString();
                            this.UpDataReceived(null, new UpEventArgs()
                            {
                                RawData = rawData, Value = soilReport
                            });
                        }
                    }
                }
                else
                {
                    return(false);
                }
                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("GPRS 数据解析出错 !" + msg + "\r\n" + exp.Message);
            }
            return(false);
        }
Exemple #19
0
        //  数据下行设置
        public String BuildSet(string sid, IList <EDownParam> cmds, CDownConf down, EChannelType ctype)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(ProtocolMaps.ChannelProtocolStartCharMap.FindValue(ctype)); //添加首字符
            sb.Append(String.Format("{0:D4}", Int32.Parse(sid.Trim())));          //添加四位站点ID号
            sb.Append("0S");                                                      //添加指令类型

            int length = 6;                                                       //  查询后指令的长度

            foreach (var cmd in cmds)
            {
                length = length + 3 + Int32.Parse(ProtocolMaps.DownParamLengthMap[cmd]);

                sb.Append(CSpecialChars.BALNK_CHAR);
                sb.Append(ProtocolMaps.DownParamMap.FindValue(cmd));
                switch (cmd)
                {
                case EDownParam.Clock: sb.Append(down.Clock.Value.ToString("yyMMddHHmmss")); break;

                case EDownParam.NormalState: sb.Append(ProtocolMaps.NormalState4ProtoMap.FindValue(down.NormalState.Value)); break;

                case EDownParam.Voltage: sb.Append(String.Format("{0:D4}", (int)down.Voltage.Value)); break;

                case EDownParam.StationCmdID: sb.Append(down.StationCmdID); break;

                case EDownParam.TimeChoice: sb.Append(ProtocolMaps.TimeChoice4ProtoMap.FindValue(down.TimeChoice.Value)); break;

                case EDownParam.TimePeriod: sb.Append(ProtocolMaps.TimePeriodMap.FindValue(down.TimePeriod.Value)); break;

                case EDownParam.WorkStatus: sb.Append(ProtocolMaps.WorkStatus4ProtoMap.FindValue(down.WorkStatus.Value)); break;

                case EDownParam.VersionNum: sb.Append(down.VersionNum); break;

                case EDownParam.StandbyChannel:
                    sb.Append(ProtocolMaps.ChannelType4ProtoMap.FindValue(down.MainChannel.Value));
                    sb.Append(ProtocolMaps.ChannelType4ProtoMap.FindValue(down.ViceChannel.Value));
                    break;

                case EDownParam.TeleNum: sb.Append(down.TeleNum); break;

                case EDownParam.RingsNum: sb.Append(String.Format("{0:D2}", (int)down.RingsNum.Value)); break;

                case EDownParam.DestPhoneNum: sb.Append(down.DestPhoneNum); break;

                case EDownParam.TerminalNum: sb.Append(down.TerminalNum); break;

                case EDownParam.GSMElec: sb.Append(ProtocolMaps.GSMElec4ProtoMap.FindValue(down.GSMElec.Value)); break;

                case EDownParam.RespBeam: sb.Append(down.RespBeam); break;

                case EDownParam.AvegTime: sb.Append(String.Format("{0:D2}", (int)down.AvegTime.Value)); break;

                case EDownParam.KC: sb.Append(down.KC); break;

                case EDownParam.RainPlusReportedValue: sb.Append(String.Format("{0:D2}", (int)down.RainPlusReportedValue.Value)); break;

                case EDownParam.Rain: sb.Append(String.Format("{0:D4}", (int)down.Rain.Value)); break;

                case EDownParam.realWater: sb.Append(String.Format("{0:D6}", (int)down.realWater.Value)); break;

                case EDownParam.WaterBase: sb.Append(String.Format("{0:D6}", (int)down.WaterBase.Value)); break;

                case EDownParam.WaterPlusReportedValue: sb.Append(String.Format("{0:D2}", (int)down.WaterPlusReportedValue.Value)); break;

                case EDownParam.SelectCollectionParagraphs: sb.Append(ProtocolMaps.SelectCollectionParagraphs4ProtoMap.FindValue(down.SelectCollectionParagraphs.Value)); break;

                case EDownParam.StationType: sb.Append(ProtocolHelpers.StationType2ProtoStr_set_proto(down.StationType.Value)); break;

                case EDownParam.SensorType: sb.Append(ProtocolMaps.SensorType4ProtoMap.FindValue(down.SensorType.Value)); break;

                case EDownParam.UserName: sb.Append(down.UserName); break;

                case EDownParam.StationName: sb.Append(down.StationName); break;

                default:
                    throw new Exception("设置下行指令参数错误");
                }
            }
            sb.Append(CSpecialChars.ENTER_CHAR);    //添加结束符

            if (ctype == EChannelType.None)
            {
                //  短信一包最大字节数为160
                return(length > 160 ? string.Empty : sb.ToString());
            }
            else if (ctype == EChannelType.BeiDou)
            {
                //  北斗卫星最大字节数为98
                return(length > 98 ? string.Empty : sb.ToString());
            }
            else if (ctype == EChannelType.GPRS || ctype == EChannelType.GSM)
            {
                return(sb.ToString());
            }
            throw new Exception("信道协议未编写!");
        }
        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);
        }
        private void Parser_3(object str)
        {
            try
            {
                string data = str as string;
                /* 删除 '\r\n' 字符串 */
                while (data.StartsWith("\r\n"))
                {
                    data = data.Substring(2);
                }

                /*
                 * 解析数据,获取CGSMStruct
                 */
                var gsm = new CGSMStruct();
                if (!GsmHelper.Parse_3(data, out gsm))
                {
                    return;
                }
                /*  如果解析成功,触发GSM数据接收完成事件  */
                //string rawdata = "";
                //string rawdata1 = gsm.Message;
                //if (!rawdata1.Contains('$'))
                //{
                //    rawdata = "$" + rawdata1;
                //}

                if (data.EndsWith("+"))
                {
                    data = data.Substring(0, data.Length - 1);
                }
                InvokeMessage(data, "接收");

                string msg = string.Empty;
                if (!ProtocolHelpers.DeleteSpecialChar(gsm.Message, out msg))
                {
                    return;
                }
                msg = gsm.Message;
                string rawdata = msg;
                if (msg.Contains('$'))
                {
                    msg = msg.Substring(1);
                }
                //if (msg.Contains('9'))
                //{
                //    msg = msg.Substring(1);
                //}


                if (!msg.ToUpper().Contains("TRU"))
                {
                    string sid  = msg.Substring(0, 4);
                    string type = msg.Substring(4, 2);

                    /*
                     *  上行指令信息,
                     *  或者读取参数返回的信息
                     */
                    #region 1G
                    if (type == "1G")
                    {
                        string reportType = msg.Substring(6, 2);
                        /*  定时报,加报 */
                        if (reportType == "21" || reportType == "22")
                        {
                            //  YAC设备的墒情协议:
                            string stationType = msg.Substring(8, 2);
                            switch (stationType)
                            {
                            //  站类为04时墒情站 05墒情雨量站 06,16墒情水位站 07,17墒情水文站
                            case "04":
                            case "05":
                            case "06":
                            case "07":
                                //case "17":
                                //    {
                                //        CEntitySoilData soil = new CEntitySoilData();
                                //        CReportStruct soilReport = new CReportStruct();
                                //        Soil = new Protocol.Data.Lib.SoilParser();
                                //        if (Soil.Parse(rawdata, out soil, out soilReport))
                                //        {
                                //            soil.ChannelType = EChannelType.GSM;

                                //            if (null != this.SoilDataReceived)
                                //                this.SoilDataReceived(null, new CEventSingleArgs<CEntitySoilData>(soil));
                                //            //1111gm
                                //            string temp = soilReport.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                //            //InvokeMessage(String.Format("{0,-10}   ", temp) + rawdata, "接收");

                                //            if (null != soilReport && null != this.UpDataReceived)
                                //           // if (null != soilReport)
                                //             {
                                //                soilReport.ChannelType = EChannelType.GSM;
                                //                soilReport.ListenPort = "COM" + this.ListenPort.PortName;
                                //                this.UpDataReceived(null, new UpEventArgs() { RawData = rawdata, Value = soilReport });
                                //            }
                                //        }
                                //        else
                                //        {
                                //            //string temp = soilReport.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                //            InvokeMessage(" " + rawdata, "接收");
                                //        }
                                //    }
                                break;

                            //  站类为01,02,03,12,13时,不是墒情站
                            case "01":
                            case "02":
                            case "03":
                            case "12":
                            case "13":
                            {
                                CReportStruct report = new CReportStruct();
                                if (Up.Parse(msg, out report))         /* 解析成功 */
                                {
                                    report.ChannelType = EChannelType.GSM;
                                    report.ListenPort  = "COM" + this.ListenPort.PortName;
                                    report.flagId      = gsm.PhoneNumber;
                                    if (this.UpDataReceived != null)
                                    {
                                        this.UpDataReceived.Invoke(null, new UpEventArgs()
                                            {
                                                Value = report, RawData = data
                                            });
                                    }
                                }
                            }
                            break;

                            default:
                                break;
                            }
                        }
                        else if (reportType == "11")    //  人工水位
                        {
                        }
                        else if (reportType == "23")    //  人工流量
                        {
                        }
                        else if (reportType == "25")
                        {
                        }
                        else /* 下行指令 */
                        {
                            CDownConf downconf = new CDownConf();
                            if (Down.Parse(msg, out downconf)) /* 解析成功 */
                            {
                                if (this.DownDataReceived != null)
                                {
                                    this.DownDataReceived.Invoke(null, new DownEventArgs()
                                    {
                                        Value = downconf, RawData = data
                                    });
                                }
                            }
                        }
                    }

                    #endregion

                    #region 1K
                    if (type == "1K") /* 批量传输 */
                    {
                        var station = FindStationBySID(sid);
                        if (station == null)
                        {
                            throw new Exception("批量传输,站点传输类型匹配错误");
                        }
                        //  EStationBatchType batchType = station.BatchTranType;

                        //if (batchType == EStationBatchType.EFlash)          /* Flash传输 */
                        //{
                        CBatchStruct batch = new CBatchStruct();
                        if (FlashBatch.Parse(gsm.Message, out batch)) /* 解析成功 */
                        {
                            if (this.BatchDataReceived != null)
                            {
                                this.BatchDataReceived.Invoke(null, new BatchEventArgs()
                                {
                                    Value = batch, RawData = data
                                });
                            }
                        }
                        //}
                        //else if (batchType == EStationBatchType.EUPan)  /* U盘传输 */
                        //{
                        //    CBatchStruct batch = new CBatchStruct();
                        //    if (UBatch.Parse(gsm.Message, out batch))   /* 解析成功 */
                        //    {
                        //        if (this.BatchDataReceived != null)
                        //            this.BatchDataReceived.Invoke(null, new BatchEventArgs() { Value = batch, RawData = data });
                        //    }
                        //}
                        else
                        {
                            throw new Exception("批量传输,站点传输类型匹配错误");
                        }
                    }
                    #endregion

                    #region 1S
                    if (type == "1S") /* 远地下行指令,设置参数 */
                    {
                        CDownConf downconf = new CDownConf();
                        if (Down.Parse(gsm.Message, out downconf))/* 解析成功 */
                        {
                            if (this.DownDataReceived != null)
                            {
                                this.DownDataReceived.Invoke(null, new DownEventArgs()
                                {
                                    Value = downconf, RawData = data
                                });
                            }
                        }
                    }
                    #endregion
                }
                else
                {
                    if (this.ErrorReceived != null)
                    {
                        this.ErrorReceived.Invoke(null, new ReceiveErrorEventArgs()
                        {
                            Msg = data
                        });
                    }
                }
            }
            catch (Exception exp)
            {
                Debug.WriteLine(exp.Message);
            }
        }
        private bool ParseData(string msg)
        {
            //           InvokeMessage("协议。。。 ", "进入函数7");
            try
            {
                string rawData = msg;

                if (msg.Contains("$"))
                {
                    string data = string.Empty;
                    if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                    {
                        return(false);
                    }
                    msg = data;

                    string sid  = msg.Substring(0, 4);
                    string type = msg.Substring(4, 2);

                    #region 1G
                    if (type == "1G")
                    {
                        //   InvokeMessage("1: " + DateTime.Now, "函数");
                        string reportType = msg.Substring(6, 2);
                        if (reportType == "21" || reportType == "22")   //   定时报,加报
                        {
                            //  YAC设备的墒情协议:
                            string stationType = msg.Substring(8, 2);
                            switch (stationType)
                            {
                            //  站类为04时墒情站 05墒情雨量站 06,16墒情水位站 07,17墒情水文站
                            case "04":
                            case "05":
                            case "06":
                            case "07":
                            case "17":
                            {
                                //CEntitySoilData soilStruct = new CEntitySoilData();
                                //if (Soil.Parse(msg, out soilStruct))
                                //{
                                //    soilStruct.ChannelType = EChannelType.GPRS;
                                //    //soilStruct.ListenPort = this.GetListenPort().ToString();

                                //    //string temp = soilStruct.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                //    //InvokeMessage(String.Format("{0,-10}   ", temp) + rawData, "接收");

                                //    //  抛出YAC设备墒情事件
                                //    if (null != this.SoilDataReceived)
                                //        this.SoilDataReceived.Invoke(null, new YACSoilEventArg()
                                //        {
                                //            RawData = rawData,
                                //            Value = soilStruct
                                //        });
                                //}

                                CEntitySoilData soil       = new CEntitySoilData();
                                CReportStruct   soilReport = new CReportStruct();
                                if (Soil.Parse(rawData, out soil, out soilReport))
                                {
                                    soil.ChannelType = EChannelType.GPRS;

                                    if (null != this.SoilDataReceived)
                                    {
                                        this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                                    }
                                    //1111gm
                                    string temp = soilReport.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                    InvokeMessage(String.Format("{0,-10}   ", temp) + rawData, "接收");

                                    if (null != soilReport && null != this.UpDataReceived)
                                    {
                                        soilReport.ChannelType = EChannelType.GPRS;
                                        soilReport.ListenPort  = this.GetListenPort().ToString();
                                        this.UpDataReceived(null, new UpEventArgs()
                                            {
                                                RawData = rawData, Value = soilReport
                                            });
                                    }
                                }
                                else
                                {
                                    //string temp = soilReport.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                    InvokeMessage(" " + rawData, "接收");
                                }
                            }
                            break;

                            //  站类为01,02,03,12,13时,不是墒情站
                            case "01":
                            case "02":
                            case "03":
                            case "12":
                            case "13":
                            {
                                CReportStruct report = new CReportStruct();
                                if (Up.Parse(msg, out report))
                                {
                                    report.ChannelType = EChannelType.GPRS;
                                    report.ListenPort  = this.GetListenPort().ToString();

                                    string temp = report.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                    InvokeMessage(String.Format("{0,-10}   ", temp) + rawData, "接收");
                                    //by LH 10.05
                                    //读取数据
                                    //ModemDataStruct dat = new ModemDataStruct();
                                    //while (this.GetNextData(out dat))
                                    //{
                                    //uint dtuID = 0;

                                    //var gprs = FindGprsByUserid(userID);
                                    //if (gprs.FindByID(userID, out dtuID))
                                    //{
                                    //    //query = gprs.Down.BuildQuery(stationID, cmds, EChannelType.GPRS);
                                    //    gprs.SendHex(dtuID, bts);
                                    //}

                                    //InvokeMessage("TRU,modemId: " + dat.m_modemId, "发送");
                                    //    InvokeMessage("bts: " + bts, "发送");
                                    //    //InvokeMessage("bts.length: " + (ushort)bts.Length, "发送");
                                    //    // 发送回执

                                    //InvokeMessage("3: " + DateTime.Now, "函数");
                                    // }
                                    //DTUdll.Instance.SendHex(m, bts, (ushort)bts.Length);

                                    //byte[] bts = new byte[] { 84, 82, 85, 13, 10 };
                                    //uint m = 1610637336;
                                    //InvokeMessage("2: " + DateTime.Now, "函数");
                                    //DTUdll.Instance.SendHex(m, bts, (ushort)bts.Length);
                                    //   report.Datas[0].Voltge = Decimal.Parse("111111") * (Decimal)0.01;
                                    //  InvokeMessage(report.Datas[0].Voltge.ToString(), "接收");
                                    if (this.UpDataReceived != null)
                                    {
                                        this.UpDataReceived.Invoke(null, new UpEventArgs()
                                            {
                                                Value = report, RawData = rawData
                                            });
                                    }
                                    //   InvokeMessage("12333", "接收");
                                }
                                else
                                {
                                    //string temp = report.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                    InvokeMessage(" " + rawData, "接收");
                                }
                            }
                            break;

                            case "11":
                            {
                                CReportStruct report = new CReportStruct();
                                //CReportArtificalWater report = new CReportArtificalWater();
                                if (Up.Parse_1(msg, out report))
                                {
                                    report.ChannelType = EChannelType.GPRS;
                                    report.ListenPort  = this.GetListenPort().ToString();
                                    report.ReportType  = EMessageType.Batch;
                                    string temptype = "人工水位";
                                    InvokeMessage(String.Format("{0,-10}   ", temptype) + rawData, "接收");
                                    //if (this.UpDataReceived != null)
                                    this.UpDataReceived.Invoke(null, new UpEventArgs()
                                        {
                                            Value = report, RawData = rawData
                                        });
                                }
                            }
                            break;

                            default:
                                break;
                            }
                        }
                        else if (reportType == "23")    //  人工流量
                        {
                            CReportStruct report = new CReportStruct();
                            if (Up.Parse_2(msg, out report))
                            {
                                report.ChannelType = EChannelType.GPRS;
                                report.ListenPort  = this.GetListenPort().ToString();
                                report.ReportType  = EMessageType.Batch;
                                string temptype = "人工流量";
                                InvokeMessage(String.Format("{0,-10}   ", temptype) + rawData, "接收");
                                this.UpDataReceived.Invoke(null, new UpEventArgs()
                                {
                                    Value = report, RawData = rawData
                                });
                            }
                        }
                        else if (reportType == "32")    //  人工报送水位
                        {
                            CReportStruct report = new CReportStruct();
                            report.ChannelType = EChannelType.GPRS;
                            report.ListenPort  = this.GetListenPort().ToString();
                            string temptype = "人工报送水位";
                            InvokeMessage(String.Format("{0,-10}   ", temptype) + rawData, "接收");
                            WriteToFileClass writeClass = new WriteToFileClass("RGwater");
                            Thread           t          = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile));
                            t.Start("GPRS: " + "长度:" + data.Length + " " + rawData + "\r\n");
                            string a1 = rawData.Substring(9, 1);
                            string a2 = rawData.Substring(10, 1);
                            if (a1 == "P" || a1 == "H" || a1 == "K" || a1 == "Z" || a1 == "D" || a1 == "T" || a1 == "M" || a1 == "G" || a1 == "Y" || a1 == "F" || a1 == "R")
                            {
                                if (a2 == "A")
                                {
                                    if (rawData.Contains("ST"))
                                    {
                                        WriteToFileClass writeClass1 = new WriteToFileClass("sharewater");
                                        Thread           t1          = new Thread(new ParameterizedThreadStart(writeClass1.WriteInfoToFile));
                                        t1.Start("GPRS: " + "长度:" + data.Length + " " + rawData + "\r\n");
                                    }
                                }
                            }
                        }
                        else if (reportType == "53")    // 人工报送时段雨量 日雨量 旬雨量 水库水位 蓄水量 入库流量 出库流量
                        {
                            CReportStruct report = new CReportStruct();
                            report.ChannelType = EChannelType.GPRS;
                            report.ListenPort  = this.GetListenPort().ToString();
                            string temptype = "人工报送雨量";
                            InvokeMessage(String.Format("{0,-10}   ", temptype) + rawData, "接收");
                            WriteToFileClass writeClass = new WriteToFileClass("RGRain");
                            Thread           t          = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile));
                            t.Start("GPRS: " + "长度:" + data.Length + " " + rawData + "\r\n");
                        }
                        else if (reportType == "25")
                        {
                            //CEntitySoilData readSoilStruct = new CEntitySoilData();
                            //if (Soil.Parse(msg, out readSoilStruct))
                            //{
                            //    readSoilStruct.ChannelType = EChannelType.GPRS;
                            //    //readSoilStruct.ListenPort = this.GetListenPort().ToString();

                            //    //string temp = readSoilStruct.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                            //    //InvokeMessage(String.Format("{0,-10}   ", temp) + rawData, "接收");
                            //    //  抛出读墒情事件
                            //    if (null != this.SoilDataReceived)
                            //        this.SoilDataReceived.Invoke(null, new YACSoilEventArg()
                            //        {
                            //            RawData = rawData,
                            //            Value = readSoilStruct
                            //        });
                            //}

                            CEntitySoilData soil       = new CEntitySoilData();
                            CReportStruct   soilReport = new CReportStruct();
                            if (Soil.Parse(rawData, out soil, out soilReport))
                            {
                                soil.ChannelType = EChannelType.GPRS;

                                if (null != this.SoilDataReceived)
                                {
                                    this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                                }

                                if (null != soilReport && null != this.UpDataReceived)
                                {
                                    soilReport.ChannelType = EChannelType.GPRS;
                                    soilReport.ListenPort  = this.GetListenPort().ToString();
                                    this.UpDataReceived(null, new UpEventArgs()
                                    {
                                        RawData = rawData, Value = soilReport
                                    });
                                }
                            }
                        }
                        else //  下行指令
                        {
                            CDownConf downconf = new CDownConf();
                            if (Down.Parse(msg, out downconf))
                            {
                                InvokeMessage(String.Format("{0,-10}   ", "下行指令读取参数") + rawData, "接收");
                                if (this.DownDataReceived != null)
                                {
                                    this.DownDataReceived.Invoke(null, new DownEventArgs()
                                    {
                                        Value = downconf, RawData = rawData
                                    });
                                }
                            }
                        }
                    }
                    #endregion

                    #region 1K
                    if (type == "1K")
                    {
                        var station = FindStationBySID(sid);
                        if (station == null)
                        {
                            throw new Exception("批量传输,站点匹配错误");
                        }
                        //EStationBatchType batchType = station.BatchTranType;

                        //if (batchType == EStationBatchType.EFlash)
                        //{
                        //    CBatchStruct batch = new CBatchStruct();
                        //    if (FlashBatch.Parse(msg, out batch))
                        //    {
                        //        InvokeMessage(String.Format("{0,-10}   ", "Flash批量传输") + rawData, "接收");

                        //        if (this.BatchDataReceived != null)
                        //            this.BatchDataReceived.Invoke(null, new BatchEventArgs() { Value = batch, RawData = rawData });
                        //    }
                        //}
                        //else if (batchType == EStationBatchType.EUPan)
                        //{
                        //    CBatchStruct batch = new CBatchStruct();
                        //    if (UBatch.Parse(msg, out batch))
                        //    {
                        //        InvokeMessage(String.Format("{0,-10}   ", "U盘批量传输") + rawData, "接收");

                        //        if (this.BatchDataReceived != null)
                        //            this.BatchDataReceived.Invoke(null, new BatchEventArgs() { Value = batch, RawData = rawData });
                        //    }
                        //}

                        CBatchStruct batch = new CBatchStruct();
                        if (FlashBatch.Parse(msg, out batch))
                        {
                            InvokeMessage(String.Format("{0,-10}   ", "批量传输") + rawData, "接收");

                            if (this.BatchDataReceived != null)
                            {
                                this.BatchDataReceived.Invoke(null, new BatchEventArgs()
                                {
                                    Value = batch, RawData = rawData
                                });
                            }
                        }
                    }
                    #endregion

                    #region 1S
                    if (type == "1S")
                    {
                        CDownConf downconf = new CDownConf();
                        if (Down.Parse(msg, out downconf))
                        {
                            InvokeMessage(String.Format("{0,-10}   ", "下行指令设置参数") + rawData, "接收");

                            if (this.DownDataReceived != null)
                            {
                                this.DownDataReceived.Invoke(null, new DownEventArgs()
                                {
                                    Value = downconf, RawData = rawData
                                });
                            }
                        }
                    }
                    #endregion
                }
                else if (msg.Contains("#"))
                {
                    CEntitySoilData soil       = new CEntitySoilData();
                    CReportStruct   soilReport = new CReportStruct();
                    if (Soil.Parse(rawData, out soil, out soilReport))
                    {
                        soil.ChannelType = EChannelType.GPRS;

                        if (null != this.SoilDataReceived)
                        {
                            this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                        }

                        if (null != soilReport && null != this.UpDataReceived)
                        {
                            soilReport.ChannelType = EChannelType.GPRS;
                            soilReport.ListenPort  = this.GetListenPort().ToString();
                            this.UpDataReceived(null, new UpEventArgs()
                            {
                                RawData = rawData, Value = soilReport
                            });
                        }
                    }
                }
                else
                {
                    return(false);
                }
                return(true);
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("GPRS 数据解析出错 !" + msg + "\r\n" + exp.Message);
            }
            return(false);
        }
Exemple #23
0
        public bool Parse_New(string msg, out List <CUpReport> upReport)
        {
            upReport = new List <CUpReport>();
            CUpReport report  = null;
            var       msgSegs = msg.Split(CSpecialChars.BALNK_CHAR);

            foreach (var msgItem in msgSegs)
            {
                try
                {
                    string data = string.Empty;
                    if (!ProtocolHelpers.DeleteSpecialChar(msgItem, out data))
                    {
                        return(false);
                    }

                    //  解析站点ID
                    String stationID = data.Substring(0, 4);
                    //  解析通信类别
                    String type = data.Substring(4, 2);
                    //  解析报文类别
                    EMessageType reportType = ProtocolMaps.MessageTypeMap.FindKey(data.Substring(6, 2));
                    //  解析站点类别
                    EStationType stationType = ProtocolHelpers.ProtoStr2StationType(data.Substring(8, 2));
                    //  解析包序号
                    string packageNum = data.Substring(10, 4);
                    // 解析接收时间
                    DateTime 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
                        );

                    //  解析数据
                    CUpData upData = new CUpData();

                    string item = data.Substring(24);

                    while (item.Length > 2)
                    {
                        try
                        {
                            //  数据分为两部分
                            //  2 Byte 指令  +  剩下的为数据,数据的长度>= 1
                            //  解析指令类型param
                            ENewParam param = NewTypeMaps.NewParamMap.FindKey(item.Substring(0, 2));
                            //  如果接收到的数据段长度大于2,表示对应的字段有值
                            //  默认为String.Empty
                            string info   = string.Empty;
                            int    length = Int32.Parse(NewTypeMaps.NewParamLengthMap.FindValue(param));
                            info = item.Substring(2, length);
                            item = item.Substring(2 + length);
                            if (String.IsNullOrEmpty(info) && ProtocolHelpers.isLegalCharacters(info))
                            {
                                continue;
                            }

                            switch (param)
                            {
                            case ENewParam.Rain:
                                upData.Rain = Decimal.Parse(info); break;

                            case ENewParam.Water1:
                                upData.Water1 = Decimal.Parse(info) * (Decimal)0.01; break;

                            case ENewParam.Water2:
                                upData.Water2 = Decimal.Parse(info) * (Decimal)0.01; break;

                            case ENewParam.Clock:
                                int year   = Int32.Parse("20" + info.Substring(0, 2));
                                int month  = Int32.Parse(info.Substring(2, 2));
                                int day    = Int32.Parse(info.Substring(4, 2));
                                int hour   = Int32.Parse(info.Substring(6, 2));
                                int minute = Int32.Parse(info.Substring(8, 2));
                                int second = Int32.Parse(info.Substring(10, 2));
                                upData.Time = new DateTime(year, month, day, hour, minute, second);
                                break;

                            case ENewParam.Voltage:
                                upData.Voltage = (Decimal.Parse(info) * (Decimal)0.01); break;

                            case ENewParam.WaterInterval:
                                int WaterInterval = Int32.Parse(info); break;

                            case ENewParam.RainInterval:
                                int RainInterval = Int32.Parse(info); break;

                            case ENewParam.ETimedNum:
                                int ETimedNum = Int32.Parse(info); break;

                            case ENewParam.ESaveNum:
                                int ESaveNum = Int32.Parse(info); break;

                            case ENewParam.WaterBase1:
                                Decimal WaterBase1 = Decimal.Parse(info) * (Decimal)0.01; break;

                            case ENewParam.WaterBase2:
                                Decimal WaterBase2 = Decimal.Parse(info) * (Decimal)0.01; break;

                            case ENewParam.MannualWater:
                                DateTime MannualWaterTime = new DateTime(
                                    year: Int32.Parse(info.Substring(0, 2)),
                                    month: Int32.Parse(info.Substring(2, 2)),
                                    day: Int32.Parse(info.Substring(4, 2)),
                                    hour: Int32.Parse(data.Substring(6, 2)),
                                    minute: Int32.Parse(data.Substring(8, 2)),
                                    second: 0
                                    );
                                Decimal MannualWater = Decimal.Parse(info.Substring(10, 6)) * (Decimal)0.01;
                                upData.WaterList.Add(MannualWaterTime, MannualWater);
                                break;

                            case ENewParam.WaterAddRange:
                                Decimal WaterAddRange = Decimal.Parse(info); break;

                            case ENewParam.RainAddRange:
                                Decimal RainAddRange = Decimal.Parse(info); break;

                            case ENewParam.DestPhoneNum1:
                                string DestPhoneNum1 = info; break;

                            case ENewParam.DestPhoneNum2:
                                string DestPhoneNum2 = info; break;

                            case ENewParam.TerminalNum:
                                string TerminalNum = info; break;

                            case ENewParam.RespWave:
                                string RespWave = info; break;

                            case ENewParam.WavePost:
                                int WavePost = Int32.Parse(info); break;

                            case ENewParam.WorkStatus:
                                EWorkStatus WorkStatus = OldTypeMaps.WorkStatus4ProtoMap.FindKey(info); break;

                            case ENewParam.StandbyChannel:
                                ChannelType MainChannel = OldTypeMaps.ChannelType4ProtoMap.FindKey(info);
                                System.Diagnostics.Debug.Assert(MainChannel != ChannelType.None, "主用信道不能为NONE");
                                ChannelType ViceChannel = OldTypeMaps.ChannelType4ProtoMap.FindKey(info.Substring(2, 2));
                                break;

                            case ENewParam.GSMSignal:
                                Decimal GSMSignal = Decimal.Parse(info); break;

                            case ENewParam.MannualFlow:
                                DateTime MannualFlowTime = new DateTime(
                                    year: Int32.Parse(info.Substring(0, 2)),
                                    month: Int32.Parse(info.Substring(2, 2)),
                                    day: Int32.Parse(info.Substring(4, 2)),
                                    hour: Int32.Parse(data.Substring(6, 2)),
                                    minute: Int32.Parse(data.Substring(8, 2)),
                                    second: 0
                                    );
                                upData.Time      = MannualFlowTime;
                                upData.WaterFlow = Decimal.Parse(info.Substring(10, 6)) * (Decimal)0.01;
                                break;

                            case ENewParam.GSMElec:
                                EGSMElec GSMElec = OldTypeMaps.GSMElec4ProtoMap.FindKey(info); break;

                            case ENewParam.WaterTemp:
                                upData.WaterTemp = Decimal.Parse(info) * (Decimal)0.1; break;

                            case ENewParam.FourWaterTemp:
                                var      waterTempList = new Dictionary <DateTime, Decimal>();
                                DateTime WaterTempTime = recvTime;
                                for (int i = 1; i <= 4; i++)
                                {
                                    Decimal WaterTemp = Decimal.Parse(info.Substring(0, 4)) * (Decimal)0.1;
                                    WaterTempTime = recvTime.AddHours(-6 * (i - 1));
                                    info          = info.Substring(4);
                                    waterTempList.Add(WaterTempTime, WaterTemp);
                                }
                                upData.TempList = waterTempList;
                                break;

                            case ENewParam.DataPackNum:
                                int DataPackNum = Int32.Parse(info); break;

                            default: break;
                            }
                        }
                        catch (Exception e)
                        {
                            System.Diagnostics.Debug.WriteLine("数据:" + msg);
                            System.Diagnostics.Debug.WriteLine("下行指令解析数据不完整!" + e.Message);
                            break;
                        }
                        //填充基本数据
                        report = new CUpReport()
                        {
                            Stationid   = stationID,
                            Type        = type,
                            ReportType  = reportType,
                            StationType = stationType,
                            RecvTime    = recvTime,
                            PackageNum  = packageNum,
                            Data        = upData
                        };
                        upReport.Add(report);
                    }
                }
                catch (Exception exp)
                {
                    System.Diagnostics.Debug.WriteLine(exp.Message);
                    continue;
                }
            }
            return(true);
        }
Exemple #24
0
        private bool ParseData(string msg, string gprs)
        {
            //           InvokeMessage("协议。。。 ", "进入函数7");
            try
            {
                string rawData = msg;

                if (msg.Contains("$"))
                {
                    string data = string.Empty;
                    if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                    {
                        return(false);
                    }
                    msg = data;

                    string sid  = msg.Substring(0, 4);
                    string type = msg.Substring(4, 2);

                    #region 1G
                    if (type == "1G")
                    {
                        string reportType = msg.Substring(6, 2);
                        if (reportType == "21" || reportType == "22")   //   定时报,加报
                        {
                            //  YAC设备的墒情协议:
                            string stationType = msg.Substring(8, 2);
                            switch (stationType)
                            {
                            //  站类为04时墒情站 05墒情雨量站 06,16墒情水位站 07,17墒情水文站
                            case "04":
                            case "05":
                            case "06":
                            case "07":
                            case "17":
                            {
                                //CEntitySoilData soilStruct = new CEntitySoilData();
                                //if (Soil.Parse(msg, out soilStruct))
                                //{
                                //    soilStruct.ChannelType = EChannelType.GPRS;
                                //    //soilStruct.ListenPort = this.GetListenPort().ToString();

                                //    //string temp = soilStruct.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                //    //InvokeMessage(String.Format("{0,-10}   ", temp) + rawData, "接收");

                                //    //  抛出YAC设备墒情事件
                                //    if (null != this.SoilDataReceived)
                                //        this.SoilDataReceived.Invoke(null, new YACSoilEventArg()
                                //        {
                                //            RawData = rawData,
                                //            Value = soilStruct
                                //        });
                                //}

                                CEntitySoilData soil       = new CEntitySoilData();
                                CReportStruct   soilReport = new CReportStruct();
                                if (Soil.Parse(rawData, out soil, out soilReport))
                                {
                                    soil.ChannelType = EChannelType.GPRS;

                                    if (null != this.SoilDataReceived)
                                    {
                                        this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                                    }
                                    //1111gm
                                    string temp = soilReport.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                    InvokeMessage("  gprs号码:  " + gprs + String.Format("  {0,-10}   ", temp) + rawData, "接收");

                                    if (null != soilReport && null != this.UpDataReceived)
                                    {
                                        soilReport.ChannelType = EChannelType.GPRS;
                                        soilReport.ListenPort  = this.GetListenPort().ToString();
                                        soilReport.flagId      = gprs;
                                        this.UpDataReceived(null, new UpEventArgs()
                                            {
                                                RawData = rawData, Value = soilReport
                                            });
                                    }
                                }
                                else
                                {
                                    //string temp = soilReport.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                    InvokeMessage("  gprs号码:  " + gprs + "  " + rawData, "接收");
                                }
                            }
                            break;

                            //  站类为01,02,03,12,13时,不是墒情站
                            case "01":
                            case "02":
                            case "03":
                            case "12":
                            case "13":
                            {
                                CReportStruct report = new CReportStruct();
                                if (Up.Parse(msg, out report))
                                {
                                    report.ChannelType = EChannelType.GPRS;
                                    report.ListenPort  = this.GetListenPort().ToString();
                                    report.flagId      = gprs;

                                    string temp = report.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                    InvokeMessage("  gprs号码:  " + gprs + String.Format("  {0,-10}   ", temp) + rawData, "接收");

                                    if (this.UpDataReceived != null)
                                    {
                                        this.UpDataReceived.Invoke(null, new UpEventArgs()
                                            {
                                                Value = report, RawData = rawData
                                            });
                                    }
                                    //   InvokeMessage("12333", "接收");
                                }
                                else
                                {
                                    //string temp = report.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                                    InvokeMessage("  gprs号码:  " + gprs + "  可疑数据 " + rawData, "接收");
                                }
                            }
                            break;

                            case "11":
                            {
                                CReportStruct report = new CReportStruct();
                                //CReportArtificalWater report = new CReportArtificalWater();
                                if (Up.Parse_1(msg, out report))
                                {
                                    report.ChannelType = EChannelType.GPRS;
                                    report.ListenPort  = this.GetListenPort().ToString();
                                    report.ReportType  = EMessageType.Batch;
                                    string temptype = "人工水位";
                                    InvokeMessage(String.Format("{0,-10}   ", temptype) + rawData, "接收");
                                    //if (this.UpDataReceived != null)
                                    this.UpDataReceived.Invoke(null, new UpEventArgs()
                                        {
                                            Value = report, RawData = rawData
                                        });
                                }
                            }
                            break;

                            default:
                                break;
                            }
                        }
                        else if (reportType == "23")    //  人工流量
                        {
                            CReportStruct report = new CReportStruct();
                            if (Up.Parse_2(msg, out report))
                            {
                                report.ChannelType = EChannelType.GPRS;
                                report.ListenPort  = this.GetListenPort().ToString();
                                report.ReportType  = EMessageType.Batch;
                                string temptype = "人工流量";
                                InvokeMessage(String.Format("{0,-10}   ", temptype) + rawData, "接收");
                                this.UpDataReceived.Invoke(null, new UpEventArgs()
                                {
                                    Value = report, RawData = rawData
                                });
                            }
                        }
                        else if (reportType == "32")    //  人工报送水位
                        {
                            CReportStruct report = new CReportStruct();
                            report.ChannelType = EChannelType.GPRS;
                            report.ListenPort  = this.GetListenPort().ToString();
                            string temptype = "人工报送水位";
                            InvokeMessage(String.Format("{0,-10}   ", temptype) + rawData, "接收");
                            WriteToFileClass writeClass = new WriteToFileClass("RGwater");
                            //Thread t = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile));
                            //t.Start("GPRS: " + "长度:" + data.Length + " " + rawData + "\r\n");
                            string a1 = rawData.Substring(9, 1);
                            string a2 = rawData.Substring(10, 1);
                            if (a1 == "P" || a1 == "H" || a1 == "K" || a1 == "Z" || a1 == "D" || a1 == "T" || a1 == "M" || a1 == "G" || a1 == "Y" || a1 == "F" || a1 == "R")
                            {
                                if (a2 == "A")
                                {
                                    if (rawData.Contains("ST"))
                                    {
                                        WriteToFileClass writeClass1 = new WriteToFileClass("sharewater");
                                        Thread           t1          = new Thread(new ParameterizedThreadStart(writeClass1.WriteInfoToFile));
                                        t1.Start("GPRS: " + "长度:" + data.Length + " " + rawData + "\r\n");
                                    }
                                }
                            }
                        }
                        else if (reportType == "53")    // 人工报送时段雨量 日雨量 旬雨量 水库水位 蓄水量 入库流量 出库流量
                        {
                            CReportStruct report = new CReportStruct();
                            report.ChannelType = EChannelType.GPRS;
                            report.ListenPort  = this.GetListenPort().ToString();
                            string temptype = "人工报送雨量";
                            InvokeMessage(String.Format("{0,-10}   ", temptype) + rawData, "接收");
                            WriteToFileClass writeClass = new WriteToFileClass("RGRain");
                            Thread           t          = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile));
                            t.Start("GPRS: " + "长度:" + data.Length + " " + rawData + "\r\n");
                        }
                        else if (reportType == "25")
                        {
                            //CEntitySoilData readSoilStruct = new CEntitySoilData();
                            //if (Soil.Parse(msg, out readSoilStruct))
                            //{
                            //    readSoilStruct.ChannelType = EChannelType.GPRS;
                            //    //readSoilStruct.ListenPort = this.GetListenPort().ToString();

                            //    //string temp = readSoilStruct.ReportType == EMessageType.EAdditional ? "加报" : "定时报";
                            //    //InvokeMessage(String.Format("{0,-10}   ", temp) + rawData, "接收");
                            //    //  抛出读墒情事件
                            //    if (null != this.SoilDataReceived)
                            //        this.SoilDataReceived.Invoke(null, new YACSoilEventArg()
                            //        {
                            //            RawData = rawData,
                            //            Value = readSoilStruct
                            //        });
                            //}

                            CEntitySoilData soil       = new CEntitySoilData();
                            CReportStruct   soilReport = new CReportStruct();
                            if (Soil.Parse(rawData, out soil, out soilReport))
                            {
                                soil.ChannelType = EChannelType.GPRS;

                                if (null != this.SoilDataReceived)
                                {
                                    this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                                }

                                if (null != soilReport && null != this.UpDataReceived)
                                {
                                    soilReport.ChannelType = EChannelType.GPRS;
                                    soilReport.ListenPort  = this.GetListenPort().ToString();
                                    soilReport.flagId      = gprs;
                                    this.UpDataReceived(null, new UpEventArgs()
                                    {
                                        RawData = rawData, Value = soilReport
                                    });
                                }
                            }
                        }
                        else //  下行指令
                        {
                            CDownConf downconf = new CDownConf();
                            if (Down.Parse(msg, out downconf))
                            {
                                InvokeMessage(String.Format("{0,-10}   ", "下行指令读取参数") + rawData, "接收");
                                if (this.DownDataReceived != null)
                                {
                                    this.DownDataReceived.Invoke(null, new DownEventArgs()
                                    {
                                        Value = downconf, RawData = rawData
                                    });
                                }
                            }
                        }
                    }
                    #endregion

                    #region 1K
                    if (type == "1K")
                    {
                        var station = FindStationBySID(sid);
                        if (station == null)
                        {
                            throw new Exception("批量传输,站点匹配错误");
                        }
                        //EStationBatchType batchType = station.BatchTranType;

                        //if (batchType == EStationBatchType.EFlash)
                        //{
                        //    CBatchStruct batch = new CBatchStruct();
                        //    if (FlashBatch.Parse(msg, out batch))
                        //    {
                        //        InvokeMessage(String.Format("{0,-10}   ", "Flash批量传输") + rawData, "接收");

                        //        if (this.BatchDataReceived != null)
                        //            this.BatchDataReceived.Invoke(null, new BatchEventArgs() { Value = batch, RawData = rawData });
                        //    }
                        //}
                        //else if (batchType == EStationBatchType.EUPan)
                        //{
                        //    CBatchStruct batch = new CBatchStruct();
                        //    if (UBatch.Parse(msg, out batch))
                        //    {
                        //        InvokeMessage(String.Format("{0,-10}   ", "U盘批量传输") + rawData, "接收");

                        //        if (this.BatchDataReceived != null)
                        //            this.BatchDataReceived.Invoke(null, new BatchEventArgs() { Value = batch, RawData = rawData });
                        //    }
                        //}

                        CBatchStruct batch = new CBatchStruct();
                        if (FlashBatch.Parse(msg, out batch))
                        {
                            InvokeMessage(String.Format("{0,-10}   ", "批量传输") + rawData, "接收");

                            if (this.BatchDataReceived != null)
                            {
                                this.BatchDataReceived.Invoke(null, new BatchEventArgs()
                                {
                                    Value = batch, RawData = rawData
                                });
                            }
                        }
                    }
                    #endregion

                    #region 1S
                    if (type == "1S")
                    {
                        CDownConf downconf = new CDownConf();
                        if (Down.Parse(msg, out downconf))
                        {
                            InvokeMessage(String.Format("{0,-10}   ", "下行指令设置参数") + rawData, "接收");

                            if (this.DownDataReceived != null)
                            {
                                this.DownDataReceived.Invoke(null, new DownEventArgs()
                                {
                                    Value = downconf, RawData = rawData
                                });
                            }
                        }
                    }
                    #endregion
                }
                else if (msg.Contains("#"))
                {
                    CEntitySoilData soil       = new CEntitySoilData();
                    CReportStruct   soilReport = new CReportStruct();
                    if (Soil.Parse(rawData, out soil, out soilReport))
                    {
                        soil.ChannelType = EChannelType.GPRS;

                        if (null != this.SoilDataReceived)
                        {
                            this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                        }

                        if (null != soilReport && null != this.UpDataReceived)
                        {
                            soilReport.ChannelType = EChannelType.GPRS;
                            soilReport.ListenPort  = this.GetListenPort().ToString();
                            soilReport.flagId      = gprs;
                            this.UpDataReceived(null, new UpEventArgs()
                            {
                                RawData = rawData, Value = soilReport
                            });
                        }
                    }
                }
                else
                {
                    return(false);
                }
                return(true);
            }
            catch (Exception exp)
            {
                //System.Diagnostics.Debug.WriteLine("GPRS 数据解析出错 !" + msg + "\r\n" + exp.Message);
            }
            return(false);
        }
        //  数据下行解析
        public bool Parse(string msg, out CDownConf downConf)
        {
            downConf = new CDownConf();
            int mgb = 0;

            try
            {
                string data = string.Empty;
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }



                //  解析站点ID
                String stationID = data.Substring(0, 4);
                //  解析通信类别
                String type = data.Substring(4, 2);
                data = data.Substring(6);
                var segs = data.Split(CSpecialChars.BALNK_CHAR);
                foreach (var item in segs)
                {
                    try
                    {
                        //  数据分为两部分
                        //  2 Byte 指令  +  剩下的为数据,数据的长度>= 2
                        //  解析指令类型param
                        EDownParam param = ProtocolMaps.DownParamMap.FindKey(item.Substring(0, 2) == "13" ? "12" : item.Substring(0, 2));
                        //  如果接收到的数据段长度大于2,表示对应的字段有值
                        //  默认为String.Empty
                        string info = string.Empty;
                        if (item.Length > 2)
                        {
                            int length = Int32.Parse(ProtocolMaps.DownParamLengthMap.FindValue(param));
                            //  如果接收到的数据段的长度不等于规定长度,或者规定长度为-1(即长度不定)
                            //        截取剩下的所有字符串
                            //  否则,截取规定长度的字符串
                            info = (item.Length - 2 != length || length == -1) ? item.Substring(2) : item.Substring(2, length);
                        }
                        if (String.IsNullOrEmpty(info))
                        {
                            continue;
                        }

                        switch (param)
                        {
                        case EDownParam.Clock:
                            int year   = Int32.Parse("20" + info.Substring(0, 2));
                            int month  = Int32.Parse(info.Substring(2, 2));
                            int day    = Int32.Parse(info.Substring(4, 2));
                            int hour   = Int32.Parse(info.Substring(6, 2));
                            int minute = Int32.Parse(info.Substring(8, 2));
                            int second = Int32.Parse(info.Substring(10, 2));
                            downConf.Clock = new DateTime(year, month, day, hour, minute, second);
                            break;

                        case EDownParam.NormalState: downConf.NormalState = ProtocolMaps.NormalState4ProtoMap.FindKey(info); break;

                        case EDownParam.Voltage: downConf.Voltage = (Decimal.Parse(info) * (Decimal)0.01); break;

                        case EDownParam.StationCmdID: downConf.StationCmdID = info; break;

                        case EDownParam.TimeChoice: downConf.TimeChoice = ProtocolMaps.TimeChoice4ProtoMap.FindKey(info == "01" ? info : "02"); break;

                        case EDownParam.TimePeriod: downConf.TimePeriod = ProtocolMaps.TimePeriodMap.FindKey(info); break;

                        case EDownParam.WorkStatus: downConf.WorkStatus = ProtocolMaps.WorkStatus4ProtoMap.FindKey(info); break;

                        case EDownParam.VersionNum: downConf.VersionNum = info; break;

                        case EDownParam.StandbyChannel:
                            downConf.MainChannel = ProtocolMaps.ChannelType4ProtoMap.FindKey(info.Substring(0, 2));
                            System.Diagnostics.Debug.Assert(downConf.MainChannel != EChannelType.None, "主用信道不能为NONE");
                            downConf.ViceChannel = ProtocolMaps.ChannelType4ProtoMap.FindKey(info.Substring(2, 2));
                            break;

                        case EDownParam.TeleNum: downConf.TeleNum = info; break;

                        case EDownParam.RingsNum: downConf.RingsNum = Decimal.Parse(info); break;

                        case EDownParam.DestPhoneNum: downConf.DestPhoneNum = info; break;

                        case EDownParam.TerminalNum: downConf.TerminalNum = info; break;

                        case EDownParam.GSMElec: downConf.GSMElec = ProtocolMaps.GSMElec4ProtoMap.FindKey(info); break;

                        case EDownParam.RespBeam: downConf.RespBeam = info; break;

                        case EDownParam.AvegTime: downConf.AvegTime = Decimal.Parse(info); break;

                        case EDownParam.RainPlusReportedValue: downConf.RainPlusReportedValue = Decimal.Parse(info); break;

                        case EDownParam.KC: downConf.KC = info; break;

                        case EDownParam.Rain: downConf.Rain = Decimal.Parse(info); break;

                        //  单位为米    case EDownParam.Water: downConf.Water = (Decimal.Parse(info) * (Decimal)0.01); break;
                        //  默认单位为厘米
                        case EDownParam.storeWater: downConf.storeWater = Decimal.Parse(info); break;

                        case EDownParam.realWater: downConf.realWater = Decimal.Parse(info); break;

                        case EDownParam.WaterBase: downConf.WaterBase = Decimal.Parse(info); break;

                        case EDownParam.WaterPlusReportedValue: downConf.WaterPlusReportedValue = Decimal.Parse(info); break;

                        case EDownParam.SelectCollectionParagraphs: downConf.SelectCollectionParagraphs = ProtocolMaps.SelectCollectionParagraphs4ProtoMap.FindKey(info); break;

                        case EDownParam.StationType:
                            var stype = ProtocolMaps.StationType4ProtoMap.FindKey(info);
                            downConf.StationType = stype; break;

                        case EDownParam.UserName:
                            downConf.UserName = info;
                            break;

                        case EDownParam.StationName:
                            downConf.StationName = info;
                            break;

                        case EDownParam.SensorType:
                            downConf.SensorType = ProtocolMaps.SensorType4ProtoMap.FindKey(info);
                            break;

                        case EDownParam.FlashClear:
                            downConf.FlashClear = info;
                            break;

                        default:
                            mgb--;
                            break;
                        }
                        mgb++;
                    }
                    catch (Exception e)
                    {
                        System.Diagnostics.Debug.WriteLine("数据:" + msg);
                        System.Diagnostics.Debug.WriteLine("下行指令解析数据不完整!" + e.Message);
                    }
                }
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine(exp.Message);
            }
            if (mgb == 0)
            {
                downConf = null;
                return(false);
            }
            return(true);
        }
        // 处理通信输出 COUT类型数据
        public void DealCOUT(string msg)
        {
            InvokeMessage("通信输出  " + msg, "接收");
            string str = msg.Trim();

            if (str.Contains("COUT"))
            {
                if (str.Contains("COUT"))
                {
                    num = num + 1;
                    FileStream   fs = new FileStream("numbd.txt", FileMode.Create);
                    StreamWriter sw = new StreamWriter(fs);
                    //开始写入
                    sw.Write(num);
                    //清空缓冲区
                    sw.Flush();
                    //关闭流
                    sw.Close();
                    fs.Close();
                }
            }

            var cout = Beidou500Helper.GetCOUTInfo(msg);

            //InvokeMessage("gm1  " + "通过截取", "接收");
            if (cout == null)
            {
                //InvokeMessage("gm2  " + "通过截取", "接收");
                return;
            }

            //TODO
            //需要处理dealbcd码的走这里
            //  解析通信输出中的内容
            string           content = cout.MsgContent;
            UpParser         up      = new UpParser();
            List <CUpReport> reports = new List <CUpReport>();

            //TODO
            //添加调用代码

            try
            {
                string           rawMsg     = content;
                string           sid        = null;
                string           dealMsg    = ProtocolHelpers.dealBCD(rawMsg);
                WriteToFileClass writeClass = new WriteToFileClass("ReceivedLog");
                Thread           t          = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile));
                t.Start("COUT Message: " + " " + dealMsg + "\r\n");
                //InvokeMessage("gm3  " + content, "接收");
                //sid需要根据北斗卫星号获取
                try
                {
                    string bdid = cout.SenderAddr;
                    sid = Manager.XmlStationDataSerializer.Instance.GetStationByBDID(bdid);
                }
                catch (Exception e)
                {
                    sid = "5712";
                    Debug.WriteLine("获取站号失败" + e.Message);
                }
                EMessageType type       = ProtocolMaps.MessageTypeMap.FindKey(dealMsg.Substring(0, 2));
                string       reportType = dealMsg.Substring(0, 2);
                //InvokeMessage("gm4  " + reportType, "接收");
                if (reportType == "21" || reportType == "22")   //   定时报,加报
                {
                    //  YAC设备的墒情协议:
                    string stationType = dealMsg.Substring(2, 2);
                    //InvokeMessage("gm5  " + stationType, "接收");
                    switch (stationType)
                    {
                    //  站类为04时墒情站 05墒情雨量站 06,16墒情水位站 07,17墒情水文站
                    case "04":
                    case "05":
                    case "06":
                    case "07":
                    case "17":
                    {
                        //var station = FindStationByBeidouID(cout.SenderAddr);
                        //string currentMsg = rawMsg.Insert(0, "$" + station.StationID + "1G");
                        //CEntitySoilData soil = new CEntitySoilData();
                        //CReportStruct soilReport = new CReportStruct();
                        //if (Soil.Parse(currentMsg, out soil, out soilReport))
                        //{
                        //    soil.ChannelType = EChannelType.BeiDou;

                        //    if (null != this.SoilDataReceived)
                        //        this.SoilDataReceived(null, new CEventSingleArgs<CEntitySoilData>(soil));

                        //    if (null != soilReport && null != this.UpDataReceived)
                        //    {
                        //        soilReport.ChannelType = EChannelType.BeiDou;
                        //        soilReport.ListenPort = "COM" + this.Port.PortName;
                        //        this.UpDataReceived(null, new UpEventArgs() { RawData = rawMsg, Value = soilReport });
                        //    }
                        //}
                        // string newMsg = rawMsg.Substring(1, rawMsg.Length - 1);
                        CEntitySoilData soil       = new CEntitySoilData();
                        CReportStruct   soilReport = new CReportStruct();
                        if (Soil.Parse(rawMsg, out soil, out soilReport))
                        {
                            soilReport.ChannelType = EChannelType.BeiDou;
                            if (null != this.SoilDataReceived)
                            {
                                this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                            }

                            if (null != soilReport && null != this.UpDataReceived)
                            {
                                soilReport.ChannelType = EChannelType.GPRS;
                                soilReport.ListenPort  = "COM" + this.Port.PortName;
                                this.UpDataReceived(null, new UpEventArgs()
                                    {
                                        RawData = rawMsg, Value = soilReport
                                    });
                            }
                        }
                    }
                    break;

                    //  站类为01,02,03,12,13时,不是墒情站
                    case "01":
                    case "02":
                    case "03":
                    case "12":
                    case "13":
                    {
                        //var station = FindStationByBeidouID(cout.SenderAddr);
                        //rawMsg = rawMsg.Insert(0, station.StationID + "  ");

                        //CReportStruct report = new CReportStruct();
                        //if (Up.Parse(rawMsg, out report))
                        //{
                        //    report.ChannelType = EChannelType.BeiDou;
                        //    report.ListenPort = "COM" + this.Port.PortName;
                        //    if (this.UpDataReceived != null)
                        //        this.UpDataReceived.Invoke(null, new UpEventArgs() { Value = report, RawData = msg });
                        //}
                        //string newMsg = rawMsg.Substring(1, rawMsg.Length - 1);
                        CReportStruct report = new CReportStruct();
                        UpParser      Up1    = new UpParser();
                        if (Up1.Parse_beidou(sid, type, rawMsg, out report))
                        {
                            //InvokeMessage("gm6  " + rawMsg, "接收");
                            //$60131G2201161111040003046112271367
                            report.ChannelType = EChannelType.BeiDou;
                            report.ListenPort  = "COM" + this.Port.PortName;
                            if (this.UpDataReceived != null)
                            {
                                //InvokeMessage("gm7  " + rawMsg, "接收");
                                this.UpDataReceived.Invoke(null, new UpEventArgs()
                                    {
                                        Value = report, RawData = rawMsg
                                    });
                            }
                        }
                    }
                    break;

                    default:
                        break;
                    }
                }
                else if (reportType == "11")    //  人工水位
                {
                }
                else if (reportType == "23")    //  人工流量
                {
                }
                else if (reportType == "25")
                {
                    var    station    = FindStationByBeidouID(cout.SenderAddr);
                    string currentMsg = rawMsg.Insert(0, "$" + station.StationID + "1G");

                    CEntitySoilData soil       = new CEntitySoilData();
                    CReportStruct   soilReport = new CReportStruct();
                    if (Soil.Parse(currentMsg, out soil, out soilReport))
                    {
                        soil.ChannelType = EChannelType.BeiDou;

                        if (null != this.SoilDataReceived)
                        {
                            this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil));
                        }

                        if (null != soilReport && null != this.UpDataReceived)
                        {
                            soilReport.ChannelType = EChannelType.BeiDou;
                            soilReport.ListenPort  = "COM" + this.Port.PortName;
                            this.UpDataReceived(null, new UpEventArgs()
                            {
                                RawData = rawMsg, Value = soilReport
                            });
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine("北斗卫星指挥机 数据解析出错 !" + content + "\r\n" + exp.Message);
            }
        }