求助啊急死啦 ASP.NET调用神思二代阅读器的问题!

小生我怕怕 2010-08-26 11:23:16
神思二代身份证验证机具按 公安部一所 标准
与人口信息系统软件对接操作的实现
一、 软件调用接口(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#~~~~~~~~~~~~
...全文
1352 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
90天天 2011-06-11
  • 打赏
  • 举报
回复
哎呀,我错了!
公安的哪个也行的,会在程序的目录下生成wz.txt
然后处理这个 TXT吧
90天天 2011-06-11
  • 打赏
  • 举报
回复
4. 读卡内信息
这里有问题,只有1个参数,这个参数是读取的信息类型的数字
读卡内信息的返回值 也是数字

所以公安的这个DLL是不能读取身份证的具体信息的!
termb.dll,绝对可以不用它,就能读出身份证信息!

要读身份证还是 调用 sdtapi.dll
貌似只需要7个函数,如下
SDT_ReadNewAppMsg
SDT_ReadBaseMsg
SDT_ReadMngInfo
SDT_StartFindIDCard
SDT_SelectIDCard
SDT_ClosePort
SDT_OpenPort

我也正在研究中!
LYMEGG1984 2010-12-24
  • 打赏
  • 举报
回复
很弱智的补充一下,上面的代码都是节选,有些自定义的方法,明显是没有贴的……
LYMEGG1984 2010-12-24
  • 打赏
  • 举报
回复
我用的是国腾的身份证读卡器,估计是一样的··
首先是引用:

[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;
}


整个流程就这样,神思也应该是这样的··
crackdung 2010-12-22
  • 打赏
  • 举报
回复
問公安部的能人啊
  • 打赏
  • 举报
回复
我也正为这问题头疼呢,如果找到方法,请发个邮件给我397876058@qq.com,拜托了,不胜感激!!!!

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