不同的身份证读卡器,其动态库不一样,新中新二代身份证阅读器,型号:DKQ-A16D,eg:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;

namespace Zbsoft.XzxCardReader
{
    /// <summary>
    /// 新中新二代身份证阅读器,型号:DKQ-A16D
    /// </summary>
    public static class Reader
    {
        /// <summary>
        /// 图片格式
        /// </summary>
        public enum PhotoType {Bmp = 0, Jpeg = 1, Base64 = 2}
        /// <summary>
        /// 图片命名格式
        /// </summary>
        public enum PhotoNameType { 
            /// <summary>
            /// 临时,以当前时间命名
            /// </summary>
            Dt = 0, 
            /// <summary>
            /// 姓名
            /// </summary>
            Name = 1, 
            /// <summary>
            /// 身份证号
            /// </summary>
            CardNo = 2, 
            /// <summary>
            /// 姓名_身份证号
            /// </summary>
            Name_CardNo = 3 }
        
        /// <summary>
        /// 日期格式
        /// </summary>
        public enum DateFormat
        {
            /// <summary>
            /// YYYYMMDD
            /// </summary>
            YMD = 0,
            /// <summary>
            /// YYYY年MM月DD日
            /// </summary>
            YnMyD = 1,
            /// <summary>
            /// YYYY.MM.DD
            /// </summary>
            YdMdD = 2,
            /// <summary>
            /// YYYY-MM-DD
            /// </summary>
            YgMgD = 3,
            /// <summary>
            /// YYYY/MM/DD
            /// </summary>
            YxgMxgD = 4
        }

static int nPort = 0;//端口
        static string sPhotoPath = "";//图片文件夹
        static PhotoType sPhotoType = PhotoType.Bmp;//图片文件格式
        static PhotoNameType sPhotoNameType = PhotoNameType.CardNo;//图片文件命名格式
        static DateFormat nDateFormat = DateFormat.YgMgD;//日期格式

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct IDCardData
        {
            //结构中使用的字串,[]类似限定说明 说明此公共结构传输到非托管代码时封装定义
            /// <summary>
            /// 姓名
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
            public string Name; 
            /// <summary>
            /// 性别
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
            public string Sex;
            /// <summary>
            /// 名族
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
            public string Nation; 
            /// <summary>
            /// 出生日期
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
            public string Born;
            /// <summary>
            /// 住址
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
            public string Address; 
            /// <summary>
            /// 身份证号
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
            public string IDCardNo;
            /// <summary>
            /// 发证机关
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string GrantDept;
            /// <summary>
            /// 有效开始日期
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
            public string UserLifeBegin;
            /// <summary>
            /// 有效截止日期
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
            public string UserLifeEnd;
            /// <summary>
            /// 保留
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
            public string reserved;
            /// <summary>
            /// 照片路径
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
            public string PhotoFileName;
        }
        /************************端口类API *************************/
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetMaxRFByte", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetMaxRFByte(int iPort, byte ucByte, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetCOMBaud", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetCOMBaud(int iPort, ref uint puiBaudRate);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetCOMBaud", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetCOMBaud(int iPort, uint uiCurrBaud, uint uiSetBaud);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_OpenPort", CharSet = CharSet.Ansi)]
        public static extern int Syn_OpenPort(int iPort);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ClosePort", CharSet = CharSet.Ansi)]
        public static extern int Syn_ClosePort(int iPort);
        /**************************SAM类函数 **************************/
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ResetSAM", CharSet = CharSet.Ansi)]
        public static extern int Syn_ResetSAM(int iPort, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMStatus", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMID", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetSAMID(int iPort, ref byte pucSAMID, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMIDToStr", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetSAMIDToStr(int iPort, ref byte pcSAMID, int iIfOpen);
        /*************************身份证卡类函数 ***************************/
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_StartFindIDCard", CharSet = CharSet.Ansi)]
        public static extern int Syn_StartFindIDCard(int iPort, ref byte pucIIN, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SelectIDCard", CharSet = CharSet.Ansi)]
        public static extern int Syn_SelectIDCard(int iPort, ref byte pucSN, int iIfOpen);
        //[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]
        //public static extern int Syn_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref uint puiCHMsgLen, ref byte pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadBaseMsg(int iPort, IntPtr pucCHMsg, ref uint puiCHMsgLen, IntPtr pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDN", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadIINSNDN(int iPort, ref byte pucIINSNDN, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsgToFile", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadBaseMsgToFile(int iPort, ref byte pcCHMsgFileName, ref uint puiCHMsgFileLen, ref byte pcPHMsgFileName, ref uint puiPHMsgFileLen, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDNToASCII", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadIINSNDNToASCII(int iPort, ref byte pucIINSNDN, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadNewAppMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref uint puiAppMsgLen, int iIfOpen);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetBmp", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetBmp(string Wlt_File, int iPort);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_FindReader", CharSet = CharSet.Ansi)]
        public static extern int Syn_FindReader();
        /***********************设置附加功能函数 ************************/
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoPath", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetPhotoPath(int iOption, ref byte cPhotoPath);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetPhotoType(int iType);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoName", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetPhotoName(int iType);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetSexType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetSexType(int iType);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetNationType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetNationType(int iType);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetBornType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetBornType(int iType);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeBType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetUserLifeBType(int iType);
        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeEType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetUserLifeEType(int iType, int iOption);

=========================

/// <summary>
        /// 自动查询读卡器
        /// </summary>
        /// <param name="err">错误信息</param>
        /// <returns></returns>
        public static bool FindDrivers(out string err)
        {
            int i = 0;
            err = "";
            try
            {
                i = Syn_FindReader();
            }
            catch (Exception e)
            {
                err = e.ToString();
                return false;
            }
            if (i > 0)
            {
                nPort = i;
            }
            else
            {
                nPort = 0;
                return false;
            }
            return true;
        }

/// <summary>
        /// 读取身份证信息,包含图片,反复读取会出错
        /// </summary>
        /// <returns></returns>
        public static bool ReadCardAll(out IDCardData CardMsg, out string errStr)
        {
            errStr = "";
            CardMsg = new IDCardData();
            int nRet;
            byte[] pucIIN = new byte[4];
            byte[] pucSN = new byte[8];

if (nPort == 0)
            {
                if (!FindDrivers(out errStr))
                {
                    if (string.IsNullOrEmpty(errStr))
                        errStr = "没有找到读卡器";
                    return false;
                }
                if (string.IsNullOrEmpty(sPhotoPath))
                {
                    if (!System.IO.Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "CardImg"))
                        System.IO.Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "CardImg");
                    sPhotoPath = AppDomain.CurrentDomain.BaseDirectory + "CardImg";
                }
                nRet = Syn_SetPhotoType((int)sPhotoType);
                byte[] cPath = new byte[255];
                cPath = System.Text.Encoding.Default.GetBytes(sPhotoPath);
                nRet = Syn_SetPhotoPath(2, ref cPath[0]);
                nRet = Syn_SetPhotoName((int)sPhotoNameType);
                nRet = Syn_SetBornType((int)nDateFormat);
                nRet = Syn_SetUserLifeBType((int)nDateFormat);
                nRet = Syn_SetUserLifeEType((int)nDateFormat, 1);
                nRet = Syn_SetNationType(2);//民族:0=卡内存储的数据,1=解释之后的数据,2=解释之后+“族”
            }
            if (Syn_OpenPort(nPort) == 0)
            {
                if (Syn_SetMaxRFByte(nPort, 80, 0) == 0)
                {
                    nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
                    nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
                    nRet = Syn_ReadMsg(nPort, 0, ref CardMsg);
                    if (nRet == 0)
                    {
                        return true;
                    }
                    else
                    {
                        errStr = "读取身份证信息错误";
                    }
                }
            }
            else
            {
                errStr = "打开端口失败";
                return false;
            }
            return false;
        }
        /// <summary>
        /// 读取身份证基本信息
        /// </summary>
        /// <param name="CardMsg"></param>
        /// <param name="errStr"></param>
        /// <returns></returns>
        public static bool ReadCard(out ZbsoftInterface.IDCardData CardMsg,
            out string errStr)
        {
            CardMsg = new ZbsoftInterface.IDCardData();
            errStr = "";
            int nRet;
            byte[] pucIIN = new byte[4];
            byte[] pucSN = new byte[8];

#region 获取读卡器
            if (nPort == 0)
            {
                if (!FindDrivers(out errStr))
                {
                    if (string.IsNullOrEmpty(errStr))
                        errStr = "没有找到读卡器";
                    return false;
                }
            }
            #endregion

if (Syn_OpenPort(nPort) == 0)
            {
                if (Syn_SetMaxRFByte(nPort, 80, 0) == 0)
                {
                    nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
                    nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
                    string cardMsg = new string(' ', 256);  //身份证基本信息返回长度为256
                    string imgMsg = new string(' ', 1024);  //身份证图片信息返回长度为1024
                    IntPtr msg = Marshal.StringToHGlobalAnsi(cardMsg);  //身份证基本信息
                    IntPtr img = Marshal.StringToHGlobalAnsi(imgMsg);   //身份证图片
                    try
                    {
                        uint mLen = 0;
                        uint iLen = 0;
                        nRet = Syn_ReadBaseMsg(nPort, msg, ref mLen, img, ref iLen, 0);
                        if (nRet == 0)
                        {
                            string card = Marshal.PtrToStringUni(msg);
                            char[] cartb = card.ToCharArray();
                            CardMsg.Name = (new string(cartb, 0, 15)).Trim();
                            CardMsg.Sex = new string(cartb, 15, 1);
                            CardMsg.Nation = new string(cartb, 16, 2);
                            CardMsg.Born = new string(cartb, 18, 8);
                            CardMsg.Address = (new string(cartb, 26, 35)).Trim();
                            CardMsg.IDCardNo = new string(cartb, 61, 18);
                            CardMsg.GrantDept = (new string(cartb, 79, 15)).Trim();
                            CardMsg.UserLifeBegin = new string(cartb, 94, 8);
                            CardMsg.UserLifeEnd = new string(cartb, 102, 8);
                            return true;
                        }
                        else
                        {
                            errStr = "读取身份证信息错误";
                        }
                    }
                    catch (Exception e) { errStr = e.Message; }
                    finally
                    {
                        Marshal.FreeHGlobal(msg);
                        Marshal.FreeHGlobal(img);
                    }
                }
                else
                {
                    errStr = "SetMaxRFByte出错";
                }
            }
            else
            {
                errStr = "打开端口失败";
            }
            return false;
        }
    }
}

