/// <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); }
// 批量数据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); }
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); }
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); }
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); }
// 批量数据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); } }
//批量传输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); }
/// <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); }
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); }
// 批量数据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; }
/// <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); }
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); }
// 数据下行设置 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); }
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); }
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); } }