神思二代身份证验证机具按 公安部一所 标准
与人口信息系统软件对接操作的实现
一、 软件调用接口(SDK开发包)
1. SDK开发包包括:
i. Termb.dll  --------公安部标准接口动态连接库
ii. Termb.lib  --------VC开发时库函数定义文件
iii. Sdtapi.dll  --------与神思验证机具通讯支持动态连接库
iv. WltRS.dll  --------神思验证机具身份证照片图像解压算法支持动态连接2. 调用调试
用户自主开发程序来实现从神思“二代身份证验证机具”读取身份证信息时需要应用SDK开发包,仅仅需要调用Termb.dll中的四个函数即可。但是开发包内的3个动态连接库文件必须放在同一个文件夹下,且最好安装在用户程序所在的文件夹下。
Termb.dll动态连接库包含四个函数:InitComm,CloseComm,Authenticate,Read_Content。使用方法详见“神思Termb动态库使用说明”文档。二、 使用时安装方法
软件开发好后,在安装神思公司的验证机具时,软件方面操作:
1. 将Termb.lic拷贝到“C:\” 根目录下,并去掉文件的“只读”属性,。
2. 将Termb.dll,Sdtapi.dll,WltRS.dll拷贝到人口信息系统软件程序的安装文件夹下。
3. 到此可以连接好神思验证机具,启动软件进行读卡。
1. 初始化端口
Delphi:
Function InitComm(iPort:integer):integer; stdcall;far; External 'termb.dll';
VC++
int InitComm(int iPort);
说明:
iPort :串口号,取值 1~16
USB口 取值 1001~1016
   返回值:1    成功
  其他  失败
2. 关闭端口
Delphi:
Function CloseComm:integer; stdcall;far; External 'termb.dll';
VC++
int CloseComm (void);
说明:
   返回值:1    成功
  其他  失败3. 卡认证
Delphi:
Function Authenticate:integer; stdcall;far; External 'termb.dll';
VC++
int Authenticate (void);
说明:
   返回值:1    成功
  其他  失败4. 读卡内信息
Delphi:
Function Delphi:
Function Read_Content(Act:integer):integer; stdcall;far; External 'termb.dll';
VC++
int Read_Content (Act:integer):integer; stdcall;far; External 'termb.dll';
说明:
Act :读取的信息类型:
//1 : 读基本信息
生成wz.txt身份信息文本文件unicode编码
生成zp.bmp图像文件
-1 相片解码错误
-2 wlt文件后缀错误
-3 wlt文件打开错误
-4 wlt文件格式错误
-5 软件未授权
-6 设备连接错误
-8 文件存储失败
-10 端口操作失败
-11 解码失败
2 接收数据超时 //2 : 只读文字信息
生成wz.txt身份信息文本文件unicode编码
//3 : 读最新住址信息
生成NewAdd.txt文件

返回值:1    成功
  其他  失败文字信息采用GB 13000的UCS-2进行存储,各项目分配如下:
项目 长度(字节) 说明
姓名 30 汉字
性别 2 代码
民族 4 代码
出生 16 年月日:YYYYMMDD
住址 70 汉字和数字
公民身份号码 36 数字
签发机关 30 汉字
有效期起始日期 16 年月日:YYYYMMDD
有效期截止日期 16 年月日:YYYYMMDD
有效期为长期时存储“长期”
最新住址 70(每个住址70字节,最多4块,即280字节) 汉字和数字
错误信息详细见下表
类   别 返回值
(16进制) 意   义
与ID卡相关  80 找卡不成功
 81 选卡不成功
 31 卡认证机具失败
 32 机具认证卡失败
 33 信息验证错误
 34 尚未找卡,不能进行对卡的操作
 40 无法识别的卡类型
 41 读卡操作失败
 50 写卡操作失败
 61 用户登录失败
注意:1.端口初始化后,再退出程序时必须关闭端口。
      2.要读取卡内信息,必须先认证卡,成功后才能够读取。
SDK包说明如上,可是用ASP.NET c#如何实现读取身份证信息和图片啊
~~~~~~~~~~~
求个例子 C#~~~~~~~~~~~~