C#如何读取身份证阅读器相关推荐

  1. 二代身份证读取 中控ID180 二三代身份证阅读器 Vue版本

    二代身份证读取 中控ID180 二三代身份证阅读器 Vue版本 设备 设备名称:台式身份证阅读机 产品型号:ID180 设备驱动和文档 链接:https://pan.baidu.com/s/1nAYk ...

  2. VUE实现华视身份证阅读器读取身份证信息

    VUE实现华视身份证阅读器读取身份证信息 话不多上直接上代码,写的不怎么规范多多包涵,我是在模态框实现的,在这里就只提供模态框代码. 最后附上华视身份证阅读器安装文件和浏览器插件链接: [https: ...

  3. VUE实现华视身份证阅读器读取身份证信息(本文分两种情况,第一中是点击按钮读取信息,一种是自动读取信息)

    本文是用了vue+element来实现华视身份证读卡器读取身份信息的,当然在开发之前要做好前提准备,就是厂家提供对应设备的api和安装对应的驱动.本文通过两种方法来实现读取信息,第一种是点击按钮读取信 ...

  4. VUE整合信通身份证阅读器返回读取到的数据或将身份证图片返回

    需求:身份证阅读器在浏览器上接入读取身份证信息 JAVA后端身份证图片合成https://blog.csdn.net/Ajie246862/article/details/125259692 1. 身 ...

  5. 公安部身份证阅读器模块SAM通讯协议

    公安部身份证阅读器模块SAM通讯协议 图为:公安部身份证阅读器SAM模块照片 图为:东信新一代小身份证SAM模块 支持Windows.Android.Linux.ARM.单片机等各系统二次开发. 一. ...

  6. 华视100UC 身份证阅读器 Java

    华视100UC 身份证阅读器 Java 哪位大佬有64位可用的dll文件,施舍给小弟吧,万分感谢 功能 环境 个人想法(有不对的地方希望大佬指正) 对于dll文件的想法 目录结构 1. pom.xml ...

  7. python能调用身份证读卡器吗_最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册...

    最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册 1.定义 应用函数开发包含下列文件: termb.dll      API函数的动态联接库 sdtapi.dll     内部动态库 ...

  8. JNA二次开发华视身份证阅读器

    JNA二次开发华视身份证阅读器 前言 添加依赖 SDK资料 编写代码 遇到的问题(坑) 前言 这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative,其中JNA调用 ...

  9. 华视身份证阅读器SDK使用手册

    华视身份证阅读器SDK使用手册 V1.33 华视电子读写设备有限公司  2008年07月11日 概述 本手册是操作身份证阅读器动态库应用函数的定义格式.调用方法和返回值的说明.在使用前,请确认授权文件 ...

最新文章

  1. 【实习招聘】字节跳动智能创作AutoML团队招聘
  2. CentOS Linux下VNC Server远程桌面配置详解
  3. 十大经典排序算法之冒泡排序及其优化
  4. 使用Symantec Altiris 来监控 Dell 服务器 的 硬件
  5. C++ STL string的输出
  6. 如何编译sqlite-3.5.9
  7. keepalived架设简单高可用的nginx的web服务器   ----那些你不知道的秘密
  8. Day003 20210208
  9. 小米Mi 11手机电路原理图+主板元件位号图
  10. 凸优化理论基础3——凸集和凸锥重要例子
  11. 计算机学硕答辩,东南大学计算机硕士毕业答辩基本流程(参考).doc
  12. conda upgrade --all 中途退出后失败如何解决
  13. xsy3320 string
  14. java实现word文件合并
  15. 获取IP地址信息的API合集
  16. 加拿大:国家资助研究项目IRAP已自主研发区块链浏览器
  17. 证券公司信用风险管理体系—以平安证券为例-课后检验-满分
  18. 高端机市场卡位战:iQOO能否博得一席之地?
  19. Java将下划线大写方式命名的字符串转换为驼峰式
  20. 纯电阻电路的分析方法——结点电压法

热门文章

  1. 2476 购买贺年卡
  2. 曾被“霸凌”的两个孩子:电动汽车与分布式数据库
  3. Java面试准备(一)——Java基础
  4. goLang 如何开发 windows 窗口界面
  5. Python 比较不错的社区
  6. Uniapp自定义相机界面
  7. Oracle索引梳理系列(十)- 直方图使用技巧及analyze table操作对直方图统计的影响(谨慎使用)...
  8. 广义相对论基础【3】平移联络
  9. 微信公众号(服务号/订阅号/小程序)注册详细流程
  10. 马克鳗(美术设计稿标注工具)