大家都知道,Asp.net是在服务器端执行的程序,无法直接与客户端的设备进行通信,但是客户提出了能否直接在网页上调用二代身份证读卡器。
一、解决思路
经过我们的分析,理论上是完全可行的。下面描述一下这个问题的解决思路。
1.编写一个AcitiveX控件,通过该控件就可以连接到身份证读卡器,并且读取卡上面的内容。
2.利用javascript调用Activex的方法,将身份证上面的信息读取出来,并且填充到页面上的文本输入框。
3.利用javascript将身份证照片文件也上传到服务器上 。
二、开发环境
1.我们采用的是国腾二代身份证读卡器,其他的读卡器也类似,都提供了SDK义工调用
2.采用VS2005作为开发工具
三、详细步骤
1、开发读取身份证读卡器的ActiveX控件:由于我本身对于C++不是特别熟,所以开发的ActiveX控件采用了熟悉的C#语言,采用C#语言的缺点是客户端必须要安装.net framework2.0。
该控件的实现就是调用读卡器的SDK,读取身份证上面的文本信息(如身份证号/性别/出生日期/发证机关/身份证地址等),同时还可以读取照片信息。由于我们所采用的设备直接将这些信息生出到c盘根目录,所以我用程序直接读取这些文件来实现。
有关如何利用C#开发ActiveX控件,请参考这下面的文章:
http://www.cnblogs.com/homer/archive/2005/01/04/86473.html
2、如何编写JavaScript代码
在JavaScript中,如何初始化ActiveX控件并且调用ActiveX控件的方法。
a.初始化控件调用
var hello;
try{
hello = new ActiveXObject("Train.Reg.Demo");
}catch(err){
alert('您可能没有正确的安装身份证读卡器组件,或者浏览器设置不正确!\n\n错误信息为:' + err.description + '\n\n有关设置的详细信息请参考帮助!');
}
var h = hello.TestCall();
if(h==null) return false;
var vIdCardNo = document.getElementById('<%=txtIdCardNo.ClientID %>');
vIdCardNo.value = h.IdCardNo;
var vName = document.getElementById('<%=txtFullName.ClientID %>');
vName.value = h.Name;
var aAddress = document.getElementById('<%=txtAddress.ClientID %>');
aAddress.value = h.Address;
var vSex = document.getElementById('<%=ddlSex.ClientID %>');
vSex.value = h.Sex;
c.利用VS2005中的fileUpload组件,上传图片的方法
var vUploadPath = document.getElementById('<%=FileUpload1.ClientID %>');
vUploadPath.focus();
var WshShell;
try{
WshShell = new ActiveXObject("WScript.Shell");
} catch(err){
alert('无法读取照片信息:浏览器设置不正确!\n\n错误信息为:' + err.description + '\n\n您需要将浏览器设置为 对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本 设置为启用\n\n或者参考帮助!');
}
WshShell.SendKeys(h.PhotoPath);
WshShell.SendKeys("{TAB}");
//vUploadPath.src = h.PhotoPath;
setTimeout(function(){__doPostBack('ctl00$ContentPlaceHolder1$lbUpload','');},0);