Пример #1
0
        public ReadMultipleBlockInfo(I15693BlockLen len, byte[] frame) : base(frame)
        {
            blockLen = (int)len;
            int dataLen = frame.Length - 5;

            Data = new byte[dataLen];
        }
Пример #2
0
 public ReadSingleBlockInfo(I15693BlockLen len, byte[] frame) : base(frame)
 {
     if (len == I15693BlockLen.Four)
     {
         BlockData = new byte[4];
     }
     else
     {
         BlockData = new byte[8];
     }
 }
Пример #3
0
        protected ReadMultipleBlockInfo HandleReadMultipleBlockFrame(I15693BlockLen blockLen, byte[] frame)
        {
            int dataLen = frame.Length - 5;
            ReadMultipleBlockInfo info       = new ReadMultipleBlockInfo(blockLen, frame);
            ReturnMessage         returnCode = CheckFrame(info);

            if (returnCode != ReturnMessage.Success)
            {
                info.ReturnValue = returnCode;
                return(info);
            }

            Array.Copy(frame, 3, info.Data, 0, dataLen);
            info.ReturnValue = ReturnMessage.Success;
            return(info);
        }
Пример #4
0
        /// <summary>
        /// 上位机发送该命令读取电子标签中指定块的数据(4或8个字节)和安全状态信息。
        /// 该命令可以在address mode和select mode下运行。
        /// </summary>
        /// <param name="blockLen">卡的数据块所占空间的字节数,4或8</param>
        /// <param name="blockNum">绝对块号</param>
        /// <returns></returns>
        public async Task <ReadSingleBlockInfo> ReadSingleBlockAsync(I15693BlockLen blockLen, byte blockNum)
        {
            byte[] frame = CreateReadSingleBlockFrame(blockLen, blockNum);
            CommunicationReturnInfo cri = await com.SendAsync(frame);

            if (cri.ReturnValue != ReturnMessage.Success)
            {
                ReadSingleBlockInfo ib = new ReadSingleBlockInfo();
                ib.SendByte         = frame;
                ib.ReturnValue      = cri.ReturnValue;
                ib.ExceptionMessage = cri.ExceptionMessage;
                return(ib);
            }
            ReadSingleBlockInfo info = HandleReadSingleBlockFrame(cri.RecvByte);

            info.SendByte = frame;
            return(info);
        }
Пример #5
0
        /// <summary>
        /// 上位机发送该命令读取电子标签中指定块的数据(4或8个字节)和安全状态信息。
        /// 该命令可以在address mode和select mode下运行。
        /// </summary>
        /// <param name="blockLen">卡的数据块所占空间的字节数,4或8</param>
        /// <param name="blockNum">绝对块号</param>
        /// <returns></returns>
        protected byte[] CreateReadSingleBlockFrame(I15693BlockLen blockLen, byte blockNum)
        {
            FrameBase frame = new FrameBase(0x06, Com_adr);

            byte[] db = frame.DataBlock;
            db[2] = I15693Cmd.ReadSingleBlock;
            if (blockLen == I15693BlockLen.Four) //块长度为 4 时
            {
                db[3] = 0x01;
            }
            else //块长度为 8 时
            {
                db[3] = 0x05;
            }
            db[4] = blockNum;
            frame.PushCRC();
            return(db);
        }
Пример #6
0
        /// <summary>
        /// 上位机发送该命令将给定数据(4或8个字节)写入电子标签的指定数据块中。。
        /// 上位机可指定的块的范围和每个块的大小会因电子标签的生产厂商的不同而有所差异。
        /// 此命令为写类型命令,不同厂商的电子标签的响应机制会有所不同,它们可分为A类和B类两大类。
        /// 该命令可以在address mode和select mode下运行。
        /// </summary>
        /// <param name="type">卡类型,A类或B类</param>
        /// <param name="blockLen">卡的数据块所占空间的字节数,4或8</param>
        /// <param name="blockNum">绝对块号</param>
        /// <param name="data">写入的数据</param>
        /// <returns></returns>
        public async Task <InfoBase> WriteSingleBlockAsync(I15693CardType type, I15693BlockLen blockLen,
                                                           byte blockNum, byte[] data)
        {
            byte[] frame = CreateWriteSingleBlockFrame(type, blockLen, blockNum, data);
            CommunicationReturnInfo cri = await com.SendAsync(frame);

            if (cri.ReturnValue != ReturnMessage.Success)
            {
                InfoBase ib = new InfoBase();
                ib.SendByte         = frame;
                ib.ReturnValue      = cri.ReturnValue;
                ib.ExceptionMessage = cri.ExceptionMessage;
                return(ib);
            }
            InfoBase info = HandleBaseFrame(cri.RecvByte);

            info.SendByte = frame;
            return(info);
        }
