实际开发中,如果需要读取身份证信息,就涉及到身份证读卡器开发了,最近项目中刚好用到,借此与大家分享下开发过程。

身份证读卡器市面上有很多种,华旭、中控、华大等等,其开发原理大同小异,本次以华旭读卡器为例。

//身份证信息结构

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# 身份证读卡器开发相关推荐

  1. 新中新身份证读卡器开发问题

    新中新二代身份证读卡器dkq-a16d,在C#中读卡开发时,参考随机附带的C#参考代码,能够读取成功,但读几次程序就莫名其妙的关掉了,有时连错误都捕捉不到,搞了很长时间也没搞定,后来以为会不会是win ...

  2. python能调用身份证读卡器吗_华视身份证读卡机Python二次开发

    最近项目中用到华视身份证读卡机,那么本篇文章就是根据Python代码来实现对华视身份证读卡机中读卡操作. 华视身份证阅读器SDK手册 下面是官方提供的SDK使用手册,我就不描述到本篇文章中了,相信大家 ...

  3. .net core 3.1精伦身份证读卡器IDR210-2(部标版)二次开发

    业务需求 在学员录入的时候添加一个读取身份证填充对应信息的功能,但遇到如下问题: 官方提供的demo读取身份证使用了com组件和activeX控件的技术,并且只支持IE,我们的前端项目没有兼容IE 技 ...

  4. 新中新二代身份证读卡器C#开发问题及解决方法

    新中新二代身份证读卡器DKQ-A16D(升级版为F200A),在C#中进行读卡器开发时,使用随机附带的C#参考代码,运行时会报错. 无法加载 DLL"Syn_IDCardRead.dll&q ...

  5. Java CRV-100UC华视电子身份证读卡器二次开发

    准备工作: 环境:windows.jdk(32bit) 华视SDK开发包: sdtapi.dll(函数的动态联接库) Termb.dll(安全模块通讯函数) WltRS.dll(身份证相片解码库) J ...

  6. 【Py】基于Python的身份证读卡器二开全记录

    最近一个项目需要使用身份证读卡器进行数据采集,采集的身份证数据需要实时进入公司数据库,这就难免需要对设备进行二次开发.由于之前有过类似USB/串口盒子开发的经验,所以就接下了. #mermaid-sv ...

  7. 精伦安全模块-身份证读卡器对接-Qt调用SDK

    文章目录 精伦身份证读卡器 SDK qt调用测试读取身份证 库文件添加 编译器 测试代码 编译运行 精伦身份证读卡器 SDK 使用的是通用二次开发包V3.2的sdk Dewlt.dll JpgDll. ...

  8. js调用身份证读卡器-兼容Chrome、Edge、360、Firefox、IE、钉钉、企业微信等

    js调用身份证读卡器-兼容Chrome.Edge.360.Firefox.IE.钉钉.企业微信等 前言 界面效果 测试使用说明 example 相关地址 前言 琼羽中间件,旨在实现兼容多浏览器插件通用 ...

  9. 身份证识别开发_成为您的身份永远不会太晚-在36岁时成为一名开发人员

    身份证识别开发 by João Henrique 通过JoãoHenrique 成为您的身份永远不会太晚-在36岁时成为一名开发人员 (It is never too late to be who y ...

  10. 中控智慧身份证读卡器工具类

    自定义一个身份证回调接口 import com.zkteco.android.biometric.module.idcard.meta.IDCardInfo;/*** developer : xuya ...

最新文章

  1. 使用工作集(Working Set)整理项目
  2. Apache CXF实战之六 创建安全的Web Service
  3. Android开发--初探SQLiteDataBase/数据库的创建,更新,插入,查询
  4. 李丽娟c语言第四版教师书_来,把自学C语言经历的那些苦,都踩在脚下
  5. tomcat安装部署
  6. 强力推荐!飞桨产业级PaddleNLP最新全景图发布
  7. 由铁路订票系统联想到的
  8. ellipsis省略号表示多余内容
  9. jQuery.extend() 使用语法详解
  10. 前端学习(392):京东制作页面1京东项目项目介绍
  11. Confluence 6 理解你许可证的用户数
  12. MATLAB点击运行并计时没反应,MATLAB计时器对象陷阱和不良用法
  13. Nmap 可能引起cisco路由器Crash
  14. java实现url转码、解码
  15. 华为将发布定制款“鸿蒙字体”,可以免费商用
  16. redhat7安装谷歌浏览器 换源
  17. 笔记本计算机摄像头怎么打开,笔记本都有摄像头吗_笔记本电脑摄像头怎么打开-win7之家...
  18. C语言实现机器猫绘制
  19. k30最小宽度380不管用了_K30系列最强机,Redmi K30S至尊纪念版评测
  20. SkeyeVSS接入无固定IP监控摄像头实现网页无插件化直播点播监控解决方案

热门文章

  1. 《Erlang/OTP并发编程实战》第八章 分布式 Erlang/OTP 简介
  2. arcgis js for JavaScript 4.X 移动轨迹动画
  3. 在线 PHP运行工具、数据库可控
  4. 基于SNMP数据采集模块的设计和实现2
  5. 清华大学计算机系黄子懿,清华大学2014年自主招生名单:(北京市)(一)
  6. win7 Ubuntu 双系统重装 系统引导修复
  7. 简单易懂使用DDOS攻击
  8. Citrix ADC中SNIP的三种配置场景
  9. Tamami教你孕前如何选购防辐射服
  10. 那些便宜的vps,你敢用吗?企业该如何选择云服务器?