C如何读取IC卡IC卡的操作代码.docx
- 文档编号:27707815
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:13
- 大小:18.66KB
C如何读取IC卡IC卡的操作代码.docx
《C如何读取IC卡IC卡的操作代码.docx》由会员分享,可在线阅读,更多相关《C如何读取IC卡IC卡的操作代码.docx(13页珍藏版)》请在冰豆网上搜索。
C如何读取IC卡IC卡的操作代码
C#程序开发范例_IC卡读写
C#程序开发范例宝典13.3 IC卡应用
2007-9-716:
37:
00
图书导读当前章节:
13.3 IC卡应用·1.14 其他技术·13.1 串口控制·13.2 加密狗·13.4 监控·13.5 语音卡控制·13.6 手机程序开发加拿大·达内专注高端it培训名企定向委培
为纳斯达克上市公司定向委培高级软件工程师国内最强大专家团队组合授课,确保高薪就业
管理不可能管理的项目!
要减少失败的风险组织必须转向IT开发的治理模型
如何开发智能客户端应用
离线应用模块的合理利用
13.3 IC卡应用
IC(IntegratedCircuit)卡,也被称作智能卡(SmartCard),具有写入数据和存储数据的功能,IC卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。
由于其内部具有集成电路,不但可以存储大量信息,具有极强的保密性能,并且还具有抗干扰、无磨损、寿命长等特性。
因此在各个领域中得到广泛应用。
下面通过两个实例介绍IC卡的简单应用。
实例422 向IC卡中写入数据
实例说明
IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。
下面介绍如何向IC卡中写入数据。
运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。
如图13.6所示。
技术要点
本例使用的是深圳明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。
本例通过调用Mwic_32.dll链接库,进行IC卡的读写工作。
下面介绍与IC卡写操作相关的几个函数。
(1)auto_init函数
该函数用于初始化IC卡读卡器。
语法如下:
publicstaticexternintauto_init(intport,intbaud);
参数说明如下。
l port:
标识端口号,Com1对应的端口号为0;Com2对应的端口号为1,依此类推。
l baud:
标识波特率。
l 返回值:
如果初始化成功,返回值是IC卡设备句柄;如果初始化失败,返回值小于零。
(2)setsc_md函数
该函数用于设置设备密码模式。
语法如下:
publicstaticexternintsetsc_md(inticdev,intmode);
参数说明如下。
l icdev:
标识设备句柄,通常是auto_init函数的返回值。
l mode:
标识设备密码模式,如果为0,设备密码有效,设备在加电时必须验证设备密码才能对设备进行操作。
如果为1,设备密码无效。
l 返回值:
如果函数执行成功返回值为零,否则小于零。
(3)get_status函数
该函数用于获取设备的当前状态。
语法如下:
publicstaticexternInt16get_status(inticdev,Int16*state);
参数说明如下。
l icdev:
标识设备句柄,通常是auto_init函数的返回值。
l state:
用于接收函数返回的结果。
如果为0表示读卡器中无卡,为1表示读卡器中有卡。
l 返回值:
如果函数执行成功返回值为零,否则小于零。
(4)csc_4442函数
该函数用于核对IC卡密码。
语法如下:
publicstaticexternInt16Csc_4442(inticdev,intlen,[MarshalAs(UnmanagedType.LPArray)]byte[]p_string);
参数说明如下。
l icdev:
标识设备句柄,通常是auto_init函数的返回值。
l len:
标识密码长度,其值为3。
l p_string:
标识设置的密码。
l 返回值:
如果函数执行成功返回值为零,否则小于零。
(5)swr_4442函数
该函数用于向IC卡中写入数据。
语法如下:
publicstaticexternintswr_4442(inticdev,intoffset,intlen,char*w_string);
参数说明如下。
l icdev:
标识设备句柄,通常是auto_init函数的返回值。
l offset:
标识地址的偏移量,范围是0~255。
l len:
标识字符串长度。
l w_string:
标识写入的数据。
(6)ic_exit函数
该函数用于关闭设备端口。
语法如下:
publicstaticexternintic_exit(inticdev);
参数说明如下。
l icdev:
标识设备句柄,通常是auto_init函数的返回值。
(7)dv_beep函数
该函数使读卡器嗡鸣。
语法如下:
publicstaticexternintdv_beep(inticdev,inttime);
参数说明如下。
l icdev:
标识设备句柄,通常是auto_init函数的返回值。
l time:
标识嗡鸣持续的时间,单位是10毫秒。
实现过程
(1)新建一个项目,命名为Ex13_05,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,用于执行向卡中写入数据和退出程序的操作,添加一个TextBox控件,将TextBox中数据写入IC卡中。
(3)主要程序代码。
将程序所使用的操作IC卡的函数,封装在类IC中。
代码如下:
[StructLayout(LayoutKind.Sequential)]
publicunsafeclassIC
{
//对设备进行初始化
[DllImport("Mwic_32.dll",EntryPoint="auto_init",SetLastError=true,CharSet=CharSet.Ansi,ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]
publicstaticexternintauto_init(intport,intbaud);
//设备密码格式
[DllImport("Mwic_32.dll",EntryPoint="setsc_md",SetLastError=true,CharSet=CharSet.Ansi,ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]
publicstaticexternintsetsc_md(inticdev,intmode);
//获取设备当前状态
[DllImport("Mwic_32.dll",EntryPoint="get_status",SetLastError=true,CharSet=CharSet.Ansi,ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]
publicstaticexternInt16get_status(inticdev,Int16*state);
//关闭设备通讯接口
[DllImport("Mwic_32.dll",EntryPoint="ic_exit",SetLastError=true,CharSet=CharSet.Ansi,ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]
publicstaticexternintic_exit(inticdev);
//使设备发出蜂鸣声
[DllImport("Mwic_32.dll",EntryPoint="dv_beep",SetLastError=true,CharSet=CharSet.Ansi,ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]
publicstaticexternintdv_beep(inticdev,inttime);
//向IC卡中写数据
[DllImport("Mwic_32.dll",EntryPoint="swr_4442",SetLastError=true,CharSet=CharSet.Ansi,ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]
publicstaticexternintswr_4442(inticdev,intoffset,intlen,char*w_string);
//核对卡密码
[DllImport("Mwic_32.dll",EntryPoint="csc_4442",SetLastError=true,CharSet=CharSet.Auto,ExactSpelling=true,CallingConvention=CallingConvention.Winapi)]
publicstaticexternInt16Csc_4442(inticdev,intlen,[MarshalAs(UnmanagedType.LPArray)]byte[]p_string);
}
下面代码主要用于将TextBox中数据写入到IC卡中。
代码如下:
privatevoidbutton1_Click(objectsender,EventArgse)
{
//初始化
inticdev=IC.auto_init(0,9600);
if(icdev<0)
MessageBox.Show("端口初始化失败,请检查接口线是否连接正确。
","错误提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
intmd=IC.setsc_md(icdev,1);//设备密码格式
unsafe
{
Int16status=0;
Int16result=0;
result=IC.get_status(icdev,&status);
if(result!
=0)
{
MessageBox.Show("设备当前状态错误!
");
intd1=IC.ic_exit(icdev); //关闭设备
return;
}
if(status!
=1)
{
MessageBox.Show("请插入IC卡");
intd2=IC.ic_exit(icdev); //关闭设备
return;
}
}
unsafe
{
//卡的密码默认为6个f(密码为:
ffffff),1个f的16进制是15,两个f的16进制是255
byte[]pwd=newbyte[3]{255,255,255};
//byte[]pwd=newbyte[3]{0xff,0xff,0xff};
//char[]pass=newch{0xff,0xff,0xff};
Int16checkIC_pwd=IC.Csc_4442(icdev,3,pwd);
if(checkIC_pwd<0)
{
MessageBox.Show("IC卡密码错误!
");
return;
}
charstr='a';
intwrite=-1;
for(intj=0;j<;j++)
{
str=Convert.ToChar(,1));
write=IC.swr_4442(icdev,33+j,,&str);
}
if(write==0)
{
intbeep=IC.dv_beep(icdev,20); //发出蜂鸣声
MessageBox.Show("数据已成功写入IC卡中!
");
}
else
MessageBox.Show("数据写入IC卡失败!
");
}
intd=IC.ic_exit(icdev); //关闭设备
}
举一反三
根据本实例,读者可以实现以下功能。
在图书借阅中使用IC卡。
利用IC卡控制上网。
实例423 读取IC卡中的数据
实例说明
向IC卡写入数据后,就可以进行读卡操作了。
运行本例,将写入数据的IC卡插入读卡器,单击【读卡】按钮,IC卡中的数据将显示在文本框中。
如图13.7所示。
技术要点
本例中主要调用srd_4442函数读取IC卡中的数据,相关函数介绍请参考实例“向IC卡中写入数据”中的“技术要点”部分。
这里只介绍读卡函数。
q srd_4442函数
该函数用于读取IC卡中的数据。
语法如下:
publicstaticexternintsrd_4442(inticdev,intoffset,intlen,char*r_string);
参数说明如下。
l icdev:
标识设备句柄,通常是auto_init函数的返回值。
l offset:
标识地址的偏移量,范围是0~255。
l len:
标识字符串长度。
l r_string:
用于存储返回的数据。
实现过程
(1)新建一个项目,命名为Ex13_06,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,用于读取卡中的数据和退出程序,添加一个TextBox控件,显示卡中的数据。
(3)主要程序代码。
privatevoidbutton1_Click(objectsender,EventArgse)
{
//初始化
inticdev=IC.auto_init(0,9600);
if(icdev<0)
MessageBox.Show("端口初始化失败,请检查接口线是否连接正确。
","错误提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
intmd=IC.setsc_md(icdev,1);//设备密码格式
inti=IC.dv_beep(icdev,10); //发出蜂鸣声
unsafe
{
Int16status=0;
Int16result=0;
result=IC.get_status(icdev,&status);
if(result!
=0)
{
MessageBox.Show("设备当前状态错误!
");
intd1=IC.ic_exit(icdev); //关闭设备
return;
}
if(status!
=1)
{
MessageBox.Show("请插入IC卡");
intd2=IC.ic_exit(icdev); //关闭设备
return;
}
}
unsafe
{
charstr='a';
intread=-1;
for(intj=0;j<6;j++)
{
read=IC.srd_4442(icdev,33+j,1,&str);
textBox1.Text=textBox1.Text+Convert.ToString(str);
}
if(read==0)
MessageBox.Show("IC卡中数据读取成功!
");
}
intd=IC.ic_exit(icdev); //关闭设备
}
举一反三
根据本实例,读者可以开发以下程序。
读取IC卡电话系统。
公交车刷卡系统。
实例424 利用IC卡制作考勤程序
实例说明
IC卡广泛应用于各行业,包括银行卡、公交车刷卡系统、读书卡等。
下面介绍使用IC卡制作简单的公司考勤系统。
运行本例,单击【刷卡】按钮,即可对员工进行考勤。
实现效果如图13.8所示。
技术要点
有关IC卡的操作函数请参考实例“向IC卡中写入数据”和“读取IC卡中的数据”中的“技术要点”部分。
下面主要介绍通过IC卡如何实现员工考勤。
主要将写入IC卡中的卡号读取出来,然后从数据表中查询员工信息。
具体代码请参考实现过程。
实现过程
(1)新建一个项目,命名为Ex13_07,默认窗体为Form1。
(2)在Form1窗体中,主要添加5个TextBox控件和6个Label控件,用途如图13.7所示,添加一个Button控件,执行刷IC卡命令。
(3)主要程序代码。
privatevoidbutton1_Click(objectsender,EventArgse)
{
//初始化
inticdev=IC.auto_init(0,9600);
if(icdev<0)
label6.Text="端口初始化失败,请检查接口线是否连接正确。
";
unsafe
{
Int16status=-1;
Int16result=IC.get_status(icdev,&status);
intmd=IC.setsc_md(icdev,1); //设备密码格式
if(result<0)
{
intd1=IC.ic_exit(icdev); //关闭设备
return;
}
elseif((result==0)&&(status==0))
{
intd2=IC.ic_exit(icdev); //关闭设备
label6.Text="请插入IC卡";
return;
}
}
unsafe
{
charstr='a';
intread=-1;
stringic="";
for(intj=0;j<6;j++)
{
read=IC.srd_4442(icdev,33+j,1,&str);
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 读取 IC 操作 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)