PkgData.cs 6.9 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Mushiny.Model
{
    public class PkgData
    {
        public PkgData()
        {
        }
        /// <summary>
        /// 帧头
        /// 数据位置:起始编号0,长度1
        /// </summary>
        public byte FrameHead { get; set; }
        /// <summary>
        /// 帧长
        /// 数据位置:起始编号1,长度2
        /// </summary>
        public ushort FrameLenght { get; set; }
        /// <summary>
        /// 小车ID
        /// 数据位置:起始编号3,长度4
        /// </summary>
        public uint AgvID { get; set; }
        /// <summary>
        /// 时间戳
        /// 数据位置:起始编号7,长度4
        /// </summary>
        public uint TimeStamp { get; set; }
        /// <summary>
        /// 命令字
        /// 数据位置:起始编号11,长度1
        /// </summary>
        public byte CmdWord { get; set; }

        /// <summary>
        /// CRC低字节
        /// </summary>
        public byte CRC16Low { get; set; }
        /// <summary>
        /// CRC高字节
        /// </summary>
        public byte CRC16Upper { get; set; }
        /// <summary>
        /// 是否已发送
        /// </summary>
        public bool Sended { get; set; }
        /// <summary>
        /// 转化为字符串
        /// </summary>
        /// <returns></returns>
        public virtual byte[] ToBytes()
        {
            List<byte> bytes = new List<byte>
            {
                FrameHead,
            };
            bytes.AddRange(Common.ConvertToBytes(FrameLenght));
            bytes.AddRange(Common.ConvertToBytes(AgvID));
            bytes.AddRange(Common.ConvertToBytes(TimeStamp));
            bytes.Add(CmdWord);
            return bytes.ToArray();
        }
        /// <summary>
        /// 解析字节里的信息
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public virtual bool Parse(byte[] bytes)
        {
            bool rtn = false;
            try
            {
                FrameHead = Common.GetSubBytes(bytes, 0, 1)[0];
                FrameLenght = Common.ConvertToUshort(Common.GetSubBytes(bytes, 1, 2));
                calRecvCrc(Common.GetSubBytes(bytes.ToArray(), 1, (int)(FrameLenght + 2)).ToList());
                if (bytes.Length >= 12)
                {
                    AgvID = Common.ConvertToUInt(Common.GetSubBytes(bytes, 3, 4));
                    TimeStamp = Common.ConvertToUInt(Common.GetSubBytes(bytes, 7, 4));
                    CmdWord = Common.GetSubBytes(bytes, 11, 1)[0];
                    rtn = true;
                }
                else
                {
                    rtn = false;
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            return rtn;

        }
        static uint timeStamp = 0;
        public static uint genTimeStamp()
        {
            //if (timeStamp.Equals(uint.MaxValue))
            //{
            //    timeStamp = 0;
            //}
            // return timeStamp++;
            return GetTimeStamp();
        }
        /// <summary>
        /// 获取时间戳
        /// </summary>
        /// <returns></returns>
        static uint GetTimeStamp()
        {
            //DateTime.Now获取的是电脑上的当前时间
            TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 8, 0, 0, 0);
            return Convert.ToUInt32(ts.TotalSeconds);//精确到秒
        }

        protected void calSendCrc(List<byte> bytes)
        {
            byte[] dstBytes = Common.GetSubBytes(bytes.ToArray(), 1, bytes.Count - 1);
            ushort crc = Common.CRC_16(dstBytes, dstBytes.Length, 0);
            byte[] crcBytes = Common.ConvertToBytes(crc);
            CRC16Low = crcBytes[1];
            CRC16Upper = crcBytes[0];
        }
        protected void calRecvCrc(List<byte> bytes)
        {
            ushort crc = Common.CRC_16(bytes.ToArray(), bytes.Count, 0);
            byte[] crcBytes = Common.ConvertToBytes(crc);
            CRC16Low = crcBytes[1];
            CRC16Upper = crcBytes[0];
        }
        public static bool ParseCmd(byte[] bytes, out byte cmdWord)
        {
            cmdWord = 0x00;
            if (bytes.Length >= 12)
            {
                cmdWord = bytes[11];
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 是否是路径应答包
        /// </summary>
        /// <param name="cmdWord">命令字</param>
        /// <param name="result">是路径应答包时,是否正常</param>
        /// <returns></returns>
        public static bool IsPathRtnPkg(byte cmdWord, out bool result)
        {
            result = (cmdWord == 0xa1);
            return cmdWord == 0xa0 || cmdWord == 0xa1;
        }
        /// <summary>
        /// 是否是命令码回复数据包
        /// </summary>
        /// <param name="cmdWord"></param>
        /// <returns></returns>
        public static bool IsActionResonse(byte cmdWord)
        {
            return cmdWord == 0x06;
        }
        /// <summary>
        /// 是否是动作完成数据包
        /// </summary>
        /// <param name="cmdWord"></param>
        /// <returns></returns>
        public static bool IsActionFinishResonse(byte cmdWord)
        {
            return cmdWord == 0x09;
        }
        /// <summary>
        /// 是否是心跳包
        /// </summary>
        /// <param name="cmdWord"></param>
        /// <returns></returns>
        public static bool IsHeartBeat(byte cmdWord)
        {
            return cmdWord == 0x02;
        }
        public static bool IsLoginPkg(byte cmdWord)
        {
            return cmdWord == 0x10;
        }
        /// <summary>
        /// 料仓信息包
        /// </summary>
        /// <param name="cmdWord"></param>
        /// <returns></returns>
        public static bool IsStorePkg(byte cmdWord)
        {
            return cmdWord == 0x13;
        }
        public static bool IsRfidPkg(byte cmdWord)
        {
            return cmdWord == 0x14;
        }
        /// <summary>
        /// 是否是数据故障包
        /// </summary>
        /// <param name="cmdWord"></param>
        /// <returns></returns>
        public static bool IsFaultPkg(byte cmdWord)
        {
            return cmdWord == 0x04;
        }
        public static bool IsReadParamPkg(byte cmdWord)
        {
            return cmdWord == 0x05;
        }

        public static bool IsStatusPkg(byte cmdWord)
        {
            return cmdWord == 0x03;
        }
        /// <summary>
        /// 实时数据包
        /// </summary>
        /// <param name="cmdWord"></param>
        /// <returns></returns>
        public static bool IsRealTimePkg(byte cmdWord)
        {
            return cmdWord == 0x01;
        }
    }
}