148 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
	
	
using System.Text;
 | 
						||
 | 
						||
namespace langguanApi.Model.Dto
 | 
						||
{
 | 
						||
    /// <summary>
 | 
						||
    /// HJ212_2017
 | 
						||
    /// </summary>
 | 
						||
    public class HJ212_2017
 | 
						||
    {
 | 
						||
        /// <summary>
 | 
						||
        /// 数据帧头
 | 
						||
        /// </summary>
 | 
						||
        public string header { get; set; }
 | 
						||
        /// <summary>
 | 
						||
        /// 数据长度
 | 
						||
        /// </summary>
 | 
						||
        public string data_length { get; set; }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 数据头
 | 
						||
        /// </summary>
 | 
						||
        public Dictionary<string, string> DATA_HEAD { get; set; }
 | 
						||
        /// <summary>
 | 
						||
        /// 
 | 
						||
        /// </summary>
 | 
						||
        public Dictionary<string, string> CP { get; set; }
 | 
						||
        /// <summary>
 | 
						||
        /// CRC校验
 | 
						||
        /// </summary>
 | 
						||
        public string CRC { get; set; }
 | 
						||
        /// <summary>
 | 
						||
        /// 
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="Text"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        public bool DecodeData(string Text)
 | 
						||
        {
 | 
						||
            try
 | 
						||
            {
 | 
						||
                if (Text.Length < 12 || !Text.StartsWith("##"))
 | 
						||
                {
 | 
						||
                    Console.WriteLine("不是HJ212协议的报文!");
 | 
						||
                    return false;
 | 
						||
                }
 | 
						||
                Console.WriteLine($"开始解码数据:");
 | 
						||
                Text = Text.ToUpper().Replace(";CP=", "").Replace(" ", "");//有些厂家协议不很标准,有的大小写不一致,此处强制转大写字母
 | 
						||
                header = Text.Substring(0, 2);
 | 
						||
                data_length = Text.Substring(2, 4);
 | 
						||
                string[] data_0 = Text.Substring(6, Text.Length - 6).Split(new char[] { '&', '&' }, StringSplitOptions.RemoveEmptyEntries);
 | 
						||
                string[] data_1 = data_0[0].Split(new char[] { ';' });
 | 
						||
                DATA_HEAD = new Dictionary<string, string>();
 | 
						||
                for (int h = 0; h < data_1.Length; h++)
 | 
						||
                {
 | 
						||
                    string[] d_1 = data_1[h].Split(new char[] { '=' });
 | 
						||
                    DATA_HEAD.Add(d_1[0], d_1[1]);
 | 
						||
                }
 | 
						||
                string[] data_2 = data_0[1].Split(new char[] { ';' });
 | 
						||
                CP = new Dictionary<string, string>();
 | 
						||
                for (int i = 0; i < data_2.Length; i++)
 | 
						||
                {
 | 
						||
                    string[] d_6 = data_2[i].Split(new char[] { ',' });
 | 
						||
                    for (int j = 0; j < d_6.Length; j++)
 | 
						||
                    {
 | 
						||
                        string[] d_7 = d_6[j].Split(new char[] { '=' });
 | 
						||
                        //兼容设备厂家不规范的命名,会有重复的CP名称
 | 
						||
                        if (!CP.ContainsKey(d_7[0].Replace("-RTD", "")))
 | 
						||
                        {
 | 
						||
                            CP.Add(d_7[0].Replace("-RTD", "").Replace("-COU", "_Cou"), d_7[1]);
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                CRC = data_0[2];
 | 
						||
                return true;
 | 
						||
            }
 | 
						||
            catch (Exception ex)
 | 
						||
            {
 | 
						||
                //数据接收不完整
 | 
						||
                Console.WriteLine($" 解码失败:err:{ex},数据有问题," + Text);
 | 
						||
                //throw;
 | 
						||
                return false;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 判断数据是否通过校验
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="Text">原始数据</param>
 | 
						||
        /// <returns>是否通过</returns>
 | 
						||
        public bool Crc16(string Text)
 | 
						||
        {
 | 
						||
            try
 | 
						||
            {
 | 
						||
                string CRC = Text.Substring(Text.Length - 4, 4);
 | 
						||
 | 
						||
                Text = Text.Substring(Text.IndexOf("QN"));
 | 
						||
                Text = Text.Substring(0, Text.Length - 4);
 | 
						||
 | 
						||
                byte[] bytes = Encoding.ASCII.GetBytes(Text);
 | 
						||
                int crcRegister = 0xFFFF;
 | 
						||
                for (int i = 0; i < bytes.Length; i++)
 | 
						||
                {
 | 
						||
                    crcRegister = (crcRegister >> 8) ^ bytes[i];
 | 
						||
                    for (int j = 0; j < 8; j++)
 | 
						||
                    {
 | 
						||
                        int check = crcRegister & 0x0001;
 | 
						||
                        crcRegister >>= 1;
 | 
						||
                        if (check == 0x0001)
 | 
						||
                        {
 | 
						||
                            crcRegister ^= 0xA001;
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                string result = string.Format("{0:X}", crcRegister);//转十六进制
 | 
						||
                for (int i = result.Length; i < 4; i++)//补足 4 位
 | 
						||
                {
 | 
						||
                    result = "0" + result;
 | 
						||
                }
 | 
						||
                //LogApi.WriteLog("计算校验码:" + result);
 | 
						||
                if (result == CRC)
 | 
						||
                {
 | 
						||
                    return true;
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    Console.WriteLine("校验码有误," + CRC);
 | 
						||
                    Console.WriteLine("待校验数据:" + Text);
 | 
						||
                    Console.WriteLine("计算校验码:" + result);
 | 
						||
                    //LogApi.WriteLog("校验码有误:" + CRC);
 | 
						||
                    //LogApi.WriteLog("待校验数据:" + Text);
 | 
						||
                    //LogApi.WriteLog("计算校验码:" + result);
 | 
						||
                    return false;
 | 
						||
 | 
						||
 | 
						||
                }
 | 
						||
            }
 | 
						||
            catch (Exception)
 | 
						||
            {
 | 
						||
                Console.WriteLine("数据校验:数据有问题:" + Text);
 | 
						||
                //数据接收不完整
 | 
						||
                return false;
 | 
						||
                //throw;
 | 
						||
            }
 | 
						||
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |