using IceCoffee.Common.Extensions; using System; using System.Collections.Generic; using System.Text; namespace IceCoffee.HJ212.Models { /// /// 数据段 /// public class DataSegment { /// /// 默认应答系统编码 /// public const string ResponseST = "91"; /// /// 请求编号 /// /// /// yyyyMMddHHmmssZZZ 取当前系统时间, 精确到毫秒值, 用来唯一标识一次命令交互 /// public string QN { get; set; } /// /// 系统编号 /// public string ST { get; set; } /// /// 命令编码 /// 详见附录 2 /// public CommandNumber CN { get; set; } /// /// 访问密码 /// 对接时提供给各个对接站点 /// public string PW { get; set; } /// /// 设备唯一标识 /// 对接时提供给各个对接站点 /// public string MN { get; set; } /// /// 拆分包及应答标志 /// public PackageFlag PackageFlag { get; set; } /// /// 总包数 /// PNUM 指示本次通讯中总共包含的包数,注:不分包时可以没有本字段,与标志位有关 /// public int PNUM { get; set; } /// /// 包号 /// PNO 指示当前数据包的包号,注: 不分包时可以没有本字段,与标志位有关 /// public int PNO { get; set; } /// /// 指令 /// CP=&&数据区&&( 详见表 5 ) /// public CpCommand CpCommand { get; set; } /// /// 解析 /// /// /// /// public static DataSegment Parse(string data, Func unpackCacheFunc) { try { DataSegment dataSegment = new DataSegment(); int outEnd; dataSegment.QN = data.GetMidStr("QN=", ";", out outEnd); if(outEnd < 0) { outEnd = 0; } dataSegment.ST = data.GetMidStr("ST=", ";", out outEnd, outEnd); dataSegment.CN = (CommandNumber)int.Parse(data.GetMidStr("CN=", ";", out outEnd, outEnd)); dataSegment.PW = data.GetMidStr("PW=", ";", out outEnd, outEnd); dataSegment.MN = data.GetMidStr("MN=", ";", out outEnd, outEnd); string packageFlag = data.GetMidStr("Flag=", ";", out outEnd, outEnd); if (string.IsNullOrEmpty(packageFlag) || int.TryParse(packageFlag, out _) == false || outEnd < 0) { outEnd = 0; } else { dataSegment.PackageFlag = PackageFlag.Parse(packageFlag); } if (dataSegment.PackageFlag != null && dataSegment.PackageFlag.D == 1) { // 分包 dataSegment.PNUM = int.Parse(data.GetMidStr("PNUM=", ";", out outEnd, outEnd)); dataSegment.PNO = int.Parse(data.GetMidStr("PNO=", ";", out outEnd, outEnd)); string cp = data.GetMidStr("CP=&&", "&&", out outEnd, outEnd); var cache = unpackCacheFunc.Invoke(); if(dataSegment.PNO == 1)// 第一个包 { cache.Append(cp); } else if (dataSegment.PNUM == dataSegment.PNO)// 最后一个包 { cache.Append(cp.Substring(23)); dataSegment.CpCommand = CpCommand.Parse(cache.ToString()); cache.Clear(); } else// 中间的包 { cache.Append(cp.Substring(23));// 23 - DataTime=20170920100000; 留分号 } } else { string cp = data.GetMidStr("CP=&&", "&&", out outEnd, outEnd); // 过滤心跳包 dataSegment.CpCommand = dataSegment.CN == CommandNumber.HeartbeatPackage ? new CpCommand() : CpCommand.Parse(cp); } return dataSegment; } catch (Exception ex) { throw new Exception("Error in DataSegment.Parse", ex); } } /// /// 序列化 /// /// public string Serialize() { return $"QN={QN};ST={ST};CN={(int)CN};PW={PW};MN={MN};Flag={PackageFlag.Serialize()};CP=&&{CpCommand.Serialize()}&&"; } } }