今天意外和身份证结缘

简介: 原文:今天意外和身份证结缘说起身份证,人人都有,前几年才领的身份证外皮都没撕开过, 当时那个高兴呀,终于可以像大人一样了。咱也是有身份的人了!        记得在学校的时候课间和老师聊天 小鬼问了老师一个问题,这么说的 “老师,您做程序员有这么长时间你觉得那些有意思的事是什么?” 老师想了稍许。
原文: 今天意外和身份证结缘

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

       记得在学校的时候课间和老师聊天 小鬼问了老师一个问题,这么说的 “老师,您做程序员有这么长时间你觉得那些有意思的事是什么?” 老师想了稍许。答道“就是半夜三更时候,解决了困扰自己很久一个问题,再看看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吗? 一个个的试试出来,有体力活的味道了。

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

源代码

目录
相关文章
|
安全 API 开发工具
第五期 | 储户银行卡深夜“被刷脸”盗走百万元,团伙作案手段全揭秘
针对近日接连爆出银行储户存款被“刷脸”盗走事件,顶象防御云业务安全情报中心复盘了整个流程:黑灰产首先窃取储户信息,然后制作一个山寨的银行App,诱导储户下载后,再利用劫持摄像头、替换人脸数据等方式登录储户账号,并使用利用劫持手段获取储户的短信验证,最后完成储户资金的的盗取。
289 0
第五期 | 储户银行卡深夜“被刷脸”盗走百万元,团伙作案手段全揭秘
给力!出门再也不用带身份证了!
今年 4 月份,支付宝在衢州、福州和杭州三个城市开启了网证试点。用户可以在支付宝中生成一个身份证的电子副本,在部分场景下直接代替实体证件完成身份验证的
198 0
给力!出门再也不用带身份证了!
|
安全 数据管理 生物认证
“人脸识别第一案”宣判:谨记脸不要随便就“刷”,可能存在巨大隐患!
对于人脸识别技术,人们之所以焦虑,就在于其信息的不透明和不对称。
192 0
“人脸识别第一案”宣判:谨记脸不要随便就“刷”,可能存在巨大隐患!
|
安全
315晚会揭秘:四种网上方式非法获取个人隐私
3月15日晚上8:00,央视3·15晚会主题为“用户信息泄露幕后”,对山东移动逆势发送垃圾短信的行为进行了曝光,同时也对各种非法获取个人信息的行为进行了曝光。 2008年央视“3·15”晚会用了将近半个小时曝光了垃圾短信制造内幕,同时对分众传媒旗下分众无线进行了重点曝光和暗访,揭开了垃圾短信制造的流程和内幕,曝光引发的连锁反应导致分众无线上市搁浅,最后被分众传媒取消无线业务,分众股价也随即被腰斩,一蹶不振。
1812 0
|
监控 定位技术
|
机器学习/深度学习 搜索推荐