环境:vs.net2005/USB口IC卡读写器/IC卡
IC卡内部存储结构分为16个扇区,0-15区,每个扇区有独立的密码和权限控制字,可作为独立的电子钱包,每个扇区有4个块,序号为第0块、第1块、第2块、第3块,每块16个字节,第3块是卡的密码和权限控制字专用块,禁止在此存放数据。第0块、第1块、第2块可随意存放数据。但第0区的第0块已被固化了IC卡出厂信息,此块只能读出信息,不可更改。
购买读写器时候厂商都会提供动态调用库的. 本文以RUK公司的OUR MIFARE.dll动态调用库为例.
该动态库必须和读写器一起使用。还必须将硬件底层驱动的动态库WY-ICUSB.DLL放在与OUR_MIFARE.dll同一个目录下,否则不能使用。另外在软件运行的过程当中可以随时更换USB接口.
1

/**//// <summary>2
/// 与读写器连接类3
/// arongbest4
/// </summary>5
public class OUR_MIFARE6

{7

引入动态库#region 引入动态库8
//读卡9
[DllImport("OUR_MIFARE.dll", EntryPoint = "piccreadex")]10
public static extern byte piccreadex(byte ctrlword, byte[] serial, byte area, byte keyA1B0, byte[] picckey, byte[] piccdata0_2);11
//写卡12
[DllImport("OUR_MIFARE.dll", EntryPoint = "piccwriteex")]13
public static extern byte piccwriteex(byte ctrlword, byte[] serial, byte area, byte keyA1B0, byte[] picckey, byte[] piccdata0_2);14
//发出声音15
[DllImport("OUR_MIFARE.dll", EntryPoint = "pcdbeep")]16
public static extern byte pcdbeep(ushort mm);17
#endregion18

19

变量声明#region 变量声明20
const byte BLOCK0_EN = 0x01;21
const byte BLOCK1_EN = 0x02;22
const byte BLOCK2_EN = 0x04;23
const byte EXTERNKEY = 0x10;24
//const byte NEEDSERIAL = 0x08;25
//const byte NEEDHALT = 0x20;26
//byte area =1;//区号27
byte keyA1B0 = 1;//密码类型 大于0表示用A密码认证28
byte ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;//控制字29
byte[] picckey; //密码30
byte[] serial;//卡序列号31
//byte[] piccdata0_2; //卡数据缓冲32
string status=""; //返回状态33
#endregion34

读卡并返回状态编号#region 读卡并返回状态编号35

/**//// <summary>36
/// 读卡并返回状态编号37
/// </summary>38
/// <param name="area"></param>39
/// <returns></returns>40
public string Get_ReadIC_Status()41

{ 42
picckey = new byte[6];43
picckey[0] = 0xFF;44
picckey[1] = 0xFF;45
picckey[2] = 0xFF;46
picckey[3] = 0xFF;47
picckey[4] = 0xFF;48
picckey[5] = 0xFF;49

50
byte[] piccdata0_2, piccdata0_2_1, piccdata0_2_2, piccdata0_2_3;51
serial = new byte[4];52
piccdata0_2 = new byte[48]; //存1区数据53
piccdata0_2_1 = new byte[48]; //存2区数据54
piccdata0_2_2 = new byte[48]; //存3区数据55
piccdata0_2_3 = new byte[48]; //存5区数据56
Beep();57
status = piccreadex(ctrlword, serial,(byte)1, keyA1B0, picckey, piccdata0_2).ToString();58
piccreadex(ctrlword, serial, (byte)2, keyA1B0, picckey, piccdata0_2_1).ToString();59
piccreadex(ctrlword, serial, (byte)3, keyA1B0, picckey, piccdata0_2_2).ToString();60
piccreadex(ctrlword, serial, (byte)5, keyA1B0, picckey, piccdata0_2_3).ToString();61

62

byte[] array_CardNo =
{ piccdata0_2[0], piccdata0_2[1], piccdata0_2[2], piccdata0_2[3], piccdata0_2[4], piccdata0_2[5], piccdata0_2[6], piccdata0_2[7] };63
Card_No = System.Text.Encoding.Default.GetString(array_CardNo);64

byte[] array_CardType =
{ piccdata0_2[8], piccdata0_2[9], piccdata0_2[10], piccdata0_2[11], piccdata0_2[12], piccdata0_2[13], piccdata0_2[14], piccdata0_2[15], piccdata0_2[16], piccdata0_2[17]};65
Card_Type = System.Text.Encoding.Default.GetString(array_CardType);66

byte[] array_CardStatus =
{ piccdata0_2[18], piccdata0_2[19], piccdata0_2[20], piccdata0_2[21] };67
Card_Status = System.Text.Encoding.Default.GetString(array_CardStatus);68

byte[] array_BeginDate =
{ piccdata0_2[22], piccdata0_2[23], piccdata0_2[24], piccdata0_2[25], piccdata0_2[26], piccdata0_2[27], piccdata0_2[28], piccdata0_2[29], piccdata0_2[30], piccdata0_2[31]};69
Begin_Date = System.Text.Encoding.Default.GetString(array_BeginDate);70

byte[] array_EndDate =
{ piccdata0_2[32], piccdata0_2[33], piccdata0_2[34], piccdata0_2[35], piccdata0_2[36], piccdata0_2[37], piccdata0_2[38], piccdata0_2[39], piccdata0_2[40], piccdata0_2[41] };71
End_Date = System.Text.Encoding.Default.GetString(array_EndDate);72

byte[] array_Money =
{ piccdata0_2[42], piccdata0_2[43], piccdata0_2[44], piccdata0_2[45], piccdata0_2[46], piccdata0_2[47]};73
Money = System.Text.Encoding.Default.GetString(array_Money);74

75

byte[] array_TicketFlag =
{ piccdata0_2_1[0], piccdata0_2_1[1], piccdata0_2_1[2], piccdata0_2_1[3], piccdata0_2_1[4], piccdata0_2_1[5], piccdata0_2_1[6], piccdata0_2_1[7], piccdata0_2_1[8], piccdata0_2_1[9], piccdata0_2_1[10], piccdata0_2_1[11] };76
Ticket_Flag = System.Text.Encoding.Default.GetString(array_TicketFlag);77

byte[] array_EnterFlag =
{ piccdata0_2_1[12], piccdata0_2_1[13], piccdata0_2_1[14], piccdata0_2_1[15], piccdata0_2_1[16], piccdata0_2_1[17] };78
Enter_Flag = System.Text.Encoding.Default.GetString(array_EnterFlag);79

byte[] array_EnterStation =
{ piccdata0_2_1[18], piccdata0_2_1[19], piccdata0_2_1[20], piccdata0_2_1[21], piccdata0_2_1[22], piccdata0_2_1[23], piccdata0_2_1[24], piccdata0_2_1[25], piccdata0_2_1[26], piccdata0_2_1[27] };80
Enter_Station = System.Text.Encoding.Default.GetString(array_EnterStation);81

byte[] array_EnterDate =
{ piccdata0_2_1[28], piccdata0_2_1[29], piccdata0_2_1[30], piccdata0_2_1[31], piccdata0_2_1[32], piccdata0_2_1[33], piccdata0_2_1[34], piccdata0_2_1[35], piccdata0_2_1[36], piccdata0_2_1[37], piccdata0_2_1[38], piccdata0_2_1[39], piccdata0_2_1[40], piccdata0_2_1[41], piccdata0_2_1[42], piccdata0_2_1[43], piccdata0_2_1[44], piccdata0_2_1[45], piccdata0_2_1[46], piccdata0_2_1[47]};82
Enter_Date = System.Text.Encoding.Default.GetString(array_EnterDate);83

84
Useful_Station = System.Text.Encoding.Default.GetString(piccdata0_2_2);85

86

byte[] array_Exception1 =
{ piccdata0_2_3[0]};87

byte[] array_Exception2 =
{ piccdata0_2_3[1] };88

byte[] array_Exception3 =
{ piccdata0_2_3[2] };89

byte[] array_Exception4 =
{ piccdata0_2_3[3] };90

byte[] array_Exception5 =
{ piccdata0_2_3[4] };91

byte[] array_Exception6 =
{ piccdata0_2_3[5] };92
Exception1 = System.Text.Encoding.Default.GetString(array_Exception1);93
Exception2 = System.Text.Encoding.Default.GetString(array_Exception2);94
Exception3 = System.Text.Encoding.Default.GetString(array_Exception3);95
Exception4 = System.Text.Encoding.Default.GetString(array_Exception4);96
Exception5 = System.Text.Encoding.Default.GetString(array_Exception5);97
Exception6 = System.Text.Encoding.Default.GetString(array_Exception6);98

99
return status;100
}101

获取IC卡序列号#region 获取IC卡序列号102

/**//// <summary>103
/// 获取IC卡的序列号104
/// </summary>105
/// <returns></returns>106
public byte[] Get_ReadIC_Serial()107

{108
byte area = 1;109
picckey = new byte[6];110
picckey[0] = 0xFF;111
picckey[1] = 0xFF;112
picckey[2] = 0xFF;113
picckey[3] = 0xFF;114
picckey[4] = 0xFF;115
picckey[5] = 0xFF;116

117
byte[] piccdata0_2;118
serial = new byte[4];119
piccdata0_2 = new byte[48];120
//Beep();121
piccreadex(ctrlword, serial, area, keyA1B0, picckey, piccdata0_2).ToString();122

123
return serial;124

125
}126
#endregion127

让读卡器发出声音#region 让读卡器发出声音128

/**//// <summary>129
/// 让读写器发出声音130
/// </summary>131
public void Beep()132

{133
pcdbeep(50);134
}135
#endregion136

137

写卡并返回状态编号#region 写卡并返回状态编号138

/**//// <summary>139
/// 向IC卡中写入数据并返回状态编号140
/// </summary>141
/// <param name="area">扇区</param>142
/// <returns></returns>143
public string Get_WriteIC_Status()144

{145
picckey = new byte[6];146
picckey[0] = 0xFF;147
picckey[1] = 0xFF;148
picckey[2] = 0xFF;149
picckey[3] = 0xFF;150
picckey[4] = 0xFF;151
picckey[5] = 0xFF;152

153
serial = new byte[4];154

155
byte[] piccdata0_2, piccdata0_2_1, piccdata0_2_2,piccdata0_2_3;156
piccdata0_2 = new byte[48];157
piccdata0_2_1 = new byte[48];158
piccdata0_2_2 = new byte[48];159
piccdata0_2_3 = new byte[48];160

161
byte[] array_CardNo=new byte[8];162
array_CardNo = System.Text.Encoding.Default.GetBytes(Card_No);163
byte[] array_CardType = new byte[10];164
array_CardType=System.Text.Encoding.Default.GetBytes(Card_Type);165
byte[] array_CardStatus = new byte[4];166
array_CardStatus=System.Text.Encoding.Default.GetBytes(Card_Status);167
byte[] array_BeginDate = new byte[10];168
array_BeginDate = System.Text.Encoding.Default.GetBytes(Begin_Date);169
byte[] array_EndDate = new byte[10];170
array_EndDate = System.Text.Encoding.Default.GetBytes(End_Date);171
byte[] array_Money = new byte[6];172
array_Money=System.Text.Encoding.Default.GetBytes(Money);173

174
byte[] array_TicketFlag=new byte[12];175
array_TicketFlag = System.Text.Encoding.Default.GetBytes(Ticket_Flag);176
byte[] array_EnterFlag = new byte[6];177
array_EnterFlag=System.Text.Encoding.Default.GetBytes(Enter_Flag);178
byte[] array_EnterStation = new byte[10];179
array_EnterStation=System.Text.Encoding.Default.GetBytes(Enter_Station);180
byte[] array_EnterDate = new byte[20];181
array_EnterDate=System.Text.Encoding.Default.GetBytes(Enter_Date);182

183
piccdata0_2_2 = System.Text.Encoding.Default.GetBytes(Useful_Station);184

185
byte[] array_CardPass = new byte[8];186
array_CardPass = System.Text.Encoding.Default.GetBytes(Card_Pass);187
188

189
Array.Copy(array_CardNo,0, piccdata0_2,0,array_CardNo.Length);190
Array.Copy(array_CardType,0,piccdata0_2,8,array_CardType.Length);191
Array.Copy(array_CardStatus,0, piccdata0_2,18,array_CardStatus.Length);192
Array.Copy(array_BeginDate,0,piccdata0_2,22, array_BeginDate.Length);193
Array.Copy(array_EndDate,0,piccdata0_2,32, array_EndDate.Length);194
Array.Copy(array_Money,0,piccdata0_2,42,array_Money.Length);195

196
Array.Copy(array_TicketFlag, 0, piccdata0_2_1, 0, array_TicketFlag.Length);197
Array.Copy(array_EnterFlag, 0, piccdata0_2_1,12,array_EnterFlag.Length);198
Array.Copy(array_EnterStation, 0, piccdata0_2_1,18,array_EnterStation.Length);199
Array.Copy(array_EnterDate, 0, piccdata0_2_1,28,array_EnterDate.Length);200

201
Array.Copy(array_CardPass, 0, piccdata0_2_3, 16, array_CardPass.Length);202

203
Beep();204

205
status = piccwriteex(ctrlword, serial,(byte)1, keyA1B0, picckey, piccdata0_2).ToString();206
piccwriteex(ctrlword, serial,(byte)2, keyA1B0, picckey, piccdata0_2_1);207
piccwriteex(ctrlword, serial,(byte)3, keyA1B0, picckey, piccdata0_2_2);208
piccwriteex(ctrlword, serial,(byte)0, keyA1B0, picckey, piccdata0_2_3);209

210
return status;211
}212
#endregion213
}
浙公网安备 33010602011771号