C# 精伦210读卡器读卡

最近在做酒店的系统。对接了不少读卡器。先把IDR210读卡器的代码贴出来。

           /// <summary>
            /// dll文件读取的方法
            /// </summary>
            /// <param name="strDllName"></param>
            /// <returns></returns>
            public static class IDR210
            {

                [DllImport("kernel32")]
                public static extern int LoadLibrary(string strDllName);
                [DllImport("sdtapi.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
                public static extern int SDT_OpenPort(int iPort);
                [DllImport("sdtapi.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
                public static extern int SDT_ClosePort(int iPort);
                [DllImport("sdtapi.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
                public static extern int SDT_StartFindIDCard(int iPort, ref byte pRAPDU, int iIfOpen);
                [DllImport("sdtapi.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
                public static extern int SDT_SelectIDCard(int iPort, ref byte pRAPDU, int iIfOpen);
                [DllImport("sdtapi.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
                public static extern int SDT_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref int puiCHMsgLen, ref byte pucPHMsg, ref int puiPHMsgLen, int iIfOpen);
                [DllImport("sdtapi.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
                public static extern int SDT_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref int puiAppMsgLen, int iIfOpen);
                [DllImport("WltRS.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)]
                public static extern int GetBmp(string filename, int nType);
            }

下面定义了一个简单的接收数据类

  /// <summary>
    /// 读卡器数据返回类
    /// </summary>
    public class CardReader
    {
        /// <summary>
        /// 身份证信息
        /// </summary>
        public CardReader_Data Data { get; set; }
        /// <summary>
        /// 读卡器异常消息
        /// </summary>
        public string Msg { get; set; }
    }
        public class CardReader_Data
        {
            /// <summary>
            /// 姓名
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// 性别
            /// </summary>
            public string Sex { get; set; }
            /// <summary>
            /// 地址
            /// </summary>
            public string Address { get; set; }
            /// <summary>
            /// 名族
            /// </summary>
            public string Folk { get; set; }
            /// <summary>
            /// 出生日期
            /// </summary>
            public string BirthDay { get; set; }
            /// <summary>
            /// 身份证号
            /// </summary>
            public string IDCard { get; set; }
            /// <summary>
            /// 图片地址
            /// </summary>
            public string ImgPath { get; set; }

        }

读卡方法

	/// <summary>
    /// 读卡操作
    /// </summary>
     /// <returns></returns>
       public static CardReader Reader()
       {
            try
            {
                CardReader Read = new CardReader();
                CardReader_Data Data = new CardReader_Data();
                bool m_bNIDapi = false;
                //读取到的 ID 卡内文字信息, 
                byte[] pucCHMsg = new byte[512];
                //,读取到的 ID 卡内照片信息 
                byte[] pucPHMsg = new byte[1024];
                int puiCHMsgLen = 512;
                int puiPHMsgLen = 1024;
                int m_nOpenPort = 0;
                bool m_bIsIDCardLoaded = false;
                ///判断dll文件是否存在,dll文件存放在Debug文件夹下
                int nRet = IDR210.LoadLibrary("sdtapi.dll");
                if (nRet == 0)
                {
                    Read.Msg = "精伦IDR210:未找到sdtapi.dll文件";
                    return Read;
                }
                //判断是否连接读卡器
                for (int iPort = 1001; iPort < 1017; iPort = iPort + 1)
                {
                    int a = IDR210.SDT_OpenPort(iPort);
                    if (a == 0x90)
                    {
                        m_nOpenPort = iPort;
                        m_bNIDapi = true;
                        break;
                    }
                }
                if (!m_bNIDapi)
                {
                    Read.Msg = "精伦IDR210:连接至读卡器失败!";
                    return Read;
                }
                byte[] pRAPDU = new byte[30];
                byte[] pucAppMsg = new byte[320];
                int len = 320;
                nRet = IDR210.SDT_ReadNewAppMsg(m_nOpenPort, ref pucAppMsg[0], ref len, 0);
                /*if (nRet == 0x91 || nRet == 0x90)
                 {
                   Read.Msg = "精伦IDR210:此身份证信息已经读取过!";
                    return Read;
                 }*/
                nRet = IDR210.SDT_StartFindIDCard(m_nOpenPort, ref pRAPDU[0], 0);
                if (nRet != 0x9F)
                {
                    Read.Msg = "精伦IDR210:请重新放置身份证!";
                    return Read;
                }
                if (IDR210.SDT_SelectIDCard(m_nOpenPort, ref pRAPDU[0], 0) != 0x90)
                {
                    Read.Msg = "精伦IDR210:读取身份证信息失败!";
                    return Read;
                }
                nRet = IDR210.SDT_ReadBaseMsg(m_nOpenPort, ref pucCHMsg[0], ref puiCHMsgLen, ref pucPHMsg[0], ref puiPHMsgLen, 0);
                if (nRet != 0x90 && nRet != 144)
                {
                    Read.Msg = "精伦IDR210:读取身份证信息失败!";
                    return Read;
                }
                Data.Name = GetEpr6000Name(puiCHMsgLen, pucCHMsg);
                Data.Sex = GetSex(puiCHMsgLen, pucCHMsg);
                Data.BirthDay = DateTime.ParseExact(GetBirthday(puiCHMsgLen, pucCHMsg), "yyyyMMdd", null).ToString();
                Data.Address = GetAddress(puiCHMsgLen, pucCHMsg);
                Data.IDCard = GetIDCode(puiCHMsgLen, pucCHMsg);
                //保存wlt文件。然后从Wlt文件里面读取图片信息。保存图片
                string uuid = Guid.NewGuid().ToString();
                string path = string.Format("{0}\\Images", Application.StartupPath);
                string savepath = string.Format("{0}\\{1}.wlt", path, uuid);
                FileStream fs;
                fs = new FileStream(savepath, FileMode.Create, FileAccess.ReadWrite);
                fs.Write(pucPHMsg, 0, pucPHMsg.Length);
                fs.Close();
                IDR210.GetBmp(savepath, 2);
                Data.ImgPath = path + string.Format("\\{0}.bmp", uuid);
                Read.Data = Data;
                return Read;
            }
            Catch
            {
                Card.Msg = "精伦IDR210:读取身份证信息出错!";
                return Card;
            }
       }

读取信息的方法

 /// <summary>
    /// 获取姓名
    /// </summary>
    /// <returns></returns>
    public static string GetEpr6000Name(int puiCHMsgLen, byte[] pucCHMsg)
    {
        string Name = "";
        if (puiCHMsgLen == 0)
        {
            return "";
        }
        Name = System.Text.Encoding.Unicode.GetString(pucCHMsg, 0, 30);
        return Name.Trim();
    }
    /// <summary>
    /// 获取性别
    /// </summary>
    /// <returns></returns>
    public static string GetSex(int puiCHMsgLen, byte[] pucCHMsg)
    {
        if (puiCHMsgLen == 0)
        {
            return " ";
        }

        byte sex = pucCHMsg[30];

        if (sex == '1')
        {
            return "男";
        }
        else
            return "女";

    }
    /// <summary>
    ///获取名族
    /// </summary>
    /// <returns></returns>
    public static string GetPeople(int puiCHMsgLen, byte[] pucCHMsg)
    {
        string str = "";
        if (puiCHMsgLen == 0)
        {
            return " ";
        }

        str = System.Text.Encoding.Unicode.GetString(pucCHMsg, 32, 4);
        switch (str)
        {
            case "01": return "汉";
            case "02": return "蒙古";
            case "03": return "回";
            case "04": return "藏";
            case "05": return "维吾尔";
            case "06": return "苗";
            case "07": return "彝";
            case "08": return "壮";
            case "09": return "布依";
            case "10": return "朝鲜";
            case "11": return "满";
            case "12": return "侗";
            case "13": return "瑶";
            case "14": return "白";
            case "15": return "土家";
            case "16": return "哈尼";
            case "17": return "哈萨克";
            case "18": return " 傣";
            case "19": return " 黎";
            case "20": return " 傈僳";
            case "21": return " 佤";
            case "22": return " 畲";
            case "23": return " 高山";
            case "24": return " 拉祜";
            case "25": return " 水";
            case "26": return " 东乡";
            case "27": return " 纳西";
            case "28": return " 景颇";
            case "29": return " 柯尔克孜";
            case "30": return " 土";
            case "31": return " 达斡尔";
            case "32": return " 仫佬";
            case "33": return "羌";
            case "34": return "布朗";
            case "35": return "撒拉";
            case "36": return "毛南";
            case "37": return "仡佬";
            case "38": return "锡伯";
            case "39": return "阿昌";
            case "40": return "普米";
            case "41": return "塔吉克";
            case "42": return "怒";
            case "43": return "乌孜别克";
            case "44": return "俄罗斯";
            case "45": return "鄂温克";
            case "46": return "德昂";
            case "47": return "保安";
            case "48": return "裕固";
            case "49": return "京";
            case "50": return "塔塔尔";
            case "51": return "独龙";
            case "52": return "鄂伦春";
            case "53": return "赫哲";
            case "54": return "门巴";
            case "55": return "珞巴";
            case "56": return "基诺";
            case "97": return "其他";
            case "98": return "外国血统中国籍人士";
            default: return "";
        }
    }
    /// <summary>
    /// 返回生日
    /// </summary>
    /// <returns></returns>
    public static string GetBirthday(int puiCHMsgLen, byte[] pucCHMsg)
    {

        if (puiCHMsgLen == 0)
        {
            return " ";
        }
        return System.Text.Encoding.Unicode.GetString(pucCHMsg, 36, 16).Trim();
    }
    /// <summary>
    /// 返回地址
    /// </summary>
    /// <param name="puiCHMsgLen"></param>
    /// <param name="pucCHMsg"></param>
    /// <returns></returns>
    public static string GetAddress(int puiCHMsgLen, byte[] pucCHMsg)
    {
        if (puiCHMsgLen == 0)
            return " ";
        return System.Text.Encoding.Unicode.GetString(pucCHMsg, 52, 70);
    }
    /// <summary>
    /// 返回身份证号码
    /// </summary>
    /// <returns></returns>
    public static string GetIDCode(int puiCHMsgLen, byte[] pucCHMsg)
    {
        if (puiCHMsgLen == 0)
            return "";
        return System.Text.Encoding.Unicode.GetString(pucCHMsg, 122, 36).Trim();
    }
    /// <summary>
    /// 返回签发机关
    /// </summary>
    /// <returns></returns>
    public static string GetAuthority(int puiCHMsgLen, byte[] pucCHMsg)
    {
        if (puiCHMsgLen == 0)
            return " ";
        return System.Text.Encoding.Unicode.GetString(pucCHMsg, 158, 30).Trim();
    }
    /// <summary>
    /// 返回起始有效期限 如有效期2010~2020
    /// </summary>
    /// <returns></returns>
    public static string GetIssueDay(int puiCHMsgLen, byte[] pucCHMsg)
    {
        if (puiCHMsgLen == 0)
            return "";
        return System.Text.Encoding.Unicode.GetString(pucCHMsg, 188, 16);
    }
    /// <summary>
    /// 返回结束有效期限 如有效期2010~2020
    /// </summary>
    /// <returns></returns>
    public static string GetExpityDay(int puiCHMsgLen, byte[] pucCHMsg)
    {
        if (puiCHMsgLen == 0)
            return "";
        return System.Text.Encoding.Unicode.GetString(pucCHMsg, 204, 16); ;
    }

DLL文件下载
提取码 qouj

猜你喜欢

转载自blog.csdn.net/S1lenceAAA/article/details/90445211
今日推荐