Foxtable(狐表)用户栏目专家坐堂 → 关于二代身份证读卡器的应用问题?


  共有16472人关注过本帖树形打印复制链接

主题:关于二代身份证读卡器的应用问题?

帅哥哟,离线,有人找我吗?
擎天柱
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:542 积分:4243 威望:0 精华:4 注册:2008/9/1 8:27:00
  发帖心情 Post By:2011/10/11 9:16:00 [只看该作者]

我用的是华旭金卡,谁有华旭的?麻烦共享一下,谢谢!

华旭官方的开发包是加密打包的,打不开。

另外网上有通用开发包开发的样板,可惜我不会用。

如果foxtable能够引用应用这些通用开发包,那又是一大市场啊!


 回到顶部
帅哥哟,离线,有人找我吗?
擎天柱
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:542 积分:4243 威望:0 精华:4 注册:2008/9/1 8:27:00
  发帖心情 Post By:2011/10/11 9:21:00 [只看该作者]

广东省在搞人口申报,要求工厂、出租屋安装,参考如下链接

http://kf.gydz.cn/

 


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/10/11 9:29:00 [只看该作者]

全局代码:
 

Public Declare Function CVR_InitComm Lib "termb.dll" Alias "CVR_InitComm" (ByVal Port As Integer) As Integer
Public Declare Function CVR_Authenticate Lib "termb.dll" Alias "CVR_Authenticate" () As Integer
Public Declare Function CVR_Read_Content Lib "termb.dll" Alias "CVR_Read_Content" (ByVal Active As Integer) As Integer
Public Declare Function CVR_CloseComm Lib "termb.dll" Alias "CVR_CloseComm" () As Integer
Public Declare Function GetPeopleName Lib "termb.dll" Alias "GetPeopleName" (ByRef strTmp As Byte, ByRef strLen As Integer) As Integer
Public Declare Function GetPeopleNation Lib "termb.dll" Alias "GetPeopleNation" (ByRef strTmp As Byte, ByRef strLen As Integer) As Integer
Public Declare Function GetPeopleBirthday Lib "termb.dll" Alias "GetPeopleBirthday" (ByRef strTmp As Byte, ByRef strLen As Integer) As Integer
Public Declare Function GetPeopleAddress Lib "termb.dll" Alias "GetPeopleAddress" (ByRef strTmp As Byte, ByRef strLen As Integer) As Integer
Public Declare Function GetPeopleIDCode Lib "termb.dll" Alias "GetPeopleIDCode" (ByRef strTmp As Byte, ByRef strLen As Integer) As Integer
Public Declare Function GetDepartment Lib "termb.dll" Alias "GetDepartment" (ByRef strTmp As Byte, ByRef strLen As Integer) As Integer
Public Declare Function GetStartDate Lib "termb.dll" Alias "GetStartDate" (ByRef strTmp As Byte, ByRef strLen As Integer) As Integer
Public Declare Function GetEndDate Lib "termb.dll" Alias "GetEndDate" (ByRef strTmp As Byte, ByRef strLen As Integer) As Integer
Public Declare Function GetPeopleSex Lib "termb.dll" Alias "GetPeopleSex" (ByRef strTmp As Byte, ByRef strLen As Integer) As Integer

 Public name As StringBuilder
 Public sex As String
 Public people As String
 Public birthday As String
 Public address As String
 Public number As String
 Public signdate As String
 Public validtermOfStart As String
 Public validtermOfEnd As String
 
 
         <StructLayout(LayoutKind.Sequential, Size:=16, CharSet:=CharSet.Ansi)>  _
         Public Structure IDCARD_ALL
             <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)>  _
             Public name As Char
             <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=3)>  _
             Public sex As Char
             <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)>  _
             Public people As Char
             <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=16)>  _
             Public birthday As Char
             <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=70)>  _
             Public address As Char
             <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=36)>  _
             Public number As Char
             <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=30)>  _
             Public signdate As Char
             <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=16)>  _
             Public validtermOfStart As Char
             <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=16)>  _
             Public validtermOfEnd As Char
         End Structure
 
 
Public Sub FillData()
Try
pictureBox1.ImageLocation = (Application.StartupPath + "\\zp.bmp")
Dim name() As Byte = New Byte((30) - 1) {}
Dim length As Integer = 30
CVRSDK.GetPeopleName(name(0), length)
'MessageBox.Show();
Dim number() As Byte = New Byte((30) - 1) {}
length = 36
CVRSDK.GetPeopleIDCode(number(0), length)
Dim people() As Byte = New Byte((30) - 1) {}
length = 3
CVRSDK.GetPeopleNation(people(0), length)
Dim validtermOfStart() As Byte = New Byte((30) - 1) {}
length = 16
CVRSDK.GetStartDate(validtermOfStart(0), length)
Dim birthday() As Byte = New Byte((30) - 1) {}
length = 16
CVRSDK.GetPeopleBirthday(birthday(0), length)
Dim address() As Byte = New Byte((30) - 1) {}
length = 70
CVRSDK.GetPeopleAddress(address(0), length)
Dim validtermOfEnd() As Byte = New Byte((30) - 1) {}
length = 16
CVRSDK.GetEndDate(validtermOfEnd(0), length)
Dim signdate() As Byte = New Byte((30) - 1) {}
length = 30
CVRSDK.GetDepartment(signdate(0), length)
Dim sex() As Byte = New Byte((30) - 1) {}
length = 3
CVRSDK.GetPeopleSex(sex(0), length)
lblAddress.Text = System.Text.Encoding.GetEncoding("GB2312").GetString(address)
lblSex.Text = System.Text.Encoding.GetEncoding("GB2312").GetString(sex)
lblBirthday.Text = System.Text.Encoding.GetEncoding("GB2312").GetString(birthday)
lblDept.Text = System.Text.Encoding.GetEncoding("GB2312").GetString(signdate)
lblIdCard.Text = System.Text.Encoding.GetEncoding("GB2312").GetString(number)
lblName.Text = System.Text.Encoding.GetEncoding("GB2312").GetString(name)
lblNation.Text = System.Text.Encoding.GetEncoding("GB2312").GetString(people)
lblValidDate.Text = (System.Text.Encoding.GetEncoding("GB2312").GetString(validtermOfStart) + ("-" + System.Text.Encoding.GetEncoding("GB2312").GetString(validtermOfEnd)))
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub

