/// <summary> /// 上位机执行该命令锁定电子标签的数据保存格式识别码(DSFID=Data Storage Format IDentifier),DSFID一旦被锁定将不能再更改。 /// 此命令为写类型命令,不同厂商的电子标签的响应机制会有所不同,它们可分为A类和B类两大类。 /// 该命令可以在address mode和select mode下运行。 /// </summary> /// <param name="type">卡类型,A类或B类</param> /// <returns></returns> protected byte[] CreateLockDSFIDFrame(I15693CardType type) { FrameBase frame = new FrameBase(0x05, Com_adr); byte[] db = frame.DataBlock; db[2] = I15693Cmd.LockDSFID; //压入 State if (type == I15693CardType.TypeA) //为 A 类电子标签时 { db[3] = (byte)0x01; } else //为 B 类电子标签时 { db[3] = (byte)0x09; } frame.PushCRC(); return(db); }
/// <summary> /// 上位机执行该命令锁定电子标签的数据保存格式识别码(DSFID=Data Storage Format IDentifier),DSFID一旦被锁定将不能再更改。 /// 此命令为写类型命令,不同厂商的电子标签的响应机制会有所不同,它们可分为A类和B类两大类。 /// 该命令可以在address mode和select mode下运行。 /// </summary> /// <param name="type">卡类型,A类或B类</param> /// <returns></returns> public async Task <InfoBase> LockDSFIDAsync(I15693CardType type) { byte[] frame = CreateLockDSFIDFrame(type); 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); }
/// <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); }
/// <summary> /// 上位机执行该命令锁定电子标签的数据保存格式识别码(DSFID=Data Storage Format IDentifier),DSFID一旦被锁定将不能再更改。 /// 此命令为写类型命令,不同厂商的电子标签的响应机制会有所不同,它们可分为A类和B类两大类。 /// 该命令可以在address mode和select mode下运行。 /// </summary> /// <param name="type">卡类型,A类或B类</param> /// <param name="uid">电子标签 UID,长度为 8 个字节</param> /// <returns></returns> protected byte[] CreateLockDSFIDFrame(I15693CardType type, byte[] uid) { FrameBase frame = new FrameBase(0x0D, Com_adr); byte[] db = frame.DataBlock; db[2] = I15693Cmd.LockDSFID; //压入 State if (type == I15693CardType.TypeA) //为 A 类电子标签时 { db[3] = (byte)0x00; } else //为 B 类电子标签时 { db[3] = (byte)0x08; } uid.CopyTo(db, 4); frame.PushCRC(); return(db); }
/// <summary> /// 上位机执行该命令写入一个字节的数据到电子标签的应用类型识别码(AFI=Application Family Identifier)。 /// </summary> /// <param name="type">卡类型,A类或B类</param> /// <param name="afi">类型识别码(AFI=Application Family Identifier),长度为 1 个字节</param> /// <returns></returns> protected byte[] CreateWriteAFIFrame(I15693CardType type, byte afi) { FrameBase frame = new FrameBase(0x06, Com_adr); byte[] db = frame.DataBlock; db[2] = I15693Cmd.WriteAFI; //压入 State if (type == I15693CardType.TypeA) //为 A 类电子标签时 { db[3] = (byte)0x01; } else //为 B 类电子标签时 { db[3] = (byte)0x09; } db[4] = afi; frame.PushCRC(); return(db); }
/// <summary> /// 上位机执行该命令以锁定电子标签中指定的块。该块的内容将不能再被修改。 /// 此命令为写类型命令,不同厂商的电子标签的响应机制会有所不同,它们可分为A类和B类两大类。 /// 该命令可以在address mode和select mode下运行。 /// </summary> /// <param name="type">卡类型,A类或B类</param> /// <param name="blockNum">绝对块号</param> /// <returns></returns> protected byte[] CreateLockBlockFrame(I15693CardType type, byte blockNum) { FrameBase frame = new FrameBase(0x06, Com_adr); byte[] db = frame.DataBlock; db[2] = I15693Cmd.LockBlock; //压入 State if (type == I15693CardType.TypeA) //为 A 类电子标签时 { db[3] = (byte)0x01; } else //为 B 类电子标签时 { db[3] = (byte)0x09; } //压入 UID db[4] = blockNum; //压入块号 frame.PushCRC(); return(db); }
/// <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); }