一客户有个.net 2.0的网站,主要在内网使用,里边一个功能是输入包含身份证信息的记录。现在客户嫌手工输入身份证信息麻烦且容易出错,想改成用读卡器读取身份证信息并自动显示在添加记录页面的相应文本框中,比如:姓名,身份证号码,地址等。客户说自己找身份证读卡器厂家做读卡器的开发。我怎么把厂家给的东西和这个添加页面联系起来呢?我需要厂家提供什么东西?以前没做过,希望高手赐教。

解决方案 »

  1.   

    有专门提供身份证阅读器的。using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Reflection;
    using System.IO;
    namespace ICCard
    {
        public class clsICCard
        {
            public delegate void De_ReadICCardComplete(clsEDZ objEDZ);
            public event De_ReadICCardComplete ReadICCardComplete;
            private clsEDZ objEDZ = new clsEDZ();
            private int EdziIfOpen = 1;               //自动开关串口
            int EdziPortID;
            public clsICCard()
            {        }
            public bool ReadICCard()
            {
                bool bUsbPort = false;
                int intOpenPortRtn = 0;
                int rtnTemp = 0;
                int pucIIN = 0;
                int pucSN = 0;
                int puiCHMsgLen = 0;
                int puiPHMsgLen = 0;            objEDZ = new clsEDZ();
                //检测usb口的机具连接,必须先检测usb
                for (int iPort = 1001; iPort <= 1016; iPort++)
                {
                    intOpenPortRtn = SDT_OpenPort(iPort);
                    if (intOpenPortRtn == 144)
                    {
                        EdziPortID = iPort;
                        bUsbPort = true;
                        break;
                    }
                }
                //检测串口的机具连接
                if (!bUsbPort)
                {
                    for (int iPort = 1; iPort <= 2; iPort++)
                    {
                        intOpenPortRtn = SDT_OpenPort(iPort);
                        if (intOpenPortRtn == 144)
                        {
                            EdziPortID = iPort;
                            bUsbPort = false;
                            break;
                        }
                    }
                }
                if (intOpenPortRtn != 144)
                {
                    MessageBox.Show("端口打开失败,请检测相应的端口或者重新连接读卡器!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
                //在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把 EdziPortID 保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,
                //您要考虑机具连接端口被用户改变的情况哦            //下面找卡
                rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen);
                if (rtnTemp != 159)
                {
                    rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen);  //再找卡
                    if (rtnTemp != 159)
                    {
                        rtnTemp = SDT_ClosePort(EdziPortID);
                        MessageBox.Show("未放卡或者卡未放好,请重新放卡!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return false;
                    }
                }
                //选卡
                rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen);
                if (rtnTemp != 144)
                {
                    rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen);  //再选卡
                    if (rtnTemp != 144)
                    {
                        rtnTemp = SDT_ClosePort(EdziPortID);
                        MessageBox.Show("读卡失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return false;
                    }
                }
                //注意,在这里,用户必须有应用程序当前目录的读写权限
                FileInfo objFile = new FileInfo("wz.txt");
                if (objFile.Exists)
                {
                    objFile.Attributes = FileAttributes.Normal;
                    objFile.Delete();
                }
                objFile = new FileInfo("zp.bmp");
                if (objFile.Exists)
                {
                    objFile.Attributes = FileAttributes.Normal;
                    objFile.Delete();
                }
                objFile = new FileInfo("zp.wlt");
                if (objFile.Exists)
                {
                    objFile.Attributes = FileAttributes.Normal;
                    objFile.Delete();
                }
                rtnTemp = SDT_ReadBaseMsgToFile(EdziPortID, "wz.txt", ref puiCHMsgLen, "zp.wlt", ref puiPHMsgLen, EdziIfOpen);
                if (rtnTemp != 144)
                {
                    rtnTemp = SDT_ClosePort(EdziPortID);
                    MessageBox.Show("读卡失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
                //下面解析照片,注意,如果在C盘根目录下没有机具厂商的授权文件Termb.Lic,照片解析将会失败
                if (bUsbPort)
                    rtnTemp = GetBmp("zp.wlt", 2);
                else
                    rtnTemp = GetBmp("zp.wlt", 1);
                switch (rtnTemp)
                {
                    case 0:
                        MessageBox.Show("调用sdtapi.dll错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                    case 1:   //正常
                        break;
                    case -1:
                        MessageBox.Show("相片解码错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                    case -2:
                        MessageBox.Show("wlt文件后缀错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                    case -3:
                        MessageBox.Show("wlt文件打开错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                    case -4:
                        MessageBox.Show("wlt文件格式错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                    case -5:
                        MessageBox.Show("软件未授权!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                    case -6:
                        MessageBox.Show("设备连接错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                }
                rtnTemp = SDT_ClosePort(EdziPortID);
                FileInfo f = new FileInfo("wz.txt");
                FileStream fs = f.OpenRead();
                byte[] bt = new byte[fs.Length];
                fs.Read(bt, 0, (int)fs.Length);
                fs.Close();            string str = System.Text.UnicodeEncoding.Unicode.GetString(bt);            objEDZ.Name = System.Text.UnicodeEncoding.Unicode.GetString(bt, 0, 30).Trim();
                objEDZ.Sex_Code = System.Text.UnicodeEncoding.Unicode.GetString(bt, 30, 2).Trim();
                objEDZ.NATION_Code = System.Text.UnicodeEncoding.Unicode.GetString(bt, 32, 4).Trim();
                string strBird = System.Text.UnicodeEncoding.Unicode.GetString(bt, 36, 16).Trim();
                objEDZ.BIRTH = Convert.ToDateTime(strBird.Substring(0, 4) + "年" + strBird.Substring(4, 2) + "月" + strBird.Substring(6) + "日");
                objEDZ.ADDRESS = System.Text.UnicodeEncoding.Unicode.GetString(bt, 52, 70).Trim();
                objEDZ.IDC = System.Text.UnicodeEncoding.Unicode.GetString(bt, 122, 36).Trim();
                objEDZ.REGORG = System.Text.UnicodeEncoding.Unicode.GetString(bt, 158, 30).Trim();
                string strTem = System.Text.UnicodeEncoding.Unicode.GetString(bt, 188, bt.GetLength(0) - 188).Trim();
                objEDZ.STARTDATE = Convert.ToDateTime(strTem.Substring(0, 4) + "年" + strTem.Substring(4, 2) + "月" + strTem.Substring(6, 2) + "日");
                strTem = strTem.Substring(8);
                if (strTem.Trim() != "长期")
                {
                    objEDZ.ENDDATE = Convert.ToDateTime(strTem.Substring(0, 4) + "年" + strTem.Substring(4, 2) + "月" + strTem.Substring(6, 2) + "日");
                }
                else
                {
                    objEDZ.ENDDATE = DateTime.MaxValue;
                }
                objFile = new FileInfo("zp.bmp");
                if (objFile.Exists)
                {
                    Image img = Image.FromFile("zp.bmp");
                    objEDZ.PIC_Image = (Image)img.Clone();
                    System.IO.MemoryStream m = new MemoryStream();
                    img.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg);
                    objEDZ.PIC_Byte = m.ToArray();
                    img.Dispose();
                    img = null;
                }
                ReadICCardComplete(objEDZ);
                return true;
            }
        }
    }
    去买个 会提供API。