今天意外和身份证结缘

原文: 今天意外和身份证结缘

说起身份证,人人都有,前几年才领的身份证外皮都没撕开过, 当时那个高兴呀,终于可以像大人一样了。咱也是有身份的人了!

       记得在学校的时候课间和老师聊天 小鬼问了老师一个问题,这么说的 “老师,您做程序员有这么长时间你觉得那些有意思的事是什么?” 老师想了稍许。答道“就是半夜三更时候,解决了困扰自己很久一个问题,再看看QQ 同事和同学还在群里讨论学术问题。 赶紧向群里敲两个字。 然后睡安稳觉了”。 听的小鬼当时那个悲催呀。小鬼又问了一句“还有呢” 这回他马上回应道:“就在别人掏出二代身份证的时候!”小鬼一愣 “因为老师当年在某某公司 承接了二代身份证的程序开发, 一看到别人掏出身份证就暗暗乐‘这是我做的’ 算是一种成就感吧。” 小鬼 听到这里 赶忙掏出身份证 老师会心一笑就结束谈话。这么一件小事让我泛起涟漪许久。

       当然今天把安排的事做完了。 以为可以清闲一阵子了。老大又丢东西来了,好吧锻炼机会来了。小鬼得到一个 多频射读写器, 是要读二代身份证的基本信息。今天还是想法设法搞定了。回到家了,突然想起前面了内容。

下面是小鬼遇到情况 和 解决方案

如果小鬼的做法有不妥请见谅和希望不吝啬你的想法

还是图文吧 

这么会不会有广告嫌疑呀,不管了。谁在乎了,谁吃药。呵呵,这就是拿到道设备。

没有API文档没有示例代码,当时联系售后,没有联系方式,有点困难重重,于是上网搜搜吧碰碰运气,

 搜到两篇博客园里的两篇文章 cyan的 ASP.NET程序读取二代身份证 、南疯的一篇 不同机具的通用的第二代居民身份证读写

 照着上述文章 copy过来 简单调整一下 

View Code
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吗? 一个个的试试出来,有体力活的味道了。

还剩十个的时候就没再试下去了 

源代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值