C# 身份证读卡器开发
实际开发中,如果需要读取身份证信息,就涉及到身份证读卡器开发了,最近项目中刚好用到,借此与大家分享下开发过程。
身份证读卡器市面上有很多种,华旭、中控、华大等等,其开发原理大同小异,本次以华旭读卡器为例。
//身份证信息结构
public class IDcardInfo
{
public string CardNo
{
get;
set;
}
public string Name
{
get;
set;
}
public string Sex
{
get;
set;
}
public DateTime Birthday
{
get;
set;
}
public string Nation
{
get;
set;
}
public string IDNumber
{
get;
set;
}
public string Address
{
get;
set;
}
public string Department
{
get;
set;
}
public string EffectData
{
get;
set;
}
public string Expire
{
get;
set;
}
public string ImagePath
{
get;
set;
}
}
//接口,因可能涉及不同设备,固都继承此接口
public interface IIDcardReader
{
IDcardInfo ReadInfo();
}
//设备烈性
public enum EnumIDReaderDevice
{
[Description("无")]
None = 0,
[Description("华旭")]
HuaXu = 1,
[Description("华大")]
HuaDa = 3,
[Description("中控")]
ZK = 4
}
//设备工厂
public sealed class DeviceFactory
{
private static EnumIDReaderDevice _ReaderDevice = EnumIDReaderDevice.None;
public static IIDcardReader CreateIDcardReader()
{
string config = "1";//设备以华旭为例
if (_ReaderDevice == EnumIDReaderDevice.None)
{
if (config == "1")
{
_ReaderDevice = EnumIDReaderDevice.HuaXu;
}
else if (config == "3")
{
_ReaderDevice = EnumIDReaderDevice.HuaDa;
}
else if (config == "4")
{
_ReaderDevice = EnumIDReaderDevice.ZK;
{
}
IIDcardReader result = null;
switch (_ReaderDevice)
{
case EnumIDReaderDevice.HuaXu:
result = new IDcardReaderHX();
break;
case EnumIDReaderDevice.HuaDa:
result = new SSSE32Reader();
break;
case EnumIDReaderDevice.ZK:
result = new ZKReader();
break;
}
return result;
}
}
//设备类
public class IDcardReaderHX : IIDcardReader
{
public IDcardInfo ReadInfo()
{
byte[] pucManaInfo = new byte[255];
byte[] pucManaMsg = new byte[255];
byte[] array = new byte[255];
byte[] array2 = new byte[1024];
byte[] array3 = new byte[1024];
uint puiCHMsgLen = 0u;
uint puiPHMsgLen = 0u;
int num = 0;
int num2 = SDT_OpenPort(1001);
num = SDT_StartFindIDCard(1001, pucManaInfo, 1);
num = SDT_SelectIDCard(1001, pucManaMsg, 1);
num = SDT_ReadBaseMsg(1001, array, ref puiCHMsgLen, array2, ref puiPHMsgLen, 1);
SDT_ClosePort(1001);
if (num != 144)
{
return null;
}
IDCARDINFO iDCARDINFO = (IDCARDINFO)IDCARDINFO.BytesToStruct(array, typeof(IDCARDINFO));
string text = iDCARDINFO.ID.Trim() + ".wlt";
bool flag = writeFile(array2, (int)puiPHMsgLen, text);
iDCARDINFO.ImagePath = iDCARDINFO.ID.Trim() + ".bmp";
if (!File.Exists(iDCARDINFO.ImagePath))
{
int bmp = GetBmp(Encoding.UTF8.GetBytes(text), 1);
}
IDcardInfo dcardInfo = new IDcardInfo();
dcardInfo.CardNo = iDCARDINFO.ID.Trim();
dcardInfo.Name = iDCARDINFO.name.Trim();
dcardInfo.Sex = iDCARDINFO.Sex.Trim();
dcardInfo.Birthday = DateTime.ParseExact(iDCARDINFO.BIRTH.Trim(), "yyyyMMdd", CultureInfo.CurrentCulture);
dcardInfo.Nation = iDCARDINFO.NATION.Trim();
dcardInfo.IDNumber = iDCARDINFO.ID.Trim();
dcardInfo.Address = iDCARDINFO.ADDRESS.Trim();
dcardInfo.Department = iDCARDINFO.ISSUE.Trim();
dcardInfo.EffectData = iDCARDINFO.EXPER_STA.Trim();
dcardInfo.Expire = iDCARDINFO.EXPER_END.Trim();
dcardInfo.ImagePath = iDCARDINFO.ImagePath;
return dcardInfo;
}
private static bool writeFile(byte[] buf, int pucaddMsgLen, string fname)
{
try
{
FileStream fileStream = new FileStream(fname, FileMode.OpenOrCreate);
fileStream.Write(buf, 0, pucaddMsgLen);
fileStream.Close();
return true;
}
catch
{
return false;
}
}
//居民身份证信息获取接口 可自行查找下载
[DllImport("sdtapi_x32/sdtapi.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int SDT_OpenPort(int iPort);
[DllImport("sdtapi_x32/sdtapi.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, EntryPoint = "SDT_OpenPort")]
private static extern int SDT_ClosePort(int iPort);
[DllImport("sdtapi_x32/sdtapi.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int SDT_StartFindIDCard(int iPort, byte[] pucManaInfo, int iIfOpen);
[DllImport("sdtapi_x32/sdtapi.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int SDT_SelectIDCard(int iPort, byte[] pucManaMsg, int iIfOpen);
[DllImport("sdtapi_x32/sdtapi.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int SDT_ReadBaseMsg(int iPort, byte[] pucCHMsg, ref uint puiCHMsgLen, byte[] pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);
[DllImport("sdtapi_x32/WltRS.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int GetBmp(byte[] Wlt_File, int intf);
[DllImport("sdtapi_x32/sdtapi.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int SDT_ReadNewAppMsg(int iPort, byte[] pucCHMsg, ref uint puiCHMsgLen, int iIfOpen);
}
//最后项目中读取身份证实际信息
public IDcardInfo ReadCardInfo()
{
IDcardInfo cardInfo = null;
tyr
{
IIDcardReader cardReader = DeviceFactory.CreateIDcardReader();
if (cardReader == null)
{
MessageBox.Show("未检测到读取设备!");
return;
}
cardInfo = iIDcardReader.ReadInfo();
return cardinfo;
}
}
C# 身份证读卡器开发相关推荐
- 新中新身份证读卡器开发问题
新中新二代身份证读卡器dkq-a16d,在C#中读卡开发时,参考随机附带的C#参考代码,能够读取成功,但读几次程序就莫名其妙的关掉了,有时连错误都捕捉不到,搞了很长时间也没搞定,后来以为会不会是win ...
- python能调用身份证读卡器吗_华视身份证读卡机Python二次开发
最近项目中用到华视身份证读卡机,那么本篇文章就是根据Python代码来实现对华视身份证读卡机中读卡操作. 华视身份证阅读器SDK手册 下面是官方提供的SDK使用手册,我就不描述到本篇文章中了,相信大家 ...
- .net core 3.1精伦身份证读卡器IDR210-2(部标版)二次开发
业务需求 在学员录入的时候添加一个读取身份证填充对应信息的功能,但遇到如下问题: 官方提供的demo读取身份证使用了com组件和activeX控件的技术,并且只支持IE,我们的前端项目没有兼容IE 技 ...
- 新中新二代身份证读卡器C#开发问题及解决方法
新中新二代身份证读卡器DKQ-A16D(升级版为F200A),在C#中进行读卡器开发时,使用随机附带的C#参考代码,运行时会报错. 无法加载 DLL"Syn_IDCardRead.dll&q ...
- Java CRV-100UC华视电子身份证读卡器二次开发
准备工作: 环境:windows.jdk(32bit) 华视SDK开发包: sdtapi.dll(函数的动态联接库) Termb.dll(安全模块通讯函数) WltRS.dll(身份证相片解码库) J ...
- 【Py】基于Python的身份证读卡器二开全记录
最近一个项目需要使用身份证读卡器进行数据采集,采集的身份证数据需要实时进入公司数据库,这就难免需要对设备进行二次开发.由于之前有过类似USB/串口盒子开发的经验,所以就接下了. #mermaid-sv ...
- 精伦安全模块-身份证读卡器对接-Qt调用SDK
文章目录 精伦身份证读卡器 SDK qt调用测试读取身份证 库文件添加 编译器 测试代码 编译运行 精伦身份证读卡器 SDK 使用的是通用二次开发包V3.2的sdk Dewlt.dll JpgDll. ...
- js调用身份证读卡器-兼容Chrome、Edge、360、Firefox、IE、钉钉、企业微信等
js调用身份证读卡器-兼容Chrome.Edge.360.Firefox.IE.钉钉.企业微信等 前言 界面效果 测试使用说明 example 相关地址 前言 琼羽中间件,旨在实现兼容多浏览器插件通用 ...
- 身份证识别开发_成为您的身份永远不会太晚-在36岁时成为一名开发人员
身份证识别开发 by João Henrique 通过JoãoHenrique 成为您的身份永远不会太晚-在36岁时成为一名开发人员 (It is never too late to be who y ...
- 中控智慧身份证读卡器工具类
自定义一个身份证回调接口 import com.zkteco.android.biometric.module.idcard.meta.IDCardInfo;/*** developer : xuya ...
最新文章
- 使用工作集(Working Set)整理项目
- Apache CXF实战之六 创建安全的Web Service
- Android开发--初探SQLiteDataBase/数据库的创建,更新,插入,查询
- 李丽娟c语言第四版教师书_来,把自学C语言经历的那些苦,都踩在脚下
- tomcat安装部署
- 强力推荐!飞桨产业级PaddleNLP最新全景图发布
- 由铁路订票系统联想到的
- ellipsis省略号表示多余内容
- jQuery.extend() 使用语法详解
- 前端学习(392):京东制作页面1京东项目项目介绍
- Confluence 6 理解你许可证的用户数
- MATLAB点击运行并计时没反应,MATLAB计时器对象陷阱和不良用法
- Nmap 可能引起cisco路由器Crash
- java实现url转码、解码
- 华为将发布定制款“鸿蒙字体”,可以免费商用
- redhat7安装谷歌浏览器 换源
- 笔记本计算机摄像头怎么打开,笔记本都有摄像头吗_笔记本电脑摄像头怎么打开-win7之家...
- C语言实现机器猫绘制
- k30最小宽度380不管用了_K30系列最强机,Redmi K30S至尊纪念版评测
- SkeyeVSS接入无固定IP监控摄像头实现网页无插件化直播点播监控解决方案