private List <CReportData> GetWaterData(IList <string> dataSegs, DateTime recvTime) { var result = new List <CReportData>(); foreach (var item in dataSegs) { CReportData data = new CReportData(); // 解析时间 data.Time = recvTime; // 解析电压 无电压设置为0 data.Voltge = 0; //解析数据 // 水位 // 解析水位 4(整数位) + 2(小数位) 单位m Decimal water = Decimal.Parse(item.Substring(0, 6)) * (Decimal)0.01; data.Water = water; // 水势 暂时用不上 Decimal waterPot = Decimal.Parse(item.Substring(6, 1)); // 精度 Int32 accuracy = Int32.Parse(item.Substring(7, 1)); // 有效数 Decimal EffectiveNum = Decimal.Parse(item.Substring(8, 3)); // 流量 暂时不传 Decimal waterflow = EffectiveNum * (10 ^ (accuracy - 3)); // 测流方法 String MeasureType = item.Substring(11, 1); result.Add(data); } return(result); }
//解析数据段 private bool GetData(string data, DateTime recvTime, decimal voltage, EStationType stationType, out CReportData report) { report = new CReportData(); try {// 解析时间 report.Time = recvTime; // 解析电压 2(整数位) + 2(小数位) 单位V report.Voltge = voltage; // 此处根据站点类型类判断是否需要解析相应的数据,避免因为非必要字段导致的异常信息 // 解析水位 4(整数位) + 2(小数位) 单位m // 解析雨量 单位mm,未乘以精度 // 初始化雨量,水位,电压值 // 雨量 包含雨量Rain // 水文 包含雨量Rain,水位Water // 水位 包含水位Water switch (stationType) { case EStationType.ERainFall: { // 雨量 // 解析雨量 单位mm,未乘以精度 Decimal rain = Decimal.Parse(data.Substring(6, 4)); report.Rain = rain; } break; case EStationType.EHydrology: { // 水文 // 解析雨量 单位mm,未乘以精度 Decimal rain = Decimal.Parse(data.Substring(6, 4)); // 解析水位 4(整数位) + 2(小数位) 单位m Decimal water = Decimal.Parse(data.Substring(0, 6)) * (Decimal)0.01; report.Rain = rain; report.Water = water; } break; case EStationType.ERiverWater: { // 水位 // 解析水位 4(整数位) + 2(小数位) 单位m Decimal water = Decimal.Parse(data.Substring(0, 6)) * (Decimal)0.01; report.Water = water; break; } default: break; } return(true); } catch (Exception exp) { System.Diagnostics.Debug.WriteLine(exp.Message); } return(false); }
/// <summary> /// 解析站点数据内容 /// 示例数据:090227080012345600011260 /// 0902270800 10位数据时报 /// 123456 6位水位 /// 0001 4位雨量 /// 1260 4位电压 /// </summary> /// <param name="data">数据</param> /// <param name="stype">站类</param> /// <returns></returns> public static CReportData GetData(string data, string stype) { try { // 判断数据段长度是否为24 Debug.Assert(data.Length == 24, "数据时报+水位+雨量+电压 的总长度为14"); Debug.WriteLine(data); var result = new CReportData() { Time = new DateTime( year: Int32.Parse("20" + data.Substring(0, 2)), // 年 month: Int32.Parse(data.Substring(2, 2)), // 月 day: Int32.Parse(data.Substring(4, 2)), // 日 hour: Int32.Parse(data.Substring(6, 2)), // 时 minute: Int32.Parse(data.Substring(8, 2)), // 分 second: 0), // 秒 Voltge = Int32.Parse(data.Substring(20, 4)) // 电压 }; int water = Int32.Parse(data.Substring(10, 6)); // 水位 int rain = Int32.Parse(data.Substring(16, 4)); // 雨量 // 雨量 站类为01 包含雨量Rain // 水文 站类为12,13 包含雨量Rain,水位Water // 水位 站类为02,03 包含水位Water switch (stype) { case "01": // 雨量 result.Rain = rain; break; case "12": // 并行水文 case "13": // 串行水文 result.Rain = rain; result.Water = water; break; case "02": // 并行水位 case "03": // 串行水位 result.Water = water; break; } return(result); } catch (Exception exp) { throw exp; } }
/// <summary> /// 解析站点数据内容 /// 示例数据:090227080012345600011260 /// 0902270800 10位数据时报 /// 123456 6位水位 /// 0001 4位雨量 /// 1260 4位电压 /// </summary> /// <param name="data">数据</param> /// <param name="stationType">站类</param> /// <param name="report"></param> /// <returns></returns> private bool GetData(string data, EStationType stationType, out CReportData report) { report = new CReportData(); try { // 解析时间 report.Time = new DateTime ( year: Int32.Parse("20" + data.Substring(0, 2)), // 年 month: Int32.Parse(data.Substring(2, 2)), // 月 day: Int32.Parse(data.Substring(4, 2)), // 日 hour: Int32.Parse(data.Substring(6, 2)), // 时 minute: Int32.Parse(data.Substring(8, 2)), // 分 second: 0 // 秒 ); // 解析电压 2(整数位) + 2(小数位) 单位V Decimal Voltge = Decimal.Parse(data.Substring(20, 4)) * (Decimal)0.01; // 解析水位 4(整数位) + 2(小数位) 单位m Decimal water = Decimal.Parse(data.Substring(10, 6)) * (Decimal)0.01; // 解析雨量 单位mm,未乘以精度 Decimal rain = Decimal.Parse(data.Substring(16, 4)); // 初始化雨量,水位,电压值 // 雨量 包含雨量Rain // 水文 包含雨量Rain,水位Water // 水位 包含水位Water switch (stationType) { case EStationType.ERainFall: // 雨量 report.Rain = rain; break; case EStationType.EHydrology: // 水文 report.Rain = rain; report.Water = water; break; case EStationType.ERiverWater: // 水位 report.Water = water; break; default: break; } report.Voltge = Voltge; return(true); } catch (Exception exp) { System.Diagnostics.Debug.WriteLine(exp.Message); } return(false); }
/// <summary> /// 读取加报报文的数据内容,加报报类:21 /// 加报仅有1条数据 /// </summary> /// <param name="dataSegs"></param> /// <param name="recvTime"></param> /// <param name="stationType"></param> /// <returns></returns> private List <CReportData> GetAddData(IList <string> dataSegs, DateTime recvTime, EStationType stationType) { var result = new List <CReportData>(); foreach (var item in dataSegs) { CReportData data = new CReportData(); // 解析时间 data.Time = recvTime; // 根据站点类型解析数据 switch (stationType) { case EStationType.ERainFall: { // 雨量 // 解析雨量 单位mm,未乘以精度 Decimal rain = Decimal.Parse(item.Substring(6, 4)); data.Rain = rain; } break; case EStationType.EHydrology: { // 水文 // 解析雨量 单位mm,未乘以精度 Decimal rain = Decimal.Parse(item.Substring(6, 4)); // 解析水位 4(整数位) + 2(小数位) 单位m Decimal water = Decimal.Parse(item.Substring(0, 6)) * (Decimal)0.01; data.Rain = rain; data.Water = water; } break; case EStationType.ERiverWater: { // 水位 // 解析水位 4(整数位) + 2(小数位) 单位m Decimal water = Decimal.Parse(item.Substring(0, 6)) * (Decimal)0.01; data.Water = water; break; } default: break; } //解析电压 2(整数位)+ 2(小数位) 单位 V Decimal voltage = Decimal.Parse(item.Substring(10, 4)) * (Decimal)0.01; data.Voltge = voltage; result.Add(data); } return(result); }
private List <CReportData> GetData(IList <string> dataSegs, EStationType stationType) { var result = new List <CReportData>(); foreach (var item in dataSegs) { CReportData data = new CReportData(); if (GetData(item, stationType, out data)) { result.Add(data); } } return(result); }
/// <summary> /// 针对后面的连续数据项,逐个数据项进行填充,最后将数据结果作为list返回。 /// </summary> /// <param name="list">原数据字符串</param> /// <param name="recvtime">接收数据时间,作为数据项的起始时间逐个往前推算。</param> /// <param name="voltage">电压值,每个数据项都要填充上电压信息</param> /// <param name="stationType">站点类型,作为读取数据部分的依据:需要读取雨量还是水位信息。</param> /// <returns>列表形式的数据集</returns> private List <CReportData> GetData(string list, DateTime recvtime, Decimal voltage, EStationType stationType) { var result = new List <CReportData>(); string tmp; for (int i = 0; i < 12; i++) { CReportData data = new CReportData(); tmp = list.Substring(i * 10, 10); if (FillData(tmp, recvtime, voltage, stationType, out data)) { result.Add(data); } recvtime = recvtime.AddMinutes(-5); } return(result); }
/// <summary> /// 单个数据项读取函数 /// </summary> /// <param name="data">原始数据信息</param> /// <param name="recvtime">接收时间</param> /// <param name="voltage">电压信息</param> /// <param name="stationType">站点类型,作为读取数据的依据</param> /// <param name="report">作为返回的结果</param> /// <returns>填充成功与否</returns> private bool FillData(string data, DateTime recvtime, Decimal voltage, EStationType stationType, out CReportData report) { report = new CReportData(); try { //时间 report.Time = recvtime; //电压 report.Voltge = voltage; //根据站类读取相应的数据 switch (stationType) { //水位站只要读水位信息 case EStationType.ERiverWater: report.Water = Decimal.Parse(data.Substring(0, 6)) * (Decimal)0.01; break; //雨量站只要读雨量信息 case EStationType.ERainFall: report.Rain = Decimal.Parse(data.Substring(6, 4)); break; //水文站要读水位信息和雨量信息 case EStationType.EHydrology: report.Water = Decimal.Parse(data.Substring(0, 6)) * (Decimal)0.01; report.Rain = Decimal.Parse(data.Substring(6, 4)); break; default: System.Diagnostics.Debug.WriteLine("解析XYJBX信息中站点类别有误!"); break; } return(true); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); return(false); } }
/// <summary> /// 处理6个报文 /// </summary> /// <param name="list"></param> /// <param name="recvtime"></param> /// <param name="voltage"></param> /// <param name="stationType"></param> /// <returns></returns> private List <CReportData> GetData_1(string list, DateTime recvtime, decimal voltage, EStationType stationType) { var result = new List <CReportData>(); string tmp; for (int i = 0; i < 6; i++) { CReportData data = new CReportData(); if (list.Length >= (i * 10 + 10)) { tmp = list.Substring(i * 10, 10); if (FillData(tmp, recvtime, voltage, stationType, out data)) { result.Add(data); } recvtime = recvtime.AddMinutes(-5); } } // 将结果中的数据顺序逆置 result.Reverse(); return(result); }
//解析数据段 private bool GetProData(int intervalMin, string data, DateTime recvtime, decimal voltage, out CReportData report) { report = new CReportData(); try { //解析数据相关信息 //解析时间 report.Time = recvtime; //解析电压 2(整数位)+ 2(小数位) 单位 V report.Voltge = voltage; //解析水位 4(整数位)+ 2(小数位) 单位m //因为是定制水位定时报,所以只用解析水位数据 Decimal water = Decimal.Parse(data) * (Decimal)0.01; report.Water = water; return(true); } catch (Exception exp) { System.Diagnostics.Debug.WriteLine(exp.Message); } return(false); }
private List <CReportData> GetData(IList <string> lists, DateTime recvtime, decimal voltage, EStationType stationType) { var result = new List <CReportData>(); foreach (var item in lists) { string itemData = item; string itemProcess = item; for (int i = 1; i <= 12; i++) { CReportData data = new CReportData(); itemProcess = itemData.Substring(0, 10); if (GetData(itemProcess, recvtime, voltage, stationType, out data)) { result.Add(data); } recvtime = recvtime.AddMinutes(-5); itemData = itemData.Substring(10); } } return(result); }
private List <CReportData> GetProData(int intervalMin, int dataNum, IList <string> lists, DateTime recvtime, decimal voltage) { var result = new List <CReportData>(); foreach (var item in lists) { string itemData = item; string itemProcess = itemData; for (int i = 1; i <= dataNum; i++) { CReportData data = new CReportData(); itemProcess = itemData.Substring(0, 6); if (GetProData(intervalMin, itemProcess, recvtime, voltage, out data)) { result.Add(data); } recvtime = recvtime.AddMinutes(-1); itemData = itemData.Substring(6); } } return(result); }
private List <CReportData> GetMannualData(IList <string> dataSegs, DateTime recvTime) { var result = new List <CReportData>(); foreach (var item in dataSegs) { CReportData data = new CReportData(); // 解析时间 data.Time = recvTime; // 解析电压 无电压设置为0 data.Voltge = 0; //解析数据 // 水位 // 解析水位 4(整数位) + 2(小数位) 单位m Decimal water = Decimal.Parse(item.Substring(0, 6)) * (Decimal)0.01; data.Water = water; // 水势 暂时用不上 Decimal waterPot = Decimal.Parse(item.Substring(6, 2)); result.Add(data); } return(result); }
public bool Parse(string msg, out CReportStruct report) { report = new CReportStruct(); List <CReportData> dataList = new List <CReportData>(); List <CReportPwdData> dataPwdList = new List <CReportPwdData>(); List <CReportFsfx> dataFsfxList = new List <CReportFsfx>(); try { string data = string.Empty; //去除起始符'$' if (!ProtocolHelpers.DeleteSpecialCharLong(msg, out data)) { return(false); } //站号(4位) string StationId = data.Substring(0, 10).Trim(); //长度:1G string length = data.Substring(10, 4); DateTime recvTime; recvTime = new DateTime( year: Int32.Parse("20" + data.Substring(14, 2)), month: Int32.Parse(data.Substring(16, 2)), day: Int32.Parse(data.Substring(18, 2)), hour: Int32.Parse(data.Substring(20, 2)), minute: Int32.Parse(data.Substring(22, 2)), second: 0 ); //上下行标志 string type = data.Substring(24, 2); //报类(2位):22-定时报 string reportTypeString = data.Substring(26, 2); //站类 string stationTypeString = data.Substring(28, 2); //水位 string waterStr = data.Substring(30, 6); Decimal?water; if (waterStr.Contains("?")) { water = null; } else { water = Decimal.Parse(waterStr) / 100; } //雨量 string rainStr = data.Substring(36, 4); Decimal?rain; if (rainStr.Contains("?")) { rain = null; } else { rain = Decimal.Parse(rainStr) / 100; } //电压 string voltageStr = data.Substring(40, 4); Decimal?voltage; if (voltageStr.Contains("?")) { voltage = null; } else { voltage = Decimal.Parse(voltageStr) / 100; } //报类 EMessageType reportType; reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString); //站类 EStationType stationType; stationType = ProtocolMaps.StationTypeMap.FindKey(stationTypeString); report.Stationid = StationId; report.Type = type; report.ReportType = reportType; report.StationType = stationType; report.RecvTime = recvTime; string allElmtData = data.Substring(44); //1.处理风速风向数据和散射仪数据 CReportData speedData = new CReportData(); CReportPwdData pwdData = new CReportPwdData(); CReportFsfx fsfxData = new CReportFsfx(); //1.1 风速风向信息 int flagIndex = allElmtData.IndexOf("@@ EN2B"); if (flagIndex >= 0) { int keyLength = int.Parse(allElmtData.Substring(flagIndex + 8, 4)); string elmtData = allElmtData.Substring(flagIndex, keyLength); //判定要素1的开始符号和结束符号 if (elmtData.StartsWith("@@ EN2B") && elmtData.EndsWith("**")) { elmtData = elmtData.Substring(12, keyLength - 14).Trim(); //判定时差法数据的开始符号和接受符号 if (elmtData.Length == (keyLength - 14)) { CReportFsfx dataFsfx = new CReportFsfx(); try { string strtflag = elmtData.Substring(0, 1); //开始标志 string stationid = elmtData.Substring(1, 5); //站点ID string msgTime = elmtData.Substring(6, 12); //时间 string shfx = elmtData.Substring(18, 4); //瞬时风向 string shfs = elmtData.Substring(22, 4); //顺时风速 string yxszdshfx = elmtData.Substring(26, 4); //一小时最大瞬时风向 string yxszdshfs = elmtData.Substring(30, 4); //一小时最大瞬时风速 string maxTime = elmtData.Substring(34, 4); //一小时最大瞬时风速出现时间 string avg2fx = elmtData.Substring(38, 4); //2分钟平均风向 string avg2fs = elmtData.Substring(42, 4); //2分钟平均风速 string avg10fx = elmtData.Substring(46, 4); //10分钟平均风向 string avg10fs = elmtData.Substring(50, 4); //10分钟平均风速 string max10fx = elmtData.Substring(54, 4); //10分钟平均最大风向 string max10fs = elmtData.Substring(58, 4); //10分钟平均最大风速 string max10tm = elmtData.Substring(62, 4); //10分钟最大风速出现时间 fsfxData.Water = water; fsfxData.Time = recvTime; fsfxData.shfx = decimal.Parse(shfx); fsfxData.shfs = decimal.Parse(shfx) / 10; fsfxData.yxszdshfx = decimal.Parse(yxszdshfx); fsfxData.yxszdshfs = decimal.Parse(shfx) / 10; fsfxData.maxTime = new DateTime(recvTime.Year, recvTime.Month, recvTime.Day, int.Parse(maxTime.Substring(0, 2)), int.Parse(maxTime.Substring(2, 2)), 0); fsfxData.avg2fx = decimal.Parse(avg2fx); fsfxData.avg2fs = decimal.Parse(avg2fs) / 10; fsfxData.avg10fx = decimal.Parse(avg10fx); fsfxData.avg10fs = decimal.Parse(avg10fs) / 10; fsfxData.max10fx = decimal.Parse(max10fx); fsfxData.max10fs = decimal.Parse(max10fs) / 10; fsfxData.max10tm = new DateTime(recvTime.Year, recvTime.Month, recvTime.Day, int.Parse(max10tm.Substring(0, 2)), int.Parse(max10tm.Substring(2, 2)), 0); fsfxData.Voltge = voltage; dataFsfxList.Add(fsfxData); } catch (Exception e) { return(false); } } else { return(false); //11开头 99结束 } report.fsfxDatas = dataFsfxList; } else { return(false); //TODO 要素1开始符号和结束符合不匹配 } } //1.2 散射仪数据 //015057203031023033202F2F2F2F2F2F202F2F2F2F2F030D0A int flagIndex2 = allElmtData.IndexOf("@@ PWD"); if (flagIndex2 >= 0) { int keyLength = int.Parse(allElmtData.Substring(flagIndex2 + 8, 4)); string elmtData = allElmtData.Substring(flagIndex2, keyLength); if (elmtData.StartsWith("@@ PWD") && elmtData.EndsWith("**")) { elmtData = elmtData.Substring(12, keyLength - 14).Trim(); elmtData = elmtData.Substring(0, elmtData.Length - 1).Trim(); elmtData = new System.Text.RegularExpressions.Regex("[\\s]+").Replace(elmtData, " "); string[] elmtDataList = elmtData.Split(' '); pwdData.Time = recvTime; try { pwdData.Visi1min = decimal.Parse(elmtDataList[2].Trim()); } catch { pwdData.Visi1min = null; } try { pwdData.Visi10min = decimal.Parse(elmtDataList[3]); } catch { pwdData.Visi10min = null; } pwdData.Voltge = voltage; dataPwdList.Add(pwdData); } else { return(false); } report.pwdDatas = dataPwdList; //report.Datas = dataList; } } catch (Exception eee) { return(false); } return(true); }
//23001G221812291500????12980064@@Z1001234Z2001234Z3001234Z4001234Z5001234Z6001234Z7001234Z8001234\r\n public bool Parse(String msg, out List <CReportStruct> reportList) { reportList = new List <CReportStruct>(); CReportStruct report = new CReportStruct(); try { //站号(4位) string StationId = msg.Substring(0, 4); //类别(2位):1G string type = msg.Substring(4, 2); //报类(2位):22-定时报 string reportTypeString = msg.Substring(6, 2); EMessageType reportType; EStationType stationType; DateTime recvTime; Decimal Voltage = 0; Decimal rain = 0; switch (reportTypeString) { case "21": case "22": reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString); stationType = EStationType.EReservoir; recvTime = new DateTime( year: Int32.Parse("20" + msg.Substring(8, 2)), month: Int32.Parse(msg.Substring(10, 2)), day: Int32.Parse(msg.Substring(12, 2)), hour: Int32.Parse(msg.Substring(14, 2)), minute: Int32.Parse(msg.Substring(16, 2)), second: 0 ); try { rain = Decimal.Parse(msg.Substring(18, 4)); } catch (Exception e) { rain = -1; } try { Voltage = Decimal.Parse(msg.Substring(22, 4)) * (Decimal)0.01; }catch (Exception e) { Voltage = 0; } if (msg.Contains("@@")) { int flagIndex = msg.IndexOf("@@"); if (flagIndex > 0) { //水位1 int stationId1 = int.Parse(StationId); string waterStr1 = msg.Substring(flagIndex + 2, 8); if (waterStr1 != "-2000000") { Decimal water1 = decimal.Parse(waterStr1) * (Decimal)0.01; if (water1 < 0 || water1 > 655) { water1 = 0; } List <CReportData> datas = new List <CReportData>(); CReportData data = new CReportData(); data.Rain = rain; data.Voltge = Voltage; data.Water = water1; data.Time = recvTime; datas.Add(data); report = new CReportStruct() { Stationid = stationId1.ToString(), Type = type, ReportType = reportType, StationType = stationType, RecvTime = DateTime.Now, Datas = datas }; reportList.Add(report); } //水位2 int stationId2 = int.Parse(StationId) + 1; string waterStr2 = msg.Substring(flagIndex + 2 + 8 * 1, 8); if (waterStr2 != "-2000000") { Decimal water2 = decimal.Parse(waterStr2) * (Decimal)0.01; if (water2 < 0 || water2 > 655) { water2 = 0; } List <CReportData> datas = new List <CReportData>(); CReportData data = new CReportData(); data.Rain = rain; data.Voltge = Voltage; data.Water = water2; data.Time = recvTime; datas.Add(data); report = new CReportStruct() { Stationid = stationId2.ToString(), Type = type, ReportType = reportType, StationType = stationType, RecvTime = DateTime.Now, Datas = datas }; reportList.Add(report); } //水位3 int stationId3 = int.Parse(StationId) + 2; string waterStr3 = msg.Substring(flagIndex + 2 + 8 * 2, 8); if (waterStr3 != "-2000000") { Decimal water3 = decimal.Parse(waterStr3) * (Decimal)0.01; if (water3 < 0 || water3 > 655) { water3 = 0; } List <CReportData> datas = new List <CReportData>(); CReportData data = new CReportData(); data.Rain = rain; data.Voltge = Voltage; data.Water = water3; data.Time = recvTime; datas.Add(data); report = new CReportStruct() { Stationid = stationId3.ToString(), Type = type, ReportType = reportType, StationType = stationType, RecvTime = DateTime.Now, Datas = datas }; reportList.Add(report); } //水位4 int stationId4 = int.Parse(StationId) + 3; string waterStr4 = msg.Substring(flagIndex + 2 + 8 * 3, 8); if (waterStr4 != "-2000000") { Decimal water4 = decimal.Parse(waterStr4) * (Decimal)0.01; if (water4 < 0 || water4 > 655) { water4 = 0; } List <CReportData> datas = new List <CReportData>(); CReportData data = new CReportData(); data.Rain = rain; data.Voltge = Voltage; data.Water = water4; data.Time = recvTime; datas.Add(data); report = new CReportStruct() { Stationid = stationId4.ToString(), Type = type, ReportType = reportType, StationType = stationType, RecvTime = DateTime.Now, Datas = datas }; reportList.Add(report); } //水位5 int stationId5 = int.Parse(StationId) + 4; string waterStr5 = msg.Substring(flagIndex + 2 + 8 * 4, 8); if (waterStr5 != "-2000000") { Decimal water5 = decimal.Parse(waterStr5) * (Decimal)0.01; if (water5 < 0 || water5 > 655) { water5 = 0; } List <CReportData> datas = new List <CReportData>(); CReportData data = new CReportData(); data.Rain = rain; data.Voltge = Voltage; data.Water = water5; data.Time = recvTime; datas.Add(data); report = new CReportStruct() { Stationid = stationId5.ToString(), Type = type, ReportType = reportType, StationType = stationType, RecvTime = DateTime.Now, Datas = datas }; reportList.Add(report); } //水位6 int stationId6 = int.Parse(StationId) + 5; string waterStr6 = msg.Substring(flagIndex + 2 + 8 * 5, 8); if (waterStr6 != "-2000000") { Decimal water6 = decimal.Parse(waterStr6) * (Decimal)0.01; if (water6 < 0 || water6 > 655) { water6 = 0; } List <CReportData> datas = new List <CReportData>(); CReportData data = new CReportData(); data.Rain = rain; data.Voltge = Voltage; data.Water = water6; data.Time = recvTime; datas.Add(data); report = new CReportStruct() { Stationid = stationId6.ToString(), Type = type, ReportType = reportType, StationType = stationType, RecvTime = DateTime.Now, Datas = datas }; reportList.Add(report); } //水位7 int stationId7 = int.Parse(StationId) + 6; string waterStr7 = msg.Substring(flagIndex + 2 + 8 * 6, 8); if (waterStr7 != "-2000000") { Decimal water7 = decimal.Parse(waterStr7) * (Decimal)0.01; if (water7 < 0 || water7 > 655) { water7 = 0; } List <CReportData> datas = new List <CReportData>(); CReportData data = new CReportData(); data.Rain = rain; data.Voltge = Voltage; data.Water = water7; data.Time = recvTime; datas.Add(data); report = new CReportStruct() { Stationid = stationId7.ToString(), Type = type, ReportType = reportType, StationType = stationType, RecvTime = DateTime.Now, Datas = datas }; reportList.Add(report); } //水位8 int stationId8 = int.Parse(StationId) + 7; string waterStr8 = msg.Substring(flagIndex + 2 + 8 * 7, 8); if (waterStr8 != "-2000000") { Decimal water8 = decimal.Parse(waterStr8) * (Decimal)0.01; if (water8 < 0 || water8 > 655) { water8 = 0; } List <CReportData> datas = new List <CReportData>(); CReportData data = new CReportData(); data.Rain = rain; data.Voltge = Voltage; data.Water = water8; data.Time = recvTime; datas.Add(data); report = new CReportStruct() { Stationid = stationId8.ToString(), Type = type, ReportType = reportType, StationType = stationType, RecvTime = DateTime.Now, Datas = datas }; reportList.Add(report); } } } break; default: break; } } catch (Exception e) { } return(true); }
/// <summary> /// 解析站点数据内容 /// 示例数据:090227080012345600011260 /// 0902270800 10位数据时报 /// 123456 6位水位 /// 0001 4位雨量 /// 1260 4位电压 /// /// </summary> /// <param name="data">数据</param> /// <param name="stationType">站类</param> /// <param name="report"></param> /// <returns></returns> private bool GetData(string data, EStationType stationType, out CReportData report) { report = new CReportData(); try { // 解析时间 report.Time = new DateTime ( year: Int32.Parse("20" + data.Substring(0, 2)), // 年 month: Int32.Parse(data.Substring(2, 2)), // 月 day: Int32.Parse(data.Substring(4, 2)), // 日 hour: Int32.Parse(data.Substring(6, 2)), // 时 minute: Int32.Parse(data.Substring(8, 2)), // 分 second: 0 // 秒 ); Decimal Voltge, rain, water; // 解析电压 2(整数位) + 2(小数位) 单位V try { Voltge = Decimal.Parse(data.Substring(20, 4)) * (Decimal)0.01; }catch (Exception e1) { Voltge = -1; } // cln:20141110修改,此处根据站点类型类判断是否需要解析相应的数据,避免因为非必要字段导致的异常信息 // 解析水位 4(整数位) + 2(小数位) 单位m //Decimal water = Decimal.Parse(data.Substring(10, 6)) * (Decimal)0.01; // 解析雨量 单位mm,未乘以精度 //Decimal rain = Decimal.Parse(data.Substring(16, 4)); // 初始化雨量,水位,电压值 // 雨量 包含雨量Rain // 水文 包含雨量Rain,水位Water // 水位 包含水位Water switch (stationType) { case EStationType.ERainFall: { // 雨量 // 解析雨量 单位mm,未乘以精度 try { rain = Decimal.Parse(data.Substring(16, 4)); }catch (Exception e) { rain = -1; } report.Rain = rain; } break; case EStationType.EHydrology: { // 水文 // 解析雨量 单位mm,未乘以精度 try { rain = Decimal.Parse(data.Substring(16, 4)); } catch (Exception e) { rain = -1; } // 解析水位 4(整数位) + 2(小数位) 单位m try { water = Decimal.Parse(data.Substring(10, 6)) * (Decimal)0.01; }catch (Exception e) { water = -200; } report.Rain = rain; report.Water = water; } break; case EStationType.ERiverWater: { // 水位 // 解析水位 4(整数位) + 2(小数位) 单位m try { water = Decimal.Parse(data.Substring(10, 6)) * (Decimal)0.01; } catch (Exception e) { water = -200; } report.Water = water; break; } default: break; } report.Voltge = Voltge; return(true); } catch (Exception exp) { System.Diagnostics.Debug.WriteLine(exp.Message); } return(false); }
/// <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>(); try { string data = string.Empty; //去除起始符'$' if (!ProtocolHelpers.DeleteSpecialCharLong(msg, out data)) { return(false); } //站号(4位) string StationId = data.Substring(0, 10).Trim(); //长度:1G string length = data.Substring(10, 4); DateTime recvTime; recvTime = new DateTime( year: Int32.Parse("20" + data.Substring(14, 2)), month: Int32.Parse(data.Substring(16, 2)), day: Int32.Parse(data.Substring(18, 2)), hour: Int32.Parse(data.Substring(20, 2)), minute: Int32.Parse(data.Substring(22, 2)), second: 0 ); //上下行标志 string type = data.Substring(24, 2); //报类(2位):22-定时报 string reportTypeString = data.Substring(26, 2); //站类 string stationTypeString = data.Substring(28, 2); //水位 string waterStr = data.Substring(30, 6); Decimal?water; if (waterStr.Contains("?")) { water = null; } else { water = Decimal.Parse(waterStr) / 100; } //雨量 string rainStr = data.Substring(36, 4); Decimal?rain; if (rainStr.Contains("?")) { rain = null; } else { rain = Decimal.Parse(rainStr) / 100; } //电压 string voltageStr = data.Substring(40, 4); Decimal?voltage; if (voltageStr.Contains("?")) { voltage = null; } else { voltage = Decimal.Parse(voltageStr) / 100; } //报类 EMessageType reportType; reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString); //站类 EStationType stationType; stationType = ProtocolMaps.StationTypeMap.FindKey(stationTypeString); string allElmtData = data.Substring(44); //1.处理SM100H数据 CReportData speedData = new CReportData(); int flagIndex = allElmtData.IndexOf("@@SM100H"); if (flagIndex >= 0) { int keyLength = int.Parse(allElmtData.Substring(8, 4)); string elmtData = allElmtData.Substring(flagIndex, keyLength); //判定要素1的开始符号和结束符号 if (elmtData.StartsWith("@@SM100H") && elmtData.EndsWith("**")) { elmtData = elmtData.Substring(12, keyLength - 14).Trim(); //判定时差法数据的开始符号和接受符号 if (elmtData.Length == 78) { try { string waterSpeedStr = elmtData.Substring(38, 8); string waterFlowStr = elmtData.Substring(48, 8); string waterFlow2Str = elmtData.Substring(58, 8); //字符串转16进制32位无符号整数 UInt32 waterSpeedInt = Convert.ToUInt32(waterSpeedStr, 16); UInt32 waterFlowInt = Convert.ToUInt32(waterFlowStr, 16); UInt32 waterFlow2Int = Convert.ToUInt32(waterFlow2Str, 16); //IEEE754 字节转换float float waterSpeed = BitConverter.ToSingle(BitConverter.GetBytes(waterSpeedInt), 0); float waterFlow = BitConverter.ToSingle(BitConverter.GetBytes(waterFlowInt), 0); float waterFlow2 = BitConverter.ToSingle(BitConverter.GetBytes(waterFlow2Int), 0); //UInt32 x = Convert.ToUInt32(waterFlowStr, 16);//字符串转16进制32位无符号整数 //float fy = BitConverter.ToSingle(BitConverter.GetBytes(x), 0);//IEEE754 字节转换float //UInt32 x2 = Convert.ToUInt32(waterFlow2Str, 16);//字符串转16进制32位无符号整数 //float fy2 = BitConverter.ToSingle(BitConverter.GetBytes(x2), 0);//IEEE754 字节转换float speedData.v1 = (decimal?)waterSpeed; speedData.Q = (decimal?)waterFlow; speedData.Q2 = (decimal?)waterFlow2; speedData.Voltge = voltage; dataList.Add(speedData); } catch (Exception e) { return(false); } } else { return(false); //11开头 99结束 } report.Stationid = StationId; report.Type = type; report.ReportType = reportType; report.StationType = stationType; report.RecvTime = recvTime; report.Datas = dataList; } else { return(false); //TODO 要素1开始符号和结束符合不匹配 } } } catch (Exception eee) { return(false); } return(true); }
public bool Parse(string msg, out CReportStruct report) { report = new CReportStruct(); List <CReportData> dataList = new List <CReportData>(); try { string data = string.Empty; //去除起始符'$' if (!ProtocolHelpers.DeleteSpecialCharLong(msg, out data)) { return(false); } //站号(4位) string StationId = data.Substring(0, 10).Trim(); //长度:1G string length = data.Substring(10, 4); DateTime recvTime; recvTime = new DateTime( year: Int32.Parse("20" + data.Substring(14, 2)), month: Int32.Parse(data.Substring(16, 2)), day: Int32.Parse(data.Substring(18, 2)), hour: Int32.Parse(data.Substring(20, 2)), minute: Int32.Parse(data.Substring(22, 2)), second: 0 ); //上下行标志 string type = data.Substring(24, 2); //报类(2位):22-定时报 string reportTypeString = data.Substring(26, 2); //站类 string stationTypeString = data.Substring(28, 2); //水位 string waterStr = data.Substring(30, 6); Decimal?water; if (waterStr.Contains("?")) { water = null; } else { water = Decimal.Parse(waterStr) / 100; } //雨量 string rainStr = data.Substring(36, 4); Decimal?rain; if (rainStr.Contains("?")) { rain = null; } else { rain = Decimal.Parse(rainStr) / 100; } //电压 string voltageStr = data.Substring(40, 4); Decimal?voltage; if (voltageStr.Contains("?")) { voltage = null; } else { voltage = Decimal.Parse(voltageStr) / 100; } //报类 EMessageType reportType; reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString); //站类 EStationType stationType; stationType = ProtocolMaps.StationTypeMap.FindKey(stationTypeString); string allElmtData = data.Substring(44); //1.处理风速风向数据和散射仪数据 CReportData speedData = new CReportData(); //1.1 风速风向信息 int flagIndex = allElmtData.IndexOf("@@ EN2B"); if (flagIndex >= 0) { int keyLength = int.Parse(allElmtData.Substring(8, 4)); string elmtData = allElmtData.Substring(flagIndex, keyLength); //判定要素1的开始符号和结束符号 if (elmtData.StartsWith("@@ EN2B") && elmtData.EndsWith("**")) { elmtData = elmtData.Substring(12, keyLength - 14).Trim(); //判定时差法数据的开始符号和接受符号 if (elmtData.Length == (keyLength - 14)) { try { string strtflag = elmtData.Substring(0, 1); //开始标志 string stationid = elmtData.Substring(1, 5); //站点ID string msgTime = elmtData.Substring(6, 12); //时间 string shfx = elmtData.Substring(18, 4); //瞬时风向 string shfs = elmtData.Substring(22, 4); //顺时风速 string yxszdshfx = elmtData.Substring(26, 4); //一小时最大瞬时风向 string yxszdshfs = elmtData.Substring(30, 4); //一小时最大瞬时风速 string maxTime = elmtData.Substring(34, 4); //一小时最大瞬时风速出现时间 string avg2fx = elmtData.Substring(38, 4); //2分钟平均风向 string avg2fs = elmtData.Substring(42, 4); //2分钟平均风速 string avg10fx = elmtData.Substring(46, 4); //10分钟平均风向 string avg10fs = elmtData.Substring(50, 4); //10分钟平均风速 string max10fx = elmtData.Substring(54, 4); //10分钟平均最大风向 string max10fs = elmtData.Substring(58, 4); //10分钟平均最大风速 string max10tm = elmtData.Substring(62, 4); //10分钟最大风速出现时间 } catch (Exception e) { return(false); } } else { return(false); //11开头 99结束 } report.Stationid = StationId; report.Type = type; report.ReportType = reportType; report.StationType = stationType; report.RecvTime = recvTime; report.Datas = dataList; } else { return(false); //TODO 要素1开始符号和结束符合不匹配 } } //1.2 散射仪数据 int flagIndex2 = allElmtData.IndexOf("@@ PWD"); if (flagIndex >= 0) { int keyLength = int.Parse(allElmtData.Substring(8, 4)); string elmtData = allElmtData.Substring(flagIndex, keyLength); if (elmtData.StartsWith("@@ EN2B") && elmtData.EndsWith("**")) { } } } catch (Exception eee) { return(false); } return(true); }
/// <summary> /// 非卫星报文数据解析过程 /// </summary> /// <param name="msg">原始报文数据</param> /// <param name="report">报文最终解析出的结果数据结构</param> /// <returns>是否解析成功</returns> public bool Parse(String msg, out CReportStruct report) { //$ 1900020919060308101G21??????????1066@@ QTFM0164 11 0.163 1.171 2.546 0.000 0.334 0.000 0.000 -999.0 -0.2 0.0 0.0 14.7 1.5 99** report = new CReportStruct(); List <CReportData> dataList = new List <CReportData>(); try { string data = string.Empty; //去除起始符'$' if (!ProtocolHelpers.DeleteSpecialCharLong(msg, out data)) { return(false); } //站号(4位) string StationId = data.Substring(0, 10).Trim(); //类别(长度):1G string length = data.Substring(10, 4); DateTime recvTime; recvTime = new DateTime( year: Int32.Parse("20" + data.Substring(14, 2)), month: Int32.Parse(data.Substring(16, 2)), day: Int32.Parse(data.Substring(18, 2)), hour: Int32.Parse(data.Substring(20, 2)), minute: Int32.Parse(data.Substring(22, 2)), second: 0 ); //上下行标志 string type = data.Substring(24, 2); //报类(2位):22-定时报 string reportTypeString = data.Substring(26, 2); //水位 string waterStr = data.Substring(28, 6); Decimal?water; if (waterStr.Contains("?")) { water = null; } else { water = Decimal.Parse(waterStr) / 100; } //雨量 string rainStr = data.Substring(34, 4); Decimal?rain; if (rainStr.Contains("?")) { rain = null; } else { rain = Decimal.Parse(rainStr) / 100; } //电压 string voltageStr = data.Substring(38, 4); Decimal?voltage; if (voltageStr.Contains("?")) { voltage = null; } else { voltage = Decimal.Parse(voltageStr) / 100; } //报类 EMessageType reportType; reportType = ProtocolMaps.MessageTypeMap.FindKey(reportTypeString); //站类 EStationType stationType; stationType = EStationType.EO; string allElmtData = data.Substring(42); //1.处理时差法数据 CReportData speedData = new CReportData(); int flagIndex = allElmtData.IndexOf("@@ QTFM"); if (flagIndex >= 0) { int keyLength = int.Parse(allElmtData.Substring(8, 4)); string elmtData = allElmtData.Substring(flagIndex, keyLength); //判定要素1的开始符号和结束符号 if (elmtData.StartsWith("@@ QTFM") && elmtData.EndsWith("**")) { elmtData = elmtData.Substring(12, keyLength - 14).Trim(); //判定时差法数据的开始符号和接受符号 if (elmtData.StartsWith("11") && elmtData.EndsWith("99")) { try { elmtData = new System.Text.RegularExpressions.Regex("[\\s]+").Replace(elmtData, " "); string[] elmtDataList = elmtData.Split(' '); speedData.Voltge = voltage; speedData.Vm = Decimal.Parse(elmtDataList[1]); speedData.W1 = Decimal.Parse(elmtDataList[2]); speedData.Q = Decimal.Parse(elmtDataList[3]); speedData.v1 = Decimal.Parse(elmtDataList[4]); speedData.v2 = Decimal.Parse(elmtDataList[5]); speedData.v3 = Decimal.Parse(elmtDataList[6]); speedData.v4 = Decimal.Parse(elmtDataList[7]); speedData.beta1 = Decimal.Parse(elmtDataList[8]); speedData.beta2 = Decimal.Parse(elmtDataList[9]); speedData.beta3 = Decimal.Parse(elmtDataList[10]); speedData.beta4 = Decimal.Parse(elmtDataList[11]); speedData.W2 = Decimal.Parse(elmtDataList[12]); speedData.errorCode = elmtDataList[13]; dataList.Add(speedData); } catch (Exception ee) { //解析失败 return(false); } } else { return(false); //11开头 99结束 } report.Stationid = StationId; report.Type = type; report.ReportType = reportType; report.StationType = stationType; report.RecvTime = recvTime; report.Datas = dataList; } else { return(false); //TODO 要素1开始符号和结束符合不匹配 } } } catch (Exception eee) { return(false); } return(true); }
/// <summary> /// 解析上行报文数据 /// </summary> /// <param name="msg"></param> /// <param name="report"></param> /// <returns></returns> public bool Parse(string msg, out CReportStruct report) { ///$12345678+140331080400+1257+0251+0078+990+PP report = null; if (!msg.Contains("+")) { return(false); } try { string data = string.Empty; //去除$ if (!ProtocolHelpers.DeleteSpecialChar(msg, out data)) { return(false); } string[] dataList = data.Split('+'); DateTime dataTime; string evpType = string.Empty; string stationId = string.Empty; List <CReportData> datas = new List <CReportData>(); CReportData reportData = new CReportData(); if (dataList.Length != 6 && dataList.Length != 7) { return(false); } for (int i = 0; i < dataList.Length; i++) { if (i == 0) { if (dataList[i].Length == 8) { stationId = dataList[i]; continue; } else { System.Diagnostics.Debug.Write("数据:" + msg); System.Diagnostics.Debug.Write("站号格式不对"); return(false); } } if (i == 1) { if (dataList[i].Length == 14) { dataTime = new DateTime( year: Int32.Parse(dataList[i].Substring(0, 4)), month: Int32.Parse(dataList[i].Substring(4, 2)), day: Int32.Parse(dataList[i].Substring(6, 2)), hour: Int32.Parse(dataList[i].Substring(8, 2)), minute: Int32.Parse(dataList[i].Substring(10, 2)), second: Int32.Parse(dataList[i].Substring(12, 2)) ); reportData.Time = dataTime; continue; } else { System.Diagnostics.Debug.Write("数据:" + msg); System.Diagnostics.Debug.Write("时间格式不对"); return(false); } } else if (i == 2) { reportData.Voltge = Decimal.Parse(dataList[i]) * (Decimal)0.01; continue; } else if (i == 3) { reportData.Rain = Decimal.Parse(dataList[i]) * (Decimal)0.01; continue; } else if (i == 4) { reportData.Evp = Decimal.Parse(dataList[i]) * (Decimal)0.01; continue; } else if (i == 5) { reportData.Temperature = Decimal.Parse(dataList[i]) * (Decimal)0.01; continue; } else if (i == 6) { reportData.EvpType = dataList[i]; continue; } } datas.Add(reportData); report = new CReportStruct() { Stationid = stationId, Type = string.Empty, ReportType = EMessageType.Evp, StationType = EStationType.EHydrology, RecvTime = DateTime.Now, Datas = datas }; } catch (Exception e) { System.Diagnostics.Debug.Write("数据:" + msg); System.Diagnostics.Debug.Write("格式不对"); return(false); } return(true); }
public bool DealData(string msg, string reportType, out CReportStruct report) { EStationType type = new EStationType(); report = new CReportStruct(); try { string data = msg; // 丢弃流水号(4位) data = data.Substring(4); // 丢弃发报时间(12位) DateTime sendTime = new DateTime( year: int.Parse("20" + data.Substring(0, 2)), month: int.Parse(data.Substring(2, 2)), day: int.Parse(data.Substring(4, 2)), hour: int.Parse(data.Substring(6, 2)), minute: int.Parse(data.Substring(8, 2)), second: int.Parse(data.Substring(10, 2)) ); //删除发送时间 data = data.Substring(12); //删除ST 站号引导符号 data = data.Substring(2); //删除空格 data = data.Substring(1); //获取站点ID string stationId = data.Substring(0, 10); //删除站点ID data = data.Substring(10); //删除空格 data = data.Substring(1); string stationTypeString = data.Substring(0, 1); if (stationTypeString == "H") { type = EStationType.EH; } if (stationTypeString == "P") { type = EStationType.ERainFall; } //删除站点类型 data = data.Substring(1); // report中的数据初始化 List <CReportData> datas = new List <CReportData>(); TimeSpan span = new TimeSpan(0); DateTime dataTime = sendTime; //int dataAccuracyLength; //int dataLength; //Decimal dataAccuracy; //Decimal dayRain; Nullable <Decimal> diffRain = null; Nullable <Decimal> totalRain = null; Nullable <Decimal> waterStage = null; Nullable <Decimal> voltage = null; //string dataDefine, dataDefine1, dataDefine2; //int flag = 0; if (data.Length >= 10) { string[] dataArr = Regex.Split(data, "TT", RegexOptions.IgnoreCase); for (int i = 0; i < dataArr.Length; i++) { string oneGram = dataArr[i].Trim(); List <decimal> rainList = new List <decimal>(); List <decimal> waterList = new List <decimal>(); if (oneGram.Length < 10) { continue; } dataTime = new DateTime( year: int.Parse("20" + oneGram.Substring(0, 2)), month: int.Parse(oneGram.Substring(2, 2)), day: int.Parse(oneGram.Substring(4, 2)), hour: int.Parse(oneGram.Substring(6, 2)), minute: int.Parse(oneGram.Substring(8, 2)), second: 0 ); //观测时间引导符 if (oneGram.Contains("TT")) { } if (oneGram.Contains("RGZS")) { } if (oneGram.Contains("PIC")) { } if (oneGram.Contains("DRP")) { int index = oneGram.IndexOf("DRP"); string rainListStr = oneGram.Substring(index + 4, 24).Trim(); for (int j = 0; j < 12; j++) { rainList.Add((System.Int32.Parse(rainListStr.Substring(j * 2, 2), System.Globalization.NumberStyles.HexNumber)) * (decimal)(0.1)); } } if (oneGram.Contains("DRZ")) { } if (oneGram.Contains("DRZ1")) { int index = oneGram.IndexOf("DRZ1"); string waterListStr = oneGram.Substring(index + 5, 48).Trim(); for (int j = 0; j < 12; j++) { waterList.Add((System.Int32.Parse(waterListStr.Substring(j * 4, 4), System.Globalization.NumberStyles.HexNumber)) * (decimal)0.01); } } if (oneGram.Contains("DATA")) { } if (oneGram.Contains("AC")) { } if (oneGram.Contains("AI")) { } if (oneGram.Contains("C")) { } if (oneGram.Contains("DRxnn")) { } if (oneGram.Contains("DT")) { } if (oneGram.Contains("ED")) { } if (oneGram.Contains("EJ")) { } if (oneGram.Contains("FL")) { } if (oneGram.Contains("GH")) { } if (oneGram.Contains("GN")) { } if (oneGram.Contains("GS")) { } if (oneGram.Contains("GT")) { } if (oneGram.Contains("GTP")) { } if (oneGram.Contains("H")) { } if (oneGram.Contains("HW")) { } if (oneGram.Contains("M10")) { } if (oneGram.Contains("M20")) { } if (oneGram.Contains("M30")) { } if (oneGram.Contains("M40")) { } if (oneGram.Contains("M50")) { } if (oneGram.Contains("M60")) { } if (oneGram.Contains("M80")) { } if (oneGram.Contains("M100")) { } if (oneGram.Contains("MST")) { } if (oneGram.Contains("P1")) { } if (oneGram.Contains("P2")) { } if (oneGram.Contains("P3")) { } if (oneGram.Contains("P6")) { } if (oneGram.Contains("P12")) { } //日降水量 if (oneGram.Contains("PD")) { } //当前降水量 if (oneGram.Contains("PJ")) { int index = oneGram.IndexOf("PJ"); string endStr = oneGram.Substring(index).Trim(); string[] endStrList = endStr.Split(' '); string diffRainString = endStrList[1]; try { diffRain = Decimal.Parse(diffRainString); } catch (Exception e) { System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); } } //1分钟时段降水量 if (oneGram.Contains("PN01")) { } //5分钟时段降水量 if (oneGram.Contains("PN05")) { } //10分钟时段降水量 if (oneGram.Contains("PN10")) { } //30分钟时段降水量 if (oneGram.Contains("PN30")) { } //暴雨量 if (oneGram.Contains("PR")) { } if (oneGram.Contains("PT")) { int index = oneGram.IndexOf("PT"); string endStr = oneGram.Substring(index).Trim(); string[] endStrList = endStr.Split(' '); string totalRainString = endStrList[1]; try { totalRain = Decimal.Parse(totalRainString); } catch (Exception e) { System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); } } //瞬时河道水位、潮位 if (oneGram.Contains("Z ")) { int index = oneGram.IndexOf("Z "); string endStr = oneGram.Substring(index).Trim(); string[] endStrList = endStr.Split(' '); string waterStageString = endStrList[1]; try { waterStage = Decimal.Parse(waterStageString); } catch (Exception e) { System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); } } //电压 if (oneGram.Contains("VT")) { int index = oneGram.IndexOf("VT"); string endStr = oneGram.Substring(index).Trim(); string[] endStrList = endStr.Split(' '); string voltageString = endStrList[1]; try { voltage = Decimal.Parse(voltageString); } catch (Exception e) { System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); } } //定时报和均匀时段报处理 // 雨量组 和 水位组 均有数据 且数量相等。 if (rainList != null && rainList.Count > 0 && waterList != null && rainList.Count == waterList.Count) { CReportData oneData = new CReportData(); for (int k = 0; k < rainList.Count; k++) { DateTime tmpDate = dataTime.AddMinutes(5 * k); oneData.Time = tmpDate; oneData.DiffRain = rainList[k]; oneData.Water = waterList[k]; datas.Add(DeepClone(oneData)); } } // 雨量组数据 和 水位组数据不匹配 else { // if (rainList != null && rainList.Count > 0) { CReportData oneData = new CReportData(); for (int k = 0; k < rainList.Count; k++) { DateTime tmpDate = dataTime.AddMinutes(5 * k); oneData.Time = tmpDate; oneData.DiffRain = rainList[k]; datas.Add(DeepClone(oneData)); } } if (waterList != null && waterList.Count > 0) { CReportData oneData = new CReportData(); for (int k = 0; k < waterList.Count; k++) { DateTime tmpDate = dataTime.AddMinutes(5 * k); oneData.Time = tmpDate; oneData.Water = waterList[k]; datas.Add(DeepClone(oneData)); } } } //普通报文处理 if (diffRain != null || totalRain != null || voltage != null) { CReportData oneData = new CReportData(); oneData.Time = dataTime; oneData.Rain = totalRain; oneData.DiffRain = diffRain; oneData.Water = waterStage; oneData.Voltge = voltage; datas.Add(DeepClone(oneData)); } } } #region 废码代码 //while (data.Length >= 2) //{ // // 截取要素标识符 // string sign = data.Substring(0, 2); // flag = flag + 1; // if(flag > 100) // { // break; // } // // 根据要素标识符取数据 // switch (sign) // { // case "ST": // // 丢弃标识符 // data = data.Substring(2); // // 丢弃一个字节 // data = data.Substring(1); // // 丢弃一个测站地址 // data = data.Substring(10); // // 丢弃一个字节 // data = data.Substring(1); // // 遥测站分类码,不确定是不是一定在这个后面 // string stationTypeString = data.Substring(0,1); // if(stationTypeString == "H") // { // type = EStationType.EH; // } // if(stationTypeString == "P") // { // type = EStationType.ERainFall; // } // data = data.Substring(1); // //type = stationTypeString == "50" ? EStationType.ERainFall : EStationType.EHydrology; // data = data.Substring(1); // break; // case "TT": // // 丢弃标识符 // data = data.Substring(2); // //丢弃一个字节 // data = data.Substring(1); // dataTime = new DateTime( // year: int.Parse("20" + data.Substring(0, 2)), // month: int.Parse(data.Substring(2, 2)), // day: int.Parse(data.Substring(4, 2)), // hour: int.Parse(data.Substring(6, 2)), // minute: int.Parse(data.Substring(8, 2)), // second: 0 // ); // data = data.Substring(10); // //丢弃一个字节 // data = data.Substring(1); // break; // case "PD": // // 丢弃标识符 // data = data.Substring(2); // // 丢弃数据定义19 3个字节、精度1 // dataDefine1 = Convert.ToString(int.Parse(data.Substring(0, 1)), 2); // dataDefine2 = Convert.ToString(int.Parse(data.Substring(1, 1)), 2); // dataDefine = dataDefine1.PadLeft(4, '0') + dataDefine2.PadLeft(4, '0'); // dataLength = Convert.ToInt32(dataDefine.Substring(0, 5), 2) * 2; // dataAccuracyLength = Convert.ToInt32(dataDefine.Substring(5, 3), 2); // dataAccuracy = 1; // while (dataAccuracyLength > 0) // { // dataAccuracy *= (decimal)0.1; // dataAccuracyLength--; // } // data = data.Substring(2); // string dayRainString = data.Substring(0, dataLength); // data = data.Substring(dataLength); // try // { // dayRain = Decimal.Parse(dayRainString) * dataAccuracy; // } // catch (Exception e) // { // System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); // } // break; // case "PJ": // // 丢弃标识符 // data = data.Substring(2); // // 丢掉一个字节 // data = data.Substring(1); // string[] rainArr = data.Split('.'); // int rainLen = rainArr[0].Length; // string rainStr = data.Substring(0,rainLen + 2); // data = data.Substring(rainLen + 2); // data = data.Substring(1); // // 丢弃数据定义19 3个字节、精度1 // string diffRainString = rainStr; // try // { // diffRain = Decimal.Parse(diffRainString); // } // catch (Exception e) // { // System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); // } // break; // case "PT": // // 丢弃标识符 // data = data.Substring(2); // // 丢掉一个字节 // data = data.Substring(1); // string[] dataArr = data.Split('.'); // int tmp = dataArr[0].Length; // string totalRain = data.Substring(0,tmp + 2); // data = data.Substring(tmp + 2); // data = data.Substring(1); // // 根据长度精度解析数据 // if (reportType == "31") // { // for (int i = 0; i < 13; i++) // { // try // { // // 数据截取 // string rainString = totalRain; // if (i != 0) // { // dataTime = dataTime + span; // } // Decimal rain = 0; // rain = Decimal.Parse(rainString); // // 数据封包 // bool isExists = false; // if (datas.Count != 0) // { // foreach (var d in datas) // { // if (d.Time == dataTime) // { // isExists = true; // d.Rain = rain; // } // } // } // if (isExists == false) // { // CReportData reportData = new CReportData // { // Rain = rain, // Time = dataTime // }; // datas.Add(reportData); // } // } // catch (Exception e) // { // System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); // } // } // } // else if (reportType == "32" || reportType == "33" || reportType == "30") // { // try // { // // 数据截取 // string rainString = totalRain; // Decimal rain = 0; // rain = Decimal.Parse(rainString); // // 数据封包 // bool isExists = false; // if (datas.Count != 0) // { // foreach (var d in datas) // { // if (d.Time == dataTime) // { // isExists = true; // d.Rain = rain; // } // } // } // if (isExists == false) // { // CReportData reportData = new CReportData // { // Rain = rain, // Time = dataTime // }; // datas.Add(reportData); // } // } // catch (Exception e) // { // System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); // } // } // break; // case "VT": // // 丢弃标识符 // data = data.Substring(2); // //丢掉一个位置 // data = data.Substring(1); // // 丢弃数据定义?? ?个字节、精度? // string[] voltageArr = data.Split('.'); // int voltageLen = voltageArr[0].Length; // string voltageStr = data.Substring(0,voltageLen + 3); // data = data.Substring(voltageLen + 3); // data = data.Substring(1); // // 根据长度精度解析数据 // if (reportType == "31") // { // for (int i = 0; i < 13; i++) // { // try // { // // 数据截取 // string voltageString = voltageStr; // if (i != 0) // { // dataTime = dataTime + span; // } // Decimal voltage = 0; // voltage = Decimal.Parse(voltageString); // // 数据封包 // bool isExists = false; // if (datas.Count != 0) // { // foreach (var d in datas) // { // if (d.Time == dataTime) // { // isExists = true; // d.Voltge = voltage; // } // } // } // if (isExists == false) // { // CReportData reportData = new CReportData // { // Voltge = voltage, // Time = dataTime // }; // datas.Add(reportData); // } // } // catch (Exception e) // { // System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); // } // } // } // else if (reportType == "32" || reportType == "33" ||reportType == "30") // { // try // { // // 数据截取 // string voltageString = voltageStr; // Decimal voltage = 0; // voltage = Decimal.Parse(voltageString); // // 数据封包 // bool isExists = false; // if (datas.Count != 0) // { // foreach (var d in datas) // { // if (d.Time == dataTime) // { // isExists = true; // d.Voltge = voltage; // } // } // } // if (isExists == false) // { // CReportData reportData = new CReportData // { // Voltge = voltage, // Time = dataTime // }; // datas.Add(reportData); // } // } // catch (Exception e) // { // System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); // } // } // break; // default: // if (data.StartsWith("Z")) // { // // 丢弃标识符 // data = data.Substring(1); // //丢掉一个字节 // data = data.Substring(1); // string[] dataArr2 = data.Split('.'); // int tmp2 = dataArr2[0].Length; // // 丢弃数据定义23 4个字节、精度3 // string waterStr = data.Substring(0,tmp2 + 4); // data = data.Substring(tmp2 + 4); // data = data.Substring(1); // // 根据长度精度解析数据 // if (reportType == "31") // { // for (int i = 0; i < 13; i++) // { // try // { // // 数据截取 // string waterString = waterStr; // if (i != 0) // { // dataTime = dataTime + span; // } // Decimal water = 0; // water = Decimal.Parse(waterString); // // 数据封包 // bool isExists = false; // if (datas.Count != 0) // { // foreach (var d in datas) // { // if (d.Time == dataTime) // { // isExists = true; // d.Water = water; // } // } // } // if (isExists == false) // { // CReportData reportData = new CReportData // { // Water = water, // Time = dataTime // }; // datas.Add(reportData); // } // } // catch (Exception e) // { // System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); // } // } // } // else if (reportType == "32" || reportType == "33" || reportType == "30") // { // try // { // // 数据截取 // string waterString = waterStr; // Decimal water = 0; // water = Decimal.Parse(waterString); // // 数据封包 // bool isExists = false; // if (datas.Count != 0) // { // foreach (var d in datas) // { // if (d.Time == dataTime) // { // isExists = true; // d.Water = water; // } // } // } // if (isExists == false) // { // CReportData reportData = new CReportData // { // Water = water, // Time = dataTime // }; // datas.Add(reportData); // } // } // catch (Exception e) // { // System.Diagnostics.Debug.WriteLine("规约协议数据截取错误" + e.ToString()); // } // } // } // else if (data.StartsWith("DRxnn")) // { // // 丢弃标识符 // data = data.Substring(2); // // 丢弃数据定义18 3个字节、精度0 // data = data.Substring(2); // // 时间步长 // string timeSpanString = data.Substring(0, 6); // data = data.Substring(6); // TimeSpan timeSpan = new TimeSpan(Int32.Parse(timeSpanString.Substring(0, 2)), Int32.Parse(timeSpanString.Substring(2, 2)), Int32.Parse(timeSpanString.Substring(4, 2)), 0); // span = span + timeSpan; // } // break; // } //} #endregion foreach (var d in datas) { if (!d.Rain.HasValue) { d.Rain = -1; } if (!d.Water.HasValue) { d.Water = -20000; } if (d.Voltge <= 0) { d.Voltge = -20; } } report = new CReportStruct { StationType = type, Datas = datas }; return(true); } catch (Exception e) { System.Diagnostics.Debug.WriteLine("数据:" + msg); System.Diagnostics.Debug.WriteLine("规约协议正文解析错误" + e.Message); return(false); } }
/// <summary> /// #S1209110500705141749 000.87001.06000.98000.76000.82 /// #S1209110500705141755 000.67000.96000.90 /// </summary> /// <param name="rawStr"></param> /// <param name="soil"></param> /// <returns></returns> /// public bool Parse(string resp, out CEntitySoilData soil, out CReportStruct report) { soil = null; report = null; report = new CReportStruct(); try { string rawStr = resp.Trim(); if (rawStr.StartsWith("#S1")) { soil = new CEntitySoilData(); // 终端机号 soil.StrDeviceNumber = rawStr.Substring(3, 8); // 数据采集时间 int year = Int32.Parse("20" + rawStr.Substring(11, 2)); int month = Int32.Parse(rawStr.Substring(13, 2)); int day = Int32.Parse(rawStr.Substring(15, 2)); int hour = Int32.Parse(rawStr.Substring(17, 2)); int minute = Int32.Parse(rawStr.Substring(19, 2)); soil.DataTime = new DateTime(year, month, day, hour, minute, 0); // #S1209110500705141749 000.87001.06000.98000.76000.82 if (rawStr.Length.Equals(22 + 30)) { soil.Voltage10 = float.Parse(rawStr.Substring(22, 6)); soil.Voltage20 = float.Parse(rawStr.Substring(28, 6)); soil.Voltage30 = float.Parse(rawStr.Substring(34, 6)); soil.Voltage40 = float.Parse(rawStr.Substring(40, 6)); soil.Voltage60 = float.Parse(rawStr.Substring(46, 6)); } // #S1209110500705141755 000.67000.96000.90 if (rawStr.Length.Equals(22 + 18)) { soil.Voltage10 = float.Parse(rawStr.Substring(22, 6)); soil.Voltage20 = float.Parse(rawStr.Substring(28, 6)); soil.Voltage40 = float.Parse(rawStr.Substring(34, 6)); } return(true); } else if (rawStr.StartsWith("$") && "1G" == rawStr.Substring(5, 2)) { soil = new CEntitySoilData(); string StationID = rawStr.Substring(1, 4); soil.StationID = StationID; // $70521G25142523453124 string cmd = rawStr.Substring(7, 2); if ("25" == cmd) { var now = DateTime.Now; soil.DataTime = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0); // $70521G25142523453124 if (21 == rawStr.Length) { soil.Voltage10 = float.Parse(rawStr.Substring(9, 4)) / 100; soil.Voltage20 = float.Parse(rawStr.Substring(13, 4)) / 100; soil.Voltage40 = float.Parse(rawStr.Substring(17, 4)) / 100; } else if (29 == rawStr.Length)// $70521G2514252345312412345678 { soil.Voltage10 = float.Parse(rawStr.Substring(9, 4)) / 100; soil.Voltage20 = float.Parse(rawStr.Substring(13, 4)) / 100; soil.Voltage30 = float.Parse(rawStr.Substring(17, 4)) / 100; soil.Voltage40 = float.Parse(rawStr.Substring(21, 4)) / 100; soil.Voltage60 = float.Parse(rawStr.Substring(25, 4)) / 100; } else { return(false); } return(true); } else if ("22" == cmd || "21" == cmd) { // $70521G2217yymmddhhmm12345600011256000100020003 EStationType stationType = EStationType.EHydrology; decimal water = decimal.Parse(rawStr.Substring(21, 6)) / 100; decimal rain = decimal.Parse(rawStr.Substring(27, 4)); decimal volegate = decimal.Parse(rawStr.Substring(31, 4)) / 100; CReportData reportData = new CReportData(); switch (rawStr.Substring(9, 2)) { case "04": stationType = EStationType.ESoil; if ("21" == cmd) { report.ReportType = EMessageType.EAdditional; } if ("22" == cmd) { report.ReportType = EMessageType.ETimed; } break; case "05": stationType = EStationType.ESoilRain; reportData.Rain = rain; reportData.Voltge = volegate; break; case "06": case "16": stationType = EStationType.ESoilWater; reportData.Water = water; reportData.Voltge = volegate; break; case "07": case "17": reportData.Rain = rain; reportData.Water = water; reportData.Voltge = volegate; stationType = EStationType.ESoilHydrology; break; default: throw new Exception(); break; } int year = Int32.Parse("20" + rawStr.Substring(11, 2)); int month = Int32.Parse(rawStr.Substring(13, 2)); int day = Int32.Parse(rawStr.Substring(15, 2)); int hour = Int32.Parse(rawStr.Substring(17, 2)); int minute = Int32.Parse(rawStr.Substring(19, 2)); DateTime collectTime = new DateTime(year, month, day, hour, minute, 0); soil.DataTime = collectTime; //gm 20161030 下1行 soil.DVoltage = volegate; if (47 == rawStr.Length) { // $7052 1G2217 yymmddhhmm 123456 0001 1256 0001 0002 0003 soil.Voltage10 = float.Parse(rawStr.Substring(35, 4)) / 100; soil.Voltage20 = float.Parse(rawStr.Substring(39, 4)) / 100; soil.Voltage40 = float.Parse(rawStr.Substring(43, 4)) / 100; // report = new CReportStruct(); report.Datas = new List <CReportData>(); report.Stationid = StationID; report.StationType = stationType; report.RecvTime = DateTime.Now; reportData.Time = DateTime.Now; report.Datas.Add(reportData); } else if (47 + 8 == rawStr.Length) { // $70521G2217yymmddhhmm123456 0001 1256 0001 0002 0003 0004 0005 soil.Voltage10 = float.Parse(rawStr.Substring(35, 4)) / 100; soil.Voltage20 = float.Parse(rawStr.Substring(39, 4)) / 100; soil.Voltage30 = float.Parse(rawStr.Substring(43, 4)) / 100; soil.Voltage40 = float.Parse(rawStr.Substring(47, 4)) / 100; soil.Voltage60 = float.Parse(rawStr.Substring(51, 4)) / 100; report = new CReportStruct(); report.Stationid = StationID; report.StationType = stationType; report.RecvTime = DateTime.Now; reportData.Time = DateTime.Now; report.Datas = new List <CReportData>(); report.Datas.Add(reportData); } else { return(false); } return(true); } } } catch (Exception exp) { } return(false); }