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;
}
}
}