You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.5 KiB
C#
79 lines
2.5 KiB
C#
using SlnMesnac.RfidUpload.Common;
|
|
using SlnMesnac.RfidUpload.Model;
|
|
using SlnMesnac.RfidUpload.NLog;
|
|
using System;
|
|
using System.Text;
|
|
|
|
namespace SlnMesnac.RfidUpload.Analysis
|
|
{
|
|
/// <summary>
|
|
/// 指令适配器
|
|
/// </summary>
|
|
public class InstructionAdapter
|
|
{
|
|
private MsgUtil _msgUtil = MsgUtil.Instance;
|
|
private readonly LogHelper logger = LogHelper.Instance;
|
|
#region 单例实现
|
|
private static readonly Lazy<InstructionAdapter> _lazy = new Lazy<InstructionAdapter>(() => new InstructionAdapter());
|
|
|
|
public static InstructionAdapter Instance => _lazy.Value;
|
|
|
|
#endregion
|
|
|
|
private InstructionAdapter() { }
|
|
|
|
/// <summary>
|
|
/// 标签解析
|
|
/// </summary>
|
|
/// <param name="buffer"></param>
|
|
/// <returns></returns>
|
|
/// <exception cref="ArgumentException"></exception>
|
|
public InstructionInfo ParseInstruction(byte[] buffer)
|
|
{
|
|
|
|
byte[] m_length = new byte[2];
|
|
Array.Copy(buffer, 2, m_length, 0, 2);
|
|
int bufferLength = Convert.ToInt32(BitConverter.ToString(m_length).Replace("-", ""), 16);
|
|
|
|
if (buffer.Length != bufferLength)
|
|
{
|
|
throw new ArgumentException("指令长度不正确");
|
|
}
|
|
|
|
byte[] xorbuffer = new byte[buffer.Length - 3];
|
|
Array.Copy(buffer, 2, xorbuffer, 0, xorbuffer.Length);
|
|
string xorStr = _msgUtil.CalculateXORChecksum(xorbuffer);
|
|
string bufferXor = buffer[buffer.Length - 1].ToString("X2");
|
|
if (bufferXor != xorStr)
|
|
{
|
|
throw new ArgumentException($"XOR校验失败,指令XOR:{bufferXor},计算XOR:{xorStr}");
|
|
}
|
|
|
|
InstructionInfo instructionInfo = new InstructionInfo();
|
|
byte[] m_stx = new byte[2];
|
|
Array.Copy(buffer, 0, m_stx, 0, 2);
|
|
instructionInfo.stx = BitConverter.ToString(m_stx).Replace("-", "");
|
|
|
|
instructionInfo.len = bufferLength;
|
|
|
|
instructionInfo.cmd = buffer[4];
|
|
|
|
int status = Convert.ToInt32(buffer[5]);
|
|
instructionInfo.status = status;
|
|
|
|
byte[] m_data = new byte[bufferLength - 7];
|
|
Array.Copy(buffer, 6, m_data, 0, m_data.Length);
|
|
string dataValue = Encoding.ASCII.GetString(m_data);
|
|
instructionInfo.data = dataValue;
|
|
|
|
instructionInfo.xor = buffer[buffer.Length - 1];
|
|
|
|
instructionInfo.recordtime = DateTime.Now;
|
|
|
|
return instructionInfo;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
} |