public  iRetUSB As Integer = 0
public  isClose As Boolean = false
public iRetCOM As Integer = 0
 
窗口的AfterLoad事件:
 
 Try
Dim iPort As Integer
iPort = 1001
Do While (iPort <= 1016)
iRetUSB = CVRSDK.CVR_InitComm(iPort)
If (iRetUSB = 1) Then
Exit For
End If
iPort = (iPort + 1)
Loop
iPort = 1
Do While (iPort <= 4)
iRetCOM = CVRSDK.CVR_InitComm(iPort)
If (iRetCOM = 1) Then
Exit For
End If
iPort = (iPort + 1)
Loop
If ((iRetCOM = 1) _
OrElse (iRetUSB = 1)) Then
 messagebox.show ("初始化成功")
Else
 messagebox.show ("初始化失败")
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try

窗口的BeforeClose事件:
 If Not isClose Then
Try
CVRSDK.CVR_CloseComm
Me.Close
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End If

 
读取按钮事件:
 
 Try
If ((iRetCOM = 1) _
OrElse (iRetUSB = 1)) Then
Dim authenticate As Integer = CVRSDK.CVR_Authenticate
If (authenticate = 1) Then
Dim readContent As Integer = CVRSDK.CVR_Read_Content(4)
If (readContent = 1) Then
    messagebox.show ("成功")
FillData
Else
 messagebox.show ("失败")
End If
Else
MessageBox.Show("没有卡", cn, ")")
End If
Else
'MessageBox.Show("初始化失败")
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try


 

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  14楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/10/11 9:30:00 [只看该作者]

以下是引用擎天柱在2011-10-11 9:16:00的发言:

我用的是华旭金卡,谁有华旭的?麻烦共享一下,谢谢!

华旭官方的开发包是加密打包的,打不开。

另外网上有通用开发包开发的样板,可惜我不会用。

如果foxtable能够引用应用这些通用开发包,那又是一大市场啊!

 

所有都能引用,只要开发商有开发接口。


 回到顶部
帅哥哟,离线,有人找我吗?
擎天柱
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:542 积分:4243 威望:0 精华:4 注册:2008/9/1 8:27:00
  发帖心情 Post By:2011/10/11 9:58:00 [只看该作者]

贺老师能用foxtable引用这个二代身份证通用开发包么?如果能做个范例,那应该是多爽的事啊!

附二代身份证通用开发包:

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:126disk.com_二代身份证读卡器sdk终极版 v1.0.zip


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  16楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/10/11 10:02:00 [只看该作者]

呵呵,除非你送台设备给我,否则我怎么做啊? 做示例要调试的啊

图片点击可在新窗口打开查看

[此贴子已经被作者于2011-10-11 10:06:53编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
擎天柱
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:542 积分:4243 威望:0 精华:4 注册:2008/9/1 8:27:00
  发帖心情 Post By:2011/10/11 10:06:00 [只看该作者]

以下资料摘自网络:
通用二代身份证阅读器接口
    为了简化用户操作,很多用户都购买了二代身份证阅读器用于在预约挂号、入院登记、自助打印等需要使命登记的业务场合进行身份证信息快速录入,同时二代身份证阅读器也为使用单位避免法律风险、提高管理水平提供了一个现代化的工具。

         为了满足用户需求,我们系统中也提供了相应的接口以读取二代身份证阅读器读到的信息,目前我们已经支持多种型号的二代身份证阅读器设备,如深圳华视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,该接口都能正确读取身份证的信息,但其通用性还需要新的设备继续测试验证,深圳华视那样的特例目前只发现一个,不知道会不会接二连三的出现


 回到顶部
帅哥哟,离线,有人找我吗?
yjk1023
  18楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:189 积分:1658 威望:0 精华:0 注册:2011/5/25 17:51:00
  发帖心情 Post By:2011/10/11 16:34:00 [只看该作者]

好像不行


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/10/11 16:35:00 [只看该作者]

不行的是正常的,这种编程,都要要有实际的设备调试,才能写出100%可行的代码,否则都是蒙。

 回到顶部
帅哥哟,离线,有人找我吗?
yjk1023
  20楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:189 积分:1658 威望:0 精华:0 注册:2011/5/25 17:51:00
  发帖心情 Post By:2011/10/11 17:10:00 [只看该作者]

上传个开发说明

 回到顶部
总数 32 上一页 1 2 3 4 下一页