public byte[] CardSendCommand(byte[] cmd) { if (ShowLog != null) { ShowLog("------------------------------\r\n"); ApduCommand msg = new ApduCommand(cmd); if (msg.CmdNote.Trim().StartsWith("建立文件")) { CPUFileType cpy = (CPUFileType)(msg.Data[0]); msg.CmdNote += "类型" + cpy.ToString() + " "; } string log = $"发送原始命令:{BitConverter.ToString(cmd)} \r\n" + msg.ToString() + "\r\n"; ShowLog(log); } byte[] result = this.carder.SendCommand(cmd); if (ShowLog != null) { ApduMsg apduMsg = ApduMsgHelper.GetApduMsg(result); string msg = "状态:{0} 信息:{1} 结果:{2} \r\n"; msg = string.Format(msg, apduMsg.Status, apduMsg.Msg, BitConverter.ToString(apduMsg.ResponseData)); string log = "接收: " + msg; ShowLog(log); } return(result); }
public ApduMsg CreateDFFile(ushort fileID, int fileLenght, string FileAccess = "F0F0") { // 执行指令: 80E0 3F01 0D 38 0520 F0F0 95 FFFF 4444463031 //说明: 80E0 :指令类别和指令码; 3F01 :文件标识; 0D:长度; 38 :文件类型 //0520 :文件的空间大小; F0: 读权限; F0: 写权限; // 4444463031 :文件名 DDF01 也就是ASCII码了 //80-E0-00-01-09-38-00-64-F0-F0-95-FF-FF-31 //80,E0,3F,01,0D,38,05,20,F0,F0,95,FF,FF,44,44,46,30,31, //EF01 文件标识 //07 LC data 长度(07) //28 文件类型(二进制) //002A 文件长度 //F00E 读写权限 //FF 保留 //80 不支持线路保护 ApduCommand cmd = new ApduCommand(); cmd.CLA = 0x80; cmd.INS = 0xE0; cmd.SetP1P2(fileID); //构造一个data ,长度,权限, List <byte> data = new List <byte>(); //文件类型 data.Add((byte)CPUFileType.MFDF); //文件长度 data.AddRange(CPUCardHelper.IntConvertTo2Byte(fileLenght)); //data.Add(0x05); //data.Add(0x20); //添加读写权限 //data.AddRange(CPUCardHelper.ConverToBytes(FileAccess)); data.Add(0xF0); data.Add(0xF0); //应用文件ID data.Add(0x95); //保留字 data.Add(0xFF); data.Add(0xFF); //使用文件ID当文件夹名称 //data.AddRange(CPUCardHelper.IntConvertTo2Byte(fileID)); data.AddRange(GetDFNameByID(fileID)); //不支持线路保护 //data.Add(0x80); cmd.Data = data.ToArray(); ApduMsg msg = ApduMsg.GetApduByData(SendStrCommand(cmd)); if (msg.Code == "6A-86") { msg.Msg += "(文件已存在)"; } return(msg); }
/// <summary> /// 创建文件 /// </summary> /// <param name="fileIDHex">文件标识符2字节</param> /// <param name="fileType">枚举文件类型</param> /// <param name="fileLenght">文件长度</param> /// <param name="fileNameHex">文件名称,十六进制</param> /// <param name="FileAccess"></param> /// <returns></returns> public ApduMsg CreateFile(ushort fileID, CPUFileType fileType, int fileLenght, string FileAccess = "0000") { //Demo //80E0-EF01-07-28-002A-F00E-FF-80 //EF01 文件标识 //07 LC data 长度(07) //28 文件类型(二进制) //002A 文件长度 //F00E 读写权限 //FF 保留 //80 不支持线路保护 ApduCommand cmd = new ApduCommand(); cmd.CLA = 0x80; cmd.INS = 0xE0; cmd.SetP1P2(fileID); //构造一个data ,长度,权限, List <byte> data = new List <byte>(); //文件类型 data.Add((byte)fileType); //文件长度 data.AddRange(CPUCardHelper.IntConvertTo2Byte(fileLenght)); //添加读写权限 data.AddRange(CPUCardHelper.ConverToBytes(FileAccess)); //添加文件名 data.AddRange(CPUCardHelper.ConverToBytes("FFFF")); //不支持线路保护 data.Add(0x80); cmd.Data = data.ToArray(); ApduMsg msg = ApduMsg.GetApduByData(SendStrCommand(cmd)); if (msg.Code == "6A-86") { msg.Msg += "(文件已存在)"; } return(msg); }
/// <summary> /// 读余额 /// </summary> public ApduMsg GetBalance(bool IsWallet) { ApduCommand cmd = new ApduCommand(); cmd.CLA = 0x80; cmd.INS = 0x5C; //根据文档,01用于电子存折,02用于电子钱包 if (!IsWallet) { cmd.P2 = 0x01; } else { cmd.P2 = 0x02; } cmd.LE = 0x4; return(ApduMsg.GetApduByData(SendStrCommand(cmd))); }
/// <summary> /// 根据偏移量,写入数据到当前文件 /// </summary> /// <param name="index"></param> /// <param name="data"></param> /// <returns></returns> private ApduMsg WriteContent(ushort index, byte[] data) { //string fileLenghtHexStr = Convert.ToString(fileLenght, 16).PadLeft(4, '0'); //00D6-0000-02-0102 //0000 文件偏移量 //02 LC,data 长度 //0102数据 //FMCOS写文件说明,若P1点高三位为100,则低五位为短的二进制文件标识符。P2为欲写入的文件偏移量 //若P1点最高位不为1,则P1,P2为欲写入的文件偏移量,所写文件为当前文件 ApduCommand cmd = new ApduCommand(); cmd.CLA = 0x00; cmd.INS = 0xD6; cmd.SetP1P2(index); cmd.Data = data; //List<byte> array = new List<byte>(); //array.Add(0x00); //array.Add(0xD6); ////添加P1 P2参数为文件偏移量 //array.Add((byte)(index / 256)); //array.Add((byte)(index % 256)); ////添加LC,为数据长度 //array.Add((byte)data.Length); ////添加数据 //array.AddRange(data); //ApduMsg msg = ApduMsg.GetApduByData(carder.SendCommand(array.ToArray())); ApduMsg msg = ApduMsg.GetApduByData(SendStrCommand(cmd)); return(msg); }
/// <summary> /// 发送adpu 命令对象 /// </summary> /// <param name="apdu"></param> /// <returns></returns> public byte[] SendStrCommand(ApduCommand apdu) { return(CardSendCommand(apdu.ToArray())); }