You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BatCharging.Model;
namespace BatCharging.Service
{
/// <summary>
/// 设备鉴权和操作指令消息封装类-3.3
/// </summary>
public class MsgSignCmdEncoder
{
/// <summary>
/// 获取鉴权消息包字节列表
/// </summary>
/// <returns></returns>
public byte[] GetMsgPackSignIn(byte[] destAddr,out Auth auth)
{
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 }; //信息体地址
auth = new Auth();
auth.RecordType = 24; //记录类型
auth.ClientType = 1; //客户端类型。1站控 2本地控制器 3测试客户端 4TCU模式 0未知设备
auth.ConnSeq = CmnChargerParam.GetUInt16SeqNum(); //连接序号
auth.AuthCodes = GetAuthCodesResult(CmnChargerConst.AUTH_CODE, randomNum); //鉴权码
auth.AuthCodeKey = randomNum; //鉴码KEY[随机数]
headASDU.MsgBodyContents = GetMsgContents(auth); //信息体
headAPCI.PackLen = Convert.ToUInt16(24 + headASDU.MsgBodyContents.Length); //报文长度
List<byte> lstResult = MsgHeadApciEncoder.BuildBaseAPCI(headAPCI);
lstResult.AddRange(MsgHeadAsduEncoder.BuildBaseASDU(headASDU).ToArray());
result = lstResult.ToArray();
return result;
}
/// <summary>
/// 获取到异或后的鉴权字节数组
/// </summary>
/// <param name="strAuthCodes">鉴权字符串</param>
/// <returns>异或后的鉴权字节数组</returns>
private byte[] GetAuthCodesResult(string strAuthCodes,byte key)
{
byte[] results = new byte[8];
if (!String.IsNullOrEmpty(strAuthCodes))
{
byte[] authCodes = Encoding.ASCII.GetBytes(strAuthCodes);
results[0] = Convert.ToByte(authCodes[0] ^ key);
results[1] = Convert.ToByte(authCodes[1] ^ key);
results[2] = Convert.ToByte(authCodes[2] ^ key);
results[3] = Convert.ToByte(authCodes[3] ^ key);
results[4] = Convert.ToByte(authCodes[4] ^ key);
results[5] = Convert.ToByte(authCodes[5] ^ key);
results[6] = Convert.ToByte(authCodes[6] ^ key);
results[7] = Convert.ToByte(authCodes[7] ^ key);
}
return results;
}
/// <summary>
/// 获取鉴权消息体字节数组
/// </summary>
/// <param name="auth"></param>
/// <returns>鉴权消息体字节数组</returns>
private byte[] GetMsgContents(Auth auth)
{
byte[] results = null;
if (auth!=null)
{
List<byte> lstContent = new List<byte>();
lstContent.Add(auth.RecordType);
lstContent.Add(auth.ClientType);
lstContent.AddRange(BitConverter.GetBytes(auth.ConnSeq));
lstContent.AddRange(auth.AuthCodes);
lstContent.Add(auth.AuthCodeKey);
results = lstContent.ToArray();
}
return results;
}
}
}