大家都知道,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('您可能没有正确的安装身份证读卡器组件,或者浏览器设置不正确! 错误信息为:' + err.description + ' 有关设置的详细信息请参考帮助!'); }
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('无法读取照片信息:浏览器设置不正确! 错误信息为:' + err.description + ' 您需要将浏览器设置为 对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本 设置为启用 或者参考帮助!'); } WshShell.SendKeys(h.PhotoPath); WshShell.SendKeys("{TAB}"); //vUploadPath.src = h.PhotoPath; setTimeout(function(){__doPostBack('ctl00$ContentPlaceHolder1$lbUpload','');},0);