Пример #7
0
        /// <summary>
        /// 上位机发送该命令读取电子标签中指定块的数据(4或8个字节)和安全状态信息。
        /// 该命令可以在address mode和select mode下运行。
        /// </summary>
        /// <param name="blockLen">卡的数据块所占空间的字节数,4或8</param>
        /// <param name="uid">电子标签 UID,长度为 8 个字节</param>
        /// <param name="blockNum">绝对块号</param>
        /// <returns></returns>
        protected byte[] CreateReadSingleBlockFrame(I15693BlockLen blockLen, byte[] uid, byte blockNum)
        {
            FrameBase frame = new FrameBase(0x0E, Com_adr);

            byte[] db = frame.DataBlock;
            db[2] = I15693Cmd.ReadSingleBlock;
            if (blockLen == I15693BlockLen.Four) //块长度为 4 时
            {
                db[3] = 0x00;
            }
            else //块长度为 8 时
            {
                db[3] = 0x04;
            }
            uid.CopyTo(db, 4);
            db[12] = blockNum;
            frame.PushCRC();
            return(db);
        }
Пример #8
0
        /// <summary>
        /// 上位机发送该命令读取电子标签中多个指定块的数据(每个块4或8个字节)和安全状态信息。
        /// 当块的长度为4个字节时一次最多能读12个块,当块的长度为8个字节时一次最多能读6个块。
        /// 上位机可指定的块的范围和每个块的大小因电子标签的生产厂商的不同而有所差异。
        /// 该命令可以在address mode和select mode下运行。
        /// </summary>
        /// <param name="blockLen">卡的数据块所占空间的字节数,4或8</param>
        /// <param name="start">读取的开始块号</param>
        /// <param name="count">读取的块的个数</param>
        /// <returns></returns>
        protected byte[] CreateReadMultipleBlockFrame(I15693BlockLen blockLen,
                                                      byte start, byte count)
        {
            FrameBase frame = new FrameBase(0x07, Com_adr);

            byte[] db = frame.DataBlock;
            db[2] = I15693Cmd.ReadMultipleBlock;
            //压入 State
            if (blockLen == I15693BlockLen.Four) //块的字节数为4时的情况
            {
                db[3] = (byte)0x01;
            }
            else //为 B 类电子标签时
            {
                db[3] = (byte)0x05;
            }
            db[4] = start; //压入开始块号
            db[5] = count; //压入读取长度
            frame.PushCRC();
            return(db);
        }
Пример #9
0
        /// <summary>
        /// 上位机发送该命令将给定数据(4或8个字节)写入电子标签的指定数据块中。。
        /// 上位机可指定的块的范围和每个块的大小会因电子标签的生产厂商的不同而有所差异。
        /// 此命令为写类型命令,不同厂商的电子标签的响应机制会有所不同,它们可分为A类和B类两大类。
        /// 该命令可以在address mode和select mode下运行。
        /// </summary>
        /// <param name="type">卡类型,A类或B类</param>
        /// <param name="blockLen">卡的数据块所占空间的字节数,4或8</param>
        /// <param name="uid">电子标签 UID,长度为 8 个字节</param>
        /// <param name="blockNum">绝对块号</param>
        /// <param name="data">写入的数据</param>
        /// <returns></returns>
        protected byte[] CreateWriteSingleBlockFrame(I15693CardType type, I15693BlockLen blockLen,
                                                     byte[] uid, byte blockNum, byte[] data)
        {
            int len = (blockLen == I15693BlockLen.Four) ? 0x12 : 0x16;

            FrameBase frame = new FrameBase((byte)len, Com_adr);

            byte[] db = frame.DataBlock;
            db[2] = I15693Cmd.WriteSingleBlock;
            //压入 State
            if (blockLen == I15693BlockLen.Four)  //块长度为 4 时
            {
                if (type == I15693CardType.TypeA) //为 A 类电子标签时
                {
                    db[3] = (byte)0x00;
                }
                else //为 B 类电子标签时
                {
                    db[3] = (byte)0x08;
                }
            }
            else //块长度为 8 时
            {
                if (type == I15693CardType.TypeA) //为 A 类电子标签时
                {
                    db[3] = (byte)0x04;
                }
                else //为 B 类电子标签时
                {
                    db[3] = (byte)0x0C;
                }
            }
            //压入 UID
            uid.CopyTo(db, 4);
            db[12] = blockNum;   //压入块号
            data.CopyTo(db, 13); //压入要写入的数据
            frame.PushCRC();
            return(db);
        }