using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using BatCharging.Model; namespace BatCharging.Service { /// /// 站控设置尖峰平谷时间段标识消息封装-3.4.9 /// public class MsgPeakTimeEncoder { /// /// 获取鉴权消息包字节列表 /// /// public byte[] GetMsgPeakTimePeriod(byte[] destAddr, SharpPeakTimeRangeIde timeRng) { byte[] result = null; APCI headAPCI = new APCI(); headAPCI.StartChar = CmnChargerConst.APCI_START_CHAR; headAPCI.PackLen = 0; //临时赋值为零,具体数值看下面的计算结果 headAPCI.CtlArea = 0; //控制域 headAPCI.DestAddr = destAddr;//目的地址 headAPCI.SrcAddr = 0;//源地址,本系统中,源地址统一为:00000000(即为0) byte randomNum = CmnChargerParam.GetByteRandomNum(); ASDU headASDU = new ASDU(); headASDU.FrameTypeNo = 45; //帧类型号 headASDU.MsgBodyCount = 1; //信息体个数 headASDU.TransReason = 3; //传送原因 headASDU.PublicAddr = 0; //公共地址 headASDU.MsgBodyAddr = new byte[] { 0, 0, 0 }; //信息体地址 if(timeRng!=null) { timeRng.RecordType = 47; //记录类型 headASDU.MsgBodyContents = GetMsgContents(timeRng); //信息体 headAPCI.PackLen = Convert.ToUInt16(24 + headASDU.MsgBodyContents.Length); //报文长度 } List lstResult = MsgHeadApciEncoder.BuildBaseAPCI(headAPCI); lstResult.AddRange(MsgHeadAsduEncoder.BuildBaseASDU(headASDU).ToArray()); result = lstResult.ToArray(); return result; } /// /// 获取鉴权消息体字节数组 /// /// /// 鉴权消息体字节数组 private byte[] GetMsgContents(SharpPeakTimeRangeIde timeRng) { byte[] results = null; if (timeRng != null) { List lstContent = new List(); lstContent.Add(timeRng.RecordType); lstContent.Add(timeRng.NumTimePeriods); for(int i=0;i 0) { byte[] temps = GetTimePeriodBytes(strTimePeriod); lstContent.Add(temps[0]); lstContent.Add(temps[1]); lstContent.Add(peakIden); } } results = lstContent.ToArray(); } return results; } /// /// 把时段的BCD码字符串("HH:mm")转换为两个字节的字节数组 /// /// /// private byte[] GetTimePeriodBytes(string strTimePeriod) { byte[] results = new byte[] { 0, 0 }; if (!string.IsNullOrEmpty(strTimePeriod)) { string[] strTemps = strTimePeriod.Split(":"); if(strTemps!=null) { if(strTemps.Length==2) { results[0] = ByteUtils.BCDToByte(Convert.ToByte(strTemps[0])); results[1] = ByteUtils.BCDToByte(Convert.ToByte(strTemps[1])); } } } return results; } } }