解决方案 »

  1.   

    我也正为这问题头疼呢,如果找到方法,请发个邮件给我[email protected],拜托了,不胜感激!!!!
      

  2.   

    我用的是国腾的身份证读卡器,估计是一样的··
    首先是引用:        [DllImport("termb.dll")]
            public static extern int InitComm(int Port);        [DllImport("termb.dll")]
            public static extern int CloseComm();        [DllImport("termb.dll")]
            public static extern int Authenticate();        [DllImport("termb.dll")]
            public static extern int Read_Content(int Aetive);        [DllImport("termb.dll")]
            public static extern int GetPeopleName(byte[] strTmp, int strLen);        [DllImport("termb.dll")]
            public static extern int GetPeopleSex(byte[] strTmp, int strLen);身份证读卡器的读卡流程都是规定死的:
    1、连接读卡器具就可能各个厂家不同的。
    iRet = C_GTICR100.InitComm(Port);
    2、读取身份证:        public static bool AuthenticateCard()
            {
                int iRet;
                CleanErrMsg();            iRet = C_GTICR100.Authenticate();
                if (iRet == 1)
                    return true;
                else
                {
                    SetErrMsg("未放卡或卡放置不正确!如果已经正确放置,请先把卡拿开,然后再重新正确放置卡!");
                    return false;
                }
            }        public static bool ReadCard(int Active)
            {
                int iRet;
                CleanErrMsg();            iRet = C_GTICR100.Read_Content(Active);
                if (iRet == 1)
                    return true;
                else
                {
                    switch (iRet)
                    {
                        case 0:
                            SetErrMsg("读卡错误!请拿走卡然后重新放置!");
                            break;
                        case -1:
                            SetErrMsg("相片解码错误!");
                            break;
                        case -2:
                            SetErrMsg("wlt文件后缀错误!");
                            break;
                        case -3:
                            SetErrMsg("wlt文件打开错误!");
                            break;
                        case -4:
                            SetErrMsg("wlt文件格式错误!");
                            break;
                        case -5:
                            SetErrMsg("软件未授权!");
                            break;
                        case -6:
                            SetErrMsg("设备连接失败!");
                            break;
                        case -8:
                            SetErrMsg("未能验证卡,请确认已经正确放置卡!");
                            break;
                    }                return false;
                }
            }这两个函数是必须的每次读身份证都要先验证和读。
    3、提取身份证信息:        public static bool GetName(out byte[] NameBytes)
            {
                int iRet;
                CleanErrMsg();            byte[] iRetBytes = new byte[30];
                iRet = C_GTICR100.GetPeopleName(iRetBytes, 30);
                if (iRet == 0)
                {
                    SetErrMsg("读取姓名信息异常!");
                    NameBytes = null;
                    return false;
                }
                else
                {
                    NameBytes = iRetBytes;
                }            return true;
            }        public static string GetName_Str()
            {
                string iRet = "";            byte[] iRetBytes;
                if (GetName(out iRetBytes) == true)
                {
                    Encoding iStrEncod = Encoding.GetEncoding("gb2312");
                    iRet = iStrEncod.GetString(iRetBytes);
                }            return iRet;
            }
    整个流程就这样,神思也应该是这样的··
      

  3.   

    4. 读卡内信息
    这里有问题,只有1个参数,这个参数是读取的信息类型的数字
    读卡内信息的返回值 也是数字所以公安的这个DLL是不能读取身份证的具体信息的!
    termb.dll,绝对可以不用它,就能读出身份证信息!要读身份证还是 调用 sdtapi.dll
    貌似只需要7个函数,如下
    SDT_ReadNewAppMsg
    SDT_ReadBaseMsg
    SDT_ReadMngInfo
    SDT_StartFindIDCard
    SDT_SelectIDCard
    SDT_ClosePort
    SDT_OpenPort我也正在研究中!
      

  4.   

    哎呀,我错了!
    公安的哪个也行的,会在程序的目录下生成wz.txt
    然后处理这个 TXT吧