以下资料摘自网络:
通用二代身份证阅读器接口
为了简化用户操作,很多用户都购买了二代身份证阅读器用于在预约挂号、入院登记、自助打印等需要使命登记的业务场合进行身份证信息快速录入,同时二代身份证阅读器也为使用单位避免法律风险、提高管理水平提供了一个现代化的工具。
为了满足用户需求,我们系统中也提供了相应的接口以读取二代身份证阅读器读到的信息,目前我们已经支持多种型号的二代身份证阅读器设备,如深圳华视CVR-100U、深圳华视CVR-100D、神思-V1、新中新KDQ-116D、国腾GTICR100、华旭HX-FDX9。
但是最近半年,很多二代身份证阅读器接口部件升级导致我们之前开发的设备接口不能正常使用,如提示“软件未授权”等错误。需要我们重新开发新接口。针对此问题,我在网上了解到一些于此相关的信息。早些年是有公_安部发放标准《身份证阅读器智能接口版SDK 使用手册》及SDK相关文件。主要包括
termb.h API函数原型定义
termb.lib API函数的VC开发包
termb.dll API函数的动态联接库
sdtapi.dll termb.dll需要的后台库(和termb.dll一起放在当前目录或系统目录下)
WltRS.dll termb.dll需要的后台库(和termb.dll一起放在当前目录或系统目录下)
公_安部提供的Termb.dll动态联接库 提供了七个方法以满足系统应用中的使用需求,SDK很少升级,而且每次升级都没有大的变化(我们目前使用的是 V1.2.0,我看到最新的是v1.3.0),我们之前开发的六个设备接口都是基于V1.2.0的SDK开发的,使用正常。但是最近有三种型号的设备因产品升级出现故障,不能正常使用,我们通过分析检查,发现写设备公司提供的SDK发生了较大的变化,termb.dll提供的方法与公_安部提供的termb.dll提供的方法出现差异,需要我们重新编写接口,为了避免重复编写接口,我们试图找到一种实现通用接口的方法,通过网上查找资料,已近对这三种设备的提供的SDK DLL文件进行分析,我们发现 WltRS.dll几年来未发生变化,主要是用于相片解码,sdtapi.dll发生变化较小,基本与公_安部提供的一致,发生变化较大的是termb.dll,termb.dll主要是对sdtapi.dll和WltRS.dll文件的方法进行封装。因此,我们可以考虑直接调用 sdtapi.dll 和 WltRS.dll 的方法进行解析。常用方法如下
1. SDT_OpenPort 打开端口
2. SDT_ClosePort 关闭端口
3. SDT_GetCOMBaud 获取波特率
4. SDT_SetCOMBaud 设置波特率
5. SDT_ResetSAM
6. SDT_SetMaxRFByte
7. SDT_GetSAMStatus
8. SDT_GetSAMID
9. SDT_GetSAMIDToStr
10. SDT_StartFindIDCard 开始寻卡
11. SDT_SelectIDCard 选卡
12. SDT_ReadMngInfo
13. SDT_ReadBaseMsg 读取身份证基本信息
14. SDT_ReadBaseMsgToFile 读取身份证基本信息到文件
15. GetBmp 获取照片
使用以上15个方法即可实现大多数设备通用的接口程序,有个别特殊的除外(如华视连sdtapi.dll 都已修改,这种情况只能开发新接口)。
那么,如何根据医生15个方法实现通用接口呢?
二代身份证阅读器接口的实现流程一般为:
打开端口->找卡->选卡->读卡(一般保存到文件)->解析->关闭端口
知道流程后就可以开始编码,此处不便贴出所有代码,只对需要特别注意的地方进行解释。
首先,第一步打开端口需要特别注意,串口和USB接口的身份证阅读器设备比较常见,而一般计算机最多包含16个USB接口和4个串口,打开端口时应该检查所有端口。
16个USB端口用 1001~1016 表示;4个串口用1~4表示;
我们可以循环对这20个端口进行检查
For iPort = 1001 To 1016
intReturn = SDT_OpenPort(iPort)
If intReturn = 1 Then
blnUsbPort = True
Exit For
End If
Next
If Not blnUsbPort Then
For iPort = 1 To 4
intReturn = SDT_OpenPort(iPort)
If intReturn = 1 Then
blnUsbPort = False
Exit For
End If
Next
End If
If intReturn <> 1 Then
MsgBox "端口打开失败,请检测相应的端口或者重新连接读卡器!", vbInformation
End If
第二步第三步,找卡、选卡这两部比较简单,只需要传入正确参数即可。相关方法SDT_StartFindIDCard和SDT_SelectIDCard。
第四步读卡,读卡分为两步,读取并解析基本信息和读取照片。读取基本信息即可以读入内存,也可以读入文件,然后在解析文件。读取照片可直接保存为BMP文件,但是,要想正确读取照片文件,必须需要机具厂商的授权文件termb.lic,并将该授权文件放在C盘根目录下。涉及方法有SDT_ReadBaseMsg、SDT_ReadBaseMsgToFile和GetBmp。
第五步关闭端口是不必像打开端口是循环调用,只需要调用一次即可,因为端口号已确定。
通过这五步即可实现普遍通用的二代身份证阅读器接口,目前测试过三种设备,华旭HX-FDX9、新中新、国腾GTICR100,该接口都能正确读取身份证的信息,但其通用性还需要新的设备继续测试验证,深圳华视那样的特例目前只发现一个,不知道会不会接二连三的出现