环境: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接口.
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
2
/// 与读写器连接类
3
/// arongbest
4
/// </summary>
5
public class OUR_MIFARE
6![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
7![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
引入动态库#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
#endregion
18![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
变量声明#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
#endregion
34![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
读卡并返回状态编号#region 读卡并返回状态编号
35![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
36
/// 读卡并返回状态编号
37
/// </summary>
38
/// <param name="area"></param>
39
/// <returns></returns>
40
public string Get_ReadIC_Status()
41![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
62![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
75![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
84
Useful_Station = System.Text.Encoding.Default.GetString(piccdata0_2_2);
85![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
86![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
byte[] array_Exception1 =
{ piccdata0_2_3[0]};
87![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
byte[] array_Exception2 =
{ piccdata0_2_3[1] };
88![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
byte[] array_Exception3 =
{ piccdata0_2_3[2] };
89![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
byte[] array_Exception4 =
{ piccdata0_2_3[3] };
90![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
byte[] array_Exception5 =
{ piccdata0_2_3[4] };
91![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
99
return status;
100
}
101![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
获取IC卡序列号#region 获取IC卡序列号
102![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
103
/// 获取IC卡的序列号
104
/// </summary>
105
/// <returns></returns>
106
public byte[] Get_ReadIC_Serial()
107![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
123
return serial;
124![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
125
}
126
#endregion
127![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
让读卡器发出声音#region 让读卡器发出声音
128![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
129
/// 让读写器发出声音
130
/// </summary>
131
public void Beep()
132![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
133
pcdbeep(50);
134
}
135
#endregion
136![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
137![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
写卡并返回状态编号#region 写卡并返回状态编号
138![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
139
/// 向IC卡中写入数据并返回状态编号
140
/// </summary>
141
/// <param name="area">扇区</param>
142
/// <returns></returns>
143
public string Get_WriteIC_Status()
144![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
153
serial = new byte[4];
154![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
183
piccdata0_2_2 = System.Text.Encoding.Default.GetBytes(Useful_Station);
184![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
185
byte[] array_CardPass = new byte[8];
186
array_CardPass = System.Text.Encoding.Default.GetBytes(Card_Pass);
187
188![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
201
Array.Copy(array_CardPass, 0, piccdata0_2_3, 16, array_CardPass.Length);
202![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
203
Beep();
204![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
210
return status;
211
}
212
#endregion
213
}