身份证读取

在找读取身份证动态库(dll) 文件时,发现这么一篇好文章,有兴趣学习一下!

----------------

这份代码,主要是根据api文档来写的,文档上提供了各个方法的使用说明,并且有一个示例代码。以及网上找到的代码。

    首先,需要2dllsdtapi.dll,用来读取身份证上的基本信息;WltRS.dll,用来解析照片,身份证上的照片。这两个文件放在bin目录的debug中,或者release中。然后对于sdtapi.dll该动态链接库,若用的是2004年左右的,需要一个temp.lib的授权文件;但是2005年左右的,则不需要了。

    然后引入动态链接库中的方法,里面的方法都是参考网上的资料和文档写出来的。新建一个名叫DllMoudle的类,里面有7个方法,通过DllImport链接库导入,导入。方法主要是SDT_OpenPort,打开端口号和 SDT_ClosePort关闭端口号,SDT_StartFindIDCard开始找卡,SDT_SelectIDCard选择卡,以及SDT_ReadBaseMsg读取基本信息,和SDT_ReadBaseMsgToFile从文件中读取基本信息,以及GetBmp获取图片。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class DllMoudle  
  2.    {  
  3.        #region "dll声明"  
  4.        /// <summary>  
  5.        /// 打开串口/USB。   
  6.        /// </summary>  
  7.        /// <param name="iPort">[in] 整数, 表示端口号。 1-16(十进制)为串口,1001-1016(十进制)为USB口,缺省的一个USB 设备端口号是 1001。</param>  
  8.        /// <returns>0x90 打开端口成功;1 打开端口失败/端口号不合法</returns>  
  9.        [DllImport("sdtapi.dll", CallingConvention = CallingConvention.StdCall)]  
  10.        public static extern int SDT_OpenPort(int iPort);  
  11.        /// <summary>  
  12.        /// 关闭串口/USB。  
  13.        /// </summary>  
  14.        /// <param name="iPort">[in] 整数,表示端口号。</param>  
  15.        /// <returns>0x90 关闭端口成功。 0x01 端口号不合法</returns>  
  16.        [DllImport("sdtapi.dll", CallingConvention = CallingConvention.StdCall)]  
  17.        public static extern int SDT_ClosePort(int iPort);  
  18.        /// <summary>  
  19.        /// 读卡  
  20.        /// </summary>  
  21.        /// <param name="iPort"></param>  
  22.        /// <param name="pucManaInfo">证/卡芯片管理号, 4 个字节。</param>  
  23.        /// <param name="iIfOpen"></param>  
  24.        /// <returns>0x9f 找卡成功;0x80 找卡失败</returns>  
  25.        [DllImport("sdtapi.dll", CallingConvention = CallingConvention.StdCall)]  
  26.        public static extern int SDT_StartFindIDCard (int iPort,  byte[] pucManaInfo,int iIfOpen);  
  27.        /// <summary>  
  28.        /// 选择卡  
  29.        /// </summary>  
  30.        /// <param name="iPort"></param>  
  31.        /// <param name="pucManaMsg">卡体管理号,28 字节。</param>  
  32.        /// <param name="iIfOpen"></param>  
  33.        /// <returns>0x90 读成功;其他 读失败(具体含义参见返回码表</returns>  
  34.        [DllImport("sdtapi.dll",CallingConvention = CallingConvention.StdCall)]  
  35.        public static extern int SDT_SelectIDCard (int iPort , byte[] pucManaMsg,int iIfOpen);  
  36.        /// <summary>  
  37.        /// 读取基本数据  
  38.        /// </summary>  
  39.        /// <param name="iPort"></param>  
  40.        /// <param name="pucCHMsg"></param>  
  41.        /// <param name="puiCHMsgLen"></param>  
  42.        /// <param name="pucPHMsg"></param>  
  43.        /// <param name="puiPHMsgLen"></param>  
  44.        /// <param name="iIfOpen"></param>  
  45.        /// <returns></returns>  
  46.        [DllImport("sdtapi.dll",CallingConvention = CallingConvention.StdCall)]  
  47.        public static extern int SDT_ReadBaseMsg(int iPort, byte[] pucCHMsg, ref UInt32 puiCHMsgLen, byte[] pucPHMsg, ref UInt32 puiPHMsgLen, int iIfOpen);  
  48.        /// <summary>  
  49.        /// 读取图片;  
  50.        /// </summary>  
  51.        /// <param name="file_name">wlt文件名,后缀是.wlt</param>  
  52.        /// <param name="Port"></param>  
  53.        /// <returns>1,正确;0,-1,-2,。。。-6</returns>  
  54.        [DllImport("WltRS.dll",CallingConvention = CallingConvention.StdCall)]  
  55.        public static extern int GetBmp(String file_name, int Port);  
  56.        [DllImport("sdtapi.dll")]  
  57.        public static extern int SDT_ReadBaseMsgToFile(int iPortID, string fileName1, ref UInt32 puiCHMsgLen, string fileName2, ref UInt32 puiPHMsgLen, int iIfOpen);  
  58.        #endregion  
  59.   
  60.    }  

    现在这些方法就可以用了。

    然后建立了一个实体clsEDZ,用来存放身份证上的基本信息。包括图片,二进制的和Image的。还有由于身份证上sexnation读取到的都是code,根据code,拿到真正的值。如sex若是1,则是男;民族若是01,则是汉族。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class clsEDZ  
  2.     {  
  3.         private SortedList lstMZ = new SortedList();  
  4.         private string _Name;                      //姓名  
  5.         private string _Sex_Code;                  //性别代码  
  6.         private string _Sex_CName;                 //性别  
  7.         private string _IDC;                       //身份证号码  
  8.         private string _NATION_Code;               //民族代码  
  9.         private string _NATION_CName;              //民族  
  10.         private DateTime _BIRTH;                   //出生日期  
  11.         private string _ADDRESS;                   //住址  
  12.         private string _REGORG;                    //签发机关  
  13.         private DateTime _STARTDATE;               //身份证有效起始日期  
  14.         private DateTime _ENDDATE;                 //身份证有效截至日期  
  15.         private string _Period_Of_Validity_Code;   //有效期限代码,许多原来系统上面为了一代证考虑,常常存在这样的字段,二代证中已经没有了  
  16.         private string _Period_Of_Validity_CName;  //有效期限  
  17.         private byte[] _PIC_Byte;                  //照片二进制  
  18.         private Image _PIC_Image;                 //照片  
  19.   
  20.         public clsEDZ()  
  21.         {  
  22.             lstMZ.Add("01""汉族");  
  23.             lstMZ.Add("02""蒙古族");  
  24.             lstMZ.Add("03""回族");  
  25.             lstMZ.Add("04""藏族");  
  26.             lstMZ.Add("05""维吾尔族");  
  27.             lstMZ.Add("06""苗族");  
  28.             lstMZ.Add("07""彝族");  
  29.             lstMZ.Add("08""壮族");  
  30.             lstMZ.Add("09""布依族");  
  31.             lstMZ.Add("10""朝鲜族");  
  32.             lstMZ.Add("11""满族");  
  33.             lstMZ.Add("12""侗族");  
  34.             lstMZ.Add("13""瑶族");  
  35.             lstMZ.Add("14""白族");  
  36.             lstMZ.Add("15""土家族");  
  37.             lstMZ.Add("16""哈尼族");  
  38.             lstMZ.Add("17""哈萨克族");  
  39.             lstMZ.Add("18""傣族");  
  40.             lstMZ.Add("19""黎族");  
  41.             lstMZ.Add("20""傈僳族");  
  42.             lstMZ.Add("21""佤族");  
  43.             lstMZ.Add("22""畲族");  
  44.             lstMZ.Add("23""高山族");  
  45.             lstMZ.Add("24""拉祜族");  
  46.             lstMZ.Add("25""水族");  
  47.             lstMZ.Add("26""东乡族");  
  48.             lstMZ.Add("27""纳西族");  
  49.             lstMZ.Add("28""景颇族");  
  50.             lstMZ.Add("29""柯尔克孜族");  
  51.             lstMZ.Add("30""土族");  
  52.             lstMZ.Add("31""达翰尔族");  
  53.             lstMZ.Add("32""仫佬族");  
  54.             lstMZ.Add("33""羌族");  
  55.             lstMZ.Add("34""布朗族");  
  56.             lstMZ.Add("35""撒拉族");  
  57.             lstMZ.Add("36""毛南族");  
  58.             lstMZ.Add("37""仡佬族");  
  59.             lstMZ.Add("38""锡伯族");  
  60.             lstMZ.Add("39""阿昌族");  
  61.             lstMZ.Add("40""普米族");  
  62.             lstMZ.Add("41""塔吉克族");  
  63.             lstMZ.Add("42""怒族");  
  64.             lstMZ.Add("43""乌孜别克族");  
  65.             lstMZ.Add("44""俄罗斯族");  
  66.             lstMZ.Add("45""鄂温克族");  
  67.             lstMZ.Add("46""德昂族");  
  68.             lstMZ.Add("47""保安族");  
  69.             lstMZ.Add("48""裕固族");  
  70.             lstMZ.Add("49""京族");  
  71.             lstMZ.Add("50""塔塔尔族");  
  72.             lstMZ.Add("51""独龙族");  
  73.             lstMZ.Add("52""鄂伦春族");  
  74.             lstMZ.Add("53""赫哲族");  
  75.             lstMZ.Add("54""门巴族");  
  76.             lstMZ.Add("55""珞巴族");  
  77.             lstMZ.Add("56""基诺族");  
  78.             lstMZ.Add("57""其它");  
  79.             lstMZ.Add("98""外国人入籍");  
  80.         }  
  81.   
  82.         public string Name  
  83.         {  
  84.             get { return _Name; }  
  85.             set { _Name = value; }  
  86.         }  
  87.         public string Sex_Code  
  88.         {  
  89.             get { return _Sex_Code; }  
  90.             set  
  91.             {  
  92.                 _Sex_Code = value;  
  93.                 switch (value)  
  94.                 {  
  95.                     case "1":  
  96.                         Sex_CName = "男";  
  97.                         break;  
  98.                     case "2":  
  99.                         Sex_CName = "女";  
  100.                         break;  
  101.                 }  
  102.             }  
  103.         }  
  104.         public string Sex_CName  
  105.         {  
  106.             get { return _Sex_CName; }  
  107.             set { _Sex_CName = value; }  
  108.         }  
  109.         public string IDC  
  110.         {  
  111.             get { return _IDC; }  
  112.             set { _IDC = value; }  
  113.         }  
  114.         public string NATION_Code  
  115.         {  
  116.             get { return _NATION_Code; }  
  117.             set  
  118.             {  
  119.                 _NATION_Code = value;  
  120.                 if (lstMZ.Contains(value))  
  121.                     NATION_CName = lstMZ[value].ToString();  
  122.             }  
  123.         }  
  124.         public string NATION_CName  
  125.         {  
  126.             get { return _NATION_CName; }  
  127.             set { _NATION_CName = value; }  
  128.         }  
  129.         public DateTime BIRTH  
  130.         {  
  131.             get { return _BIRTH; }  
  132.             set { _BIRTH = value; }  
  133.         }  
  134.         public string ADDRESS  
  135.         {  
  136.             get { return _ADDRESS; }  
  137.             set { _ADDRESS = value; }  
  138.         }  
  139.         public string REGORG  
  140.         {  
  141.             get { return _REGORG; }  
  142.             set { _REGORG = value; }  
  143.         }  
  144.         public DateTime STARTDATE  
  145.         {  
  146.             get { return _STARTDATE; }  
  147.             set { _STARTDATE = value; }  
  148.         }  
  149.         public DateTime ENDDATE  
  150.         {  
  151.             get { return _ENDDATE; }  
  152.             set  
  153.             {  
  154.                 _ENDDATE = value;  
  155.                 if (_ENDDATE == DateTime.MaxValue)  
  156.                 {  
  157.                     _Period_Of_Validity_Code = "3";  
  158.                     _Period_Of_Validity_CName = "长期";  
  159.                 }  
  160.                 else  
  161.                 {  
  162.                     if (_STARTDATE != DateTime.MinValue)  
  163.                     {  
  164.                         switch (value.AddDays(1).Year - _STARTDATE.Year)  
  165.                         {  
  166.                             case 5:  
  167.                                 _Period_Of_Validity_Code = "4";  
  168.                                 _Period_Of_Validity_CName = "5年";  
  169.                                 break;  
  170.                             case 10:  
  171.                                 _Period_Of_Validity_Code = "1";  
  172.                                 _Period_Of_Validity_CName = "10年";  
  173.                                 break;  
  174.                             case 20:  
  175.                                 _Period_Of_Validity_Code = "2";  
  176.                                 _Period_Of_Validity_CName = "20年";  
  177.                                 break;  
  178.                         }  
  179.                     }  
  180.                 }  
  181.   
  182.             }  
  183.         }  
  184.         public string Period_Of_Validity_Code  
  185.         {  
  186.             get { return _Period_Of_Validity_Code; }  
  187.             set { _Period_Of_Validity_Code = value; }  
  188.         }  
  189.         public string Period_Of_Validity_CName  
  190.         {  
  191.             get { return _Period_Of_Validity_CName; }  
  192.             set { _Period_Of_Validity_CName = value; }  
  193.         }  
  194.         public byte[] PIC_Byte  
  195.         {  
  196.             get { return _PIC_Byte; }  
  197.             set { _PIC_Byte = value; }  
  198.         }  
  199.         public Image PIC_Image  
  200.         {  
  201.             get { return _PIC_Image; }  
  202.             set { _PIC_Image = value; }  
  203.         }  
  204.    
  205.   
  206.     }  
    再新建一个窗体readIdCard。在页面上加上一个文本框和button按钮,按钮点击一下读一下身份证信息,文本框显示返回的身份证信息。然后还有一个picturebox放照片。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public partial class readIdCard : Form  
  2.     {  
  3.         //接收身份证信息的实体  
  4.         private clsEDZ objEDZ = new clsEDZ();  
  5.   
  6.         //构造函数  
  7.         public readIdCard()  
  8.         {  
  9.             InitializeComponent();  
  10.         }  
  11.   
  12.         //读卡  
  13.         private void button1_Click(object sender, EventArgs e)  
  14.         {  
  15.                 usbIdCard();  
  16.         }  
  17.   
  18.         private void usbIdCard() {  
  19.             //声明变量  
  20.             DialogResult dr;  
  21.             int iRet    = 0x90;          //返回码  
  22.             int iPort   = 1001;          //端口号  
  23.             int iIfOpen =  1;             //是否需要打开端口  
  24.             byte[] pubManaInfo = new byte[255];    //身份证管理号信息  
  25.             byte[] pubManaMsg  = new byte[255];    //  
  26.             byte[] pubCHMsg    = new byte[512];  //文字信息  
  27.             byte[] pubPHMsg    = new byte[3024]; //照片信息  
  28.             byte[] pubFPMsg    = new byte[1024]; //指纹信息  
  29.             UInt32 puiCHMsgLen = 0;              //文字信息的长度  
  30.             UInt32 puiPHMsgLen = 0;              //照片信息的长度  
  31.   
  32.             //打开端口  
  33.             if (iIfOpen == 0) {  
  34.                 iRet = DllMoudle.SDT_OpenPort(iPort);  
  35.                 //若打开端口不成功  
  36.                 if (iRet != 0x90) {  
  37.                     MessageBox.Show("SDT_OpenPort Error,Error Code Is: " + iRet);  
  38.                     //关闭端口  
  39.                     DllMoudle.SDT_ClosePort(iPort);  
  40.                     return;  
  41.                 }  
  42.             }  
  43.               
  44.             //找卡  
  45.             do {  
  46.                 //开始找卡  
  47.                 iRet = DllMoudle.SDT_StartFindIDCard(iPort, pubManaInfo, iIfOpen);  
  48.   
  49.                 if(iRet == 0x9f){  
  50.                     //找到之后,选择卡  
  51.                     iRet = DllMoudle.SDT_SelectIDCard(iPort, pubManaMsg, iIfOpen);  
  52.                     if (iRet == 0x90) {  
  53.                         break;  
  54.                     }  
  55.                 }  
  56.   
  57.                 //若找不到卡,提示  
  58.                 dr = MessageBox.Show("尚未找到卡,您是否想继续找卡?""找卡提示",  
  59.                         MessageBoxButtons.YesNo,  
  60.                         MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);  
  61.             }   
  62.             //一直找卡,直到取消找卡  
  63.             while ( dr == DialogResult.Yes);  
  64.   
  65.             //读卡信息  
  66.             iRet = DllMoudle.SDT_ReadBaseMsg(iPort, pubCHMsg,ref puiCHMsgLen,pubPHMsg,ref puiPHMsgLen,iIfOpen);  
  67.             if (iRet != 0x90) {  
  68.                 //不成功,关闭端口,退出  
  69.                 MessageBox.Show("SDT_ReadBaseMsg Error,Error Code Is: " + iRet);  
  70.                 closePort(iPort, iIfOpen);  
  71.                 return;  
  72.             }  
  73.   
  74.             //读卡成功  
  75.             //显示结果集  
  76.             textBox1.Text = System.Text.ASCIIEncoding.Unicode.GetString(pubCHMsg);  
  77.                
  78.             //注意,在这里,用户必须有应用程序当前目录的读写权限  
  79.             //删除掉这些文件  
  80.             FileInfo objFile = new FileInfo("wz.txt");  
  81.             if (objFile.Exists)  
  82.             {  
  83.                 objFile.Attributes = FileAttributes.Normal;  
  84.                 objFile.Delete();  
  85.             }  
  86.             objFile = new FileInfo("zp.bmp");  
  87.             if (objFile.Exists)  
  88.             {  
  89.                 objFile.Attributes = FileAttributes.Normal;  
  90.                 objFile.Delete();  
  91.             }  
  92.             objFile = new FileInfo("zp.wlt");  
  93.             if (objFile.Exists)  
  94.             {  
  95.                 objFile.Attributes = FileAttributes.Normal;  
  96.                 objFile.Delete();  
  97.             }  
  98.   
  99.             //将基本信息写到wz.txt中,将照片信息写到zp.wlt文件中  
  100.             iRet = DllMoudle.SDT_ReadBaseMsgToFile(iPort, "wz.txt"ref puiCHMsgLen, "zp.wlt"ref puiPHMsgLen, iIfOpen);  
  101.             if (iRet != 144)  
  102.             {  
  103.                 iRet = DllMoudle.SDT_ClosePort(iPort);  
  104.                 MessageBox.Show("读卡失败!""提示", MessageBoxButtons.OK, MessageBoxIcon.Error);  
  105.                 return;  
  106.             }  
  107.   
  108.   
  109.             //下面解析照片,注意,如果在C盘根目录下没有机具厂商的授权文件Termb.Lic,照片解析将会失败  
  110.             //用2表示usb口,1表示串口。将zp.wlt转换为照片zp.bmp。  
  111.             bool falg = true;  
  112.             if (falg)  
  113.                 iRet = DllMoudle.GetBmp("zp.wlt", 2);  
  114.             else  
  115.                 iRet = DllMoudle.GetBmp("zp.wlt", 1);  
  116.             switch (iRet)  
  117.             {  
  118.                 case 0:  
  119.                     MessageBox.Show("调用sdtapi.dll错误!""提示", MessageBoxButtons.OK, MessageBoxIcon.Error);  
  120.                     break;  
  121.                 case 1:   //正常  
  122.                     break;  
  123.                 case -1:  
  124.                     MessageBox.Show("相片解码错误!""提示", MessageBoxButtons.OK, MessageBoxIcon.Error);  
  125.                     break;  
  126.                 case -2:  
  127.                     MessageBox.Show("wlt文件后缀错误!""提示", MessageBoxButtons.OK, MessageBoxIcon.Error);  
  128.                     break;  
  129.                 case -3:  
  130.                     MessageBox.Show("wlt文件打开错误!""提示", MessageBoxButtons.OK, MessageBoxIcon.Error);  
  131.                     break;  
  132.                 case -4:  
  133.                     MessageBox.Show("wlt文件格式错误!""提示", MessageBoxButtons.OK, MessageBoxIcon.Error);  
  134.                     break;  
  135.                 case -5:  
  136.                     MessageBox.Show("软件未授权!""提示", MessageBoxButtons.OK, MessageBoxIcon.Error);  
  137.                     break;  
  138.                 case -6:  
  139.                     MessageBox.Show("设备连接错误!""提示", MessageBoxButtons.OK, MessageBoxIcon.Error);  
  140.                     break;  
  141.             }  
  142.             //如果照片解析成功,则将照片,将从wz.txt中的内容赋值给二进制的bt  
  143.             iRet = DllMoudle.SDT_ClosePort(iPort);  
  144.             FileInfo f = new FileInfo("wz.txt");  
  145.             FileStream fs = f.OpenRead();  
  146.             byte[] bt = new byte[fs.Length];  
  147.             fs.Read(bt, 0, (int)fs.Length);  
  148.             fs.Close();  
  149.    
  150.             //然后根据位数分割,获取到相应的值,前30为是姓名,31-32是性别的编码。等等依次类推  
  151.             objEDZ.Name = System.Text.UnicodeEncoding.Unicode.GetString(bt, 0, 30).Trim();  
  152.             objEDZ.Sex_Code = System.Text.UnicodeEncoding.Unicode.GetString(bt, 30, 2).Trim();  
  153.             objEDZ.NATION_Code = System.Text.UnicodeEncoding.Unicode.GetString(bt, 32, 4).Trim();  
  154.             string strBird = System.Text.UnicodeEncoding.Unicode.GetString(bt, 36, 16).Trim();  
  155.             objEDZ.BIRTH = Convert.ToDateTime(strBird.Substring(0, 4) + "年" + strBird.Substring(4, 2) + "月" + strBird.Substring(6) + "日");  
  156.             objEDZ.ADDRESS = System.Text.UnicodeEncoding.Unicode.GetString(bt, 52, 70).Trim();  
  157.             objEDZ.IDC = System.Text.UnicodeEncoding.Unicode.GetString(bt, 122, 36).Trim();  
  158.             objEDZ.REGORG = System.Text.UnicodeEncoding.Unicode.GetString(bt, 158, 30).Trim();  
  159.             string strTem = System.Text.UnicodeEncoding.Unicode.GetString(bt, 188, bt.GetLength(0) - 188).Trim();  
  160.             objEDZ.STARTDATE = Convert.ToDateTime(strTem.Substring(0, 4) + "年" + strTem.Substring(4, 2) + "月" + strTem.Substring(6, 2) + "日");  
  161.             strTem = strTem.Substring(8);  
  162.             if (strTem.Trim() != "长期")  
  163.             {  
  164.                 objEDZ.ENDDATE = Convert.ToDateTime(strTem.Substring(0, 4) + "年" + strTem.Substring(4, 2) + "月" + strTem.Substring(6, 2) + "日");  
  165.             }  
  166.             else  
  167.             {  
  168.                 objEDZ.ENDDATE = DateTime.MaxValue;  
  169.             }  
  170.   
  171.             //找到zp.bmp照片  
  172.             objFile = new FileInfo("zp.bmp");  
  173.             //若找存在,则将照片通过文件流中督考imgbyte的二进制中,然后用Memorystream流中创建图片Image,  
  174.              //放到身份证的Image照片上;而imgbyte则放到照片的二进制中。最后将图片和memorystream都摧毁。  
  175.             if (objFile.Exists)  
  176.             {  
  177.                 FileStream fss = new FileStream("zp.bmp", FileMode.Open);  
  178.                 byte[] imgbyte = new byte[(int)objFile.Length];  
  179.                 fss.Read(imgbyte, 0, (int)objFile.Length);  
  180.                 fss.Close();  
  181.                 MemoryStream ms = new MemoryStream(imgbyte);  
  182.                 Image img = Image.FromStream(ms);  
  183.                 objEDZ.PIC_Image = (Image)img.Clone();  
  184.                 objEDZ.PIC_Byte = imgbyte;  
  185.                 img.Dispose();  
  186.                 ms.Dispose();  
  187.             }  
  188.   
  189.             //最后界面显示值和照片  
  190.             textBox1.Text = textBox1.Text +  objEDZ.Name+objEDZ.Sex_Code + objEDZ.NATION_Code +  objEDZ.BIRTH + objEDZ.ADDRESS + objEDZ.IDC + objEDZ.REGORG + objEDZ.STARTDATE  +  objEDZ.ENDDATE;  
  191.             pictureBox1.Image = objEDZ.PIC_Image;  
  192.                   
  193.         }  
  194.   
  195.         /// <summary>  
  196.         /// 关闭端口  
  197.         /// </summary>  
  198.         /// <param name="iPort">端口号</param>  
  199.         /// <param name="iIfOpen">是否开启</param>  
  200.         private void closePort(int iPort,int iIfOpen) {  
  201.             if (iIfOpen == 0)  
  202.             {  
  203.                 DllMoudle.SDT_ClosePort(iPort);  
  204.             }  
  205.         }  
  206.  }  

    以上就是读取身份证的简单版的代码,基本核心就是这些。其中由于我知道我们用的直接是usb口,所以iPort直接写的是1001,如果不知道的情况下,就需要做循环,将1-161001-1016都循环个遍,才行。并且对于iIfOpen是否自动开启端口,我没体会出这个的作用。


原文地址:http://blog.csdn.net/liuyanlinglanq/article/details/45390553

猜你喜欢

转载自blog.csdn.net/hackage4619/article/details/73500590