Example #1
0
        /// <summary>
        /// 这个命令可以设定保留区为无保护下的可读可写、永远可读可写、带密码可读可
        /// 写、永远不可读不可写;可以分别设定EPC存储区、用户存储区为无保护下的可
        /// 写、永远可写、带密码可写、永远不可写;TID存储区是只读的,永远都不可写。
        /// EPC存储区、TID存储区和用户存储区是永远可读的。
        /// 标签的保留区一旦设置为永远可读写或永远不可读写,则以后不能再更改其读写
        /// 保护设定。标签的EPC存储区、TID存储区或用户存储区若是设置为永远可写或永
        /// 远不可写,则以后不能再更改其读写保护设定。如果强行发命令欲改变以上几种
        /// 状态,则电子标签将返回错误代码。
        /// 在把某个存储区设置为带密码可读写、带密码可写或把带密码锁状态设置为其它
        /// 非密码锁状态时,必须给出访问密码,所以,在进行此操作前,必须确保电子标
        /// 签已设置了访问密码。
        /// </summary>
        /// <param name="ENum">EPC号长度,以字为单位。EPC的长度在15个字以内,可以为0,否则返回参数错误信息。</param>
        /// <param name="EPC">要写入数据的标签的EPC号。长度由所给的EPC号决定,EPC号以字为单位,且必须是整数个长度。高字在前,每个字的高字节在前。这里要求给出的是完整的EPC号。</param>
        /// <param name="Select">一个字节。定义如下:
        ///     Select为0x00时,控制Kill密码读写保护设定。
        ///     Select为0x01时,控制访问密码读写保护设定。
        ///     Select为0x02时,控制EPC存储区读写保护设定。
        ///     Select为0x03时,控制TID存储区读写保护设定。
        ///     Select为0x04时,控制用户存储区读写保护设定。
        /// 其它值保留,若读写器接收到了其他值,将返回参数出错的消息,并且不执行命令。</param>
        /// <param name="SetProtect">SetProtect的值根据Select的值而确定。
        /// 当Select为0x00或0x01,即当设置Kill密码区或访问密码区的时候,SetProtect的值代表的意义如下:
        ///     0x00:设置为无保护下的可读可写
        ///     0x01:设置为永远可读可写
        ///     0x02:设置为带密码可读可写
        ///     0x03:设置为永远不可读不可写
        /// 当Select与SetProtect出现了其他值的时候,将返回参数出错的消息,并且不执行命令。</param>
        /// <param name="Pwd">4个字节的访问密码。32位的访问密码的最高位在Pwd的第一字节(从左往右)的最高位,访问密码最低位在Pwd第四字节的最低位,Pwd的前两个字节放置访问密码的高字。必须给出正确的访问密码。</param>
        /// <param name="MaskAdr">一个字节,掩模EPC号的起始字节地址。0x00表示从EPC号的最高字节开始掩模,0x01表示从EPC号的第二字节开始掩模,以此类推。</param>
        /// <param name="MaskLen">一个字节,掩模的字节数。掩模起始字节地址+掩模字节数不能大于EPC号字节长度,否则返回参数错误信息。</param>
        /// <returns></returns>
        public async Task <InfoBase> SetCardProtectAsync(byte ENum, byte[] EPC, ProtectArea Select,
                                                         byte SetProtect, byte[] Pwd, byte MaskAdr, byte MaskLen)
        {
            byte[] frame = CreateSetCardProtectFrame(ENum, EPC, Select, SetProtect, Pwd, MaskAdr, MaskLen);
            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);
        }
Example #2
0
        protected byte[] CreateSetCardProtectFrame(byte ENum, byte[] EPC, ProtectArea Select,
                                                   byte SetProtect, byte[] Pwd, byte MaskAdr, byte MaskLen)
        {
            byte      len   = (byte)(13 + ENum * 2);
            FrameBase frame = new FrameBase(len, Com_adr);

            byte[] db = frame.DataBlock;
            db[2] = I180006CCmd.SetCardProtect;
            db[3] = ENum;
            EPC.CopyTo(db, 4);
            int index = 4 + ENum * 2;

            db[index++] = (byte)Select;
            db[index++] = SetProtect;
            Pwd.CopyTo(db, index);
            index      += 4;
            db[index++] = MaskAdr;
            db[index]   = MaskLen;
            frame.PushCRC();
            return(db);
        }