标签:
原文:今天意外和身份证结缘说起身份证,人人都有,前几年才领的身份证外皮都没撕开过, 当时那个高兴呀,终于可以像大人一样了。咱也是有身份的人了!
记得在学校的时候课间和老师聊天 小鬼问了老师一个问题,这么说的 “老师,您做程序员有这么长时间你觉得那些有意思的事是什么?” 老师想了稍许。答道“就是半夜三更时候,解决了困扰自己很久一个问题,再看看QQ 同事和同学还在群里讨论学术问题。 赶紧向群里敲两个字。 然后睡安稳觉了”。 听的小鬼当时那个悲催呀。小鬼又问了一句“还有呢” 这回他马上回应道:“就在别人掏出二代身份证的时候!”小鬼一愣 “因为老师当年在某某公司 承接了二代身份证的程序开发, 一看到别人掏出身份证就暗暗乐‘这是我做的’ 算是一种成就感吧。” 小鬼 听到这里 赶忙掏出身份证 老师会心一笑就结束谈话。这么一件小事让我泛起涟漪许久。
当然今天把安排的事做完了。 以为可以清闲一阵子了。老大又丢东西来了,好吧锻炼机会来了。小鬼得到一个 多频射读写器, 是要读二代身份证的基本信息。今天还是想法设法搞定了。回到家了,突然想起前面了内容。
下面是小鬼遇到情况 和 解决方案
如果小鬼的做法有不妥请见谅和希望不吝啬你的想法
还是图文吧
这么会不会有广告嫌疑呀,不管了。谁在乎了,谁吃药。呵呵,这就是拿到道设备。
没有API文档没有示例代码,当时联系售后,没有联系方式,有点困难重重,于是上网搜搜吧碰碰运气,
搜到两篇博客园里的两篇文章 cyan的 ASP.NET程序读取二代身份证 、南疯的一篇 不同机具的通用的第二代居民身份证读写
照着上述文章 copy过来 简单调整一下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ReadCard
{
public class ReadIDCard
{
[DllImport("sdtapi.dll")]
private static extern int InitComm(int iPort);//初始化
[DllImport("sdtapi.dll")]
private static extern int CloseComm();//关闭端口
[DllImport("sdtapi.dll")]
private static extern int Authenticate();//卡认证
[DllImport("sdtapi.dll")]//读取数据,推荐使用
private static extern int ReadBaseInfos(
StringBuilder Name,
StringBuilder Gender,
StringBuilder Folk,
StringBuilder BirthDay,
StringBuilder Code,
StringBuilder Address,
StringBuilder Agency,
StringBuilder ExpireStart,
StringBuilder ExpireEnd);
[DllImport("kernel32.dll")]
private static extern int Beep(int dwFreq, int dwDuration);//用来大吼一声
public event Action<IDCardInfo> OnTimerCompleted;
public event Action<string> OnError;
//enum ERetReadBaseInfos
//{
// 正确 = 1,
// 读卡错误 = 0,
// 没有最新住址信息 = 2,
// 相片解码错误 = -1,
// wlt文件后缀错误 = -2,
// wlt文件打开错误 = -3,
// wlt文件格式错误 = -4,
// 软件未授权 = -5,
// 无效参数 = -11,
//}
public void OnTimer()
{
StringBuilder Name = new StringBuilder(31);
StringBuilder Gender = new StringBuilder(3);
StringBuilder Folk = new StringBuilder(10);
StringBuilder BirthDay = new StringBuilder(9);
StringBuilder Code = new StringBuilder(19);
StringBuilder Address = new StringBuilder(71);
StringBuilder Agency = new StringBuilder(31);
StringBuilder ExpireStart = new StringBuilder(9);
StringBuilder ExpireEnd = new StringBuilder(9);
//打开端口
int intOpenRet = 0;
for (int i = 1001; i < 1004; i++)
{
intOpenRet = InitComm(i);
if (intOpenRet == 1)
break;
}
if (intOpenRet != 1)
{
if (OnError != null) OnError("阅读机具未连接");
return;
}
//卡认证
int intReadRet = Authenticate();
if (intReadRet != 1)
{
if (OnError != null) OnError("卡认证失败");
CloseComm();
return;
}
//ReadBaseInfos(推荐使用)
int intReadBaseInfosRet = ReadBaseInfos(
Name, Gender, Folk, BirthDay,
Code, Address, Agency,
ExpireStart, ExpireEnd);
if (intReadBaseInfosRet == 0)
{
if (OnError != null) OnError("读卡错误");
CloseComm();
return;
}
Beep(2047, 200);
IDCardInfo IDInfo = new IDCardInfo();
IDInfo.Code = Code.ToString().Trim();
IDInfo.Name = Name.ToString().Trim();
IDInfo.Gender = Gender.ToString().Trim();
IDInfo.Folk = Folk.ToString().Trim();
IDInfo.BirthDay = BirthDay.ToString().Trim();
IDInfo.Address = Address.ToString().Trim();
IDInfo.Agency = Agency.ToString().Trim();
IDInfo.ExpireStart = ExpireStart.ToString().Trim();
IDInfo.ExpireEnd = ExpireEnd.ToString().Trim();
IDInfo.Photo = System.IO.Directory.GetCurrentDirectory() + "\\photo.bmp";
CloseComm();
if (OnTimerCompleted != null)
{
this.OnTimerCompleted(IDInfo);
}
}
}
public class IDCardInfo
{
public String Name { get; set; }
public String Gender { get; set; }
public String Folk { get; set; }
public String BirthDay { get; set; }
public String Code { get; set; }
public String Address { get; set; }
public String Agency { get; set; }
public String ExpireStart { get; set; }
public String ExpireEnd { get; set; }
public String Photo { get; set; }
}
}
客户端界面
namespace IDCardUI
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ReadCard;
public partial class FrmIDInfo : Form
{
Lazy<ReadIDCard> reader = new Lazy<ReadIDCard>();
public FrmIDInfo()
{
InitializeComponent();
}
private void btnGetData_Click(object sender, EventArgs e)
{
reader.Value.OnTimerCompleted += (info) =>
{
this.txtAddress.Text = info.Address;
this.txtAgency.Text = info.Agency;
this.txtBirthDay.Text = info.BirthDay;
this.txtCode.Text = info.Code;
this.txtExpireEnd.Text = info.ExpireEnd;
this.txtExpireStart.Text = info.ExpireStart;
this.txtFolk.Text = info.Folk;
this.txtGender.Text = info.Gender;
this.txtName.Text = info.Name;
this.picboxSignle.LoadAsync(info.Photo);
};
reader.Value.OnTimer();
}
}
}
可是一运行就报
于是找到示例程序 没有源代码只是 exe 和dll去找果然找到了
但是单独加上stdapi.dll 还是不行 于是气极败坏的把所有Dll全部加在 根目录/Windows/System32下
事后觉得那些小写命名的文件名可能是必须的 不是必须放到System32下面可以应用程序同一目录下也可以。
总之果然好了
但是有必要那么多DLL吗? 一个个的试试出来,有体力活的味道了。
还剩十个的时候就没再试下去了
标签:
原文地址:http://www.cnblogs.com/lonelyxmas/p/4313684.html