C#如何读取身份证阅读器

本文档展示了如何使用C#读取新中新二代身份证阅读器DKQ-A16D的数据,包括姓名、性别、民族、出生日期等信息,并提供了与SynIDCardAPI.dll交互的静态类及方法,如设置图片格式、命名方式、日期格式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不同的身份证读卡器,其动态库不一样,新中新二代身份证阅读器,型号: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;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值