身份证读取

article/2025/9/27 8:36:27

在找读取身份证动态库(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


http://chatgpt.dhexx.cn/article/iD0Zr3Ly.shtml

相关文章

身份证读取设备开发解决方案:1、Windows下开发Qt程序demo读取身份证信息

身份证读取设备开发解决方案&#xff1a;1、Windows下开发Qt程序demo读取身份证信息 文章目录 身份证读取设备开发解决方案&#xff1a;1、Windows下开发Qt程序demo读取身份证信息1. 前言2. 身份证读取模块3. Qt5开发简单上位机读取身份证信息1. 注意的点2. 部分源码3. 结果展示…

最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细)

最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能&#xff08;详细&#xff09; 最近几天有人需要帮忙做一个关于发送验证码的功能&#xff0c;之前没有做过&#xff0c;于是我鼓捣一阵子&#xff0c;记录一下关于web项目中注册登录常用的手机验证码和邮箱验…

uniapp中注册手机号短信验证码

一、效果图 二、输入手机号页面 <template><view><view classlogin-tel><view classtel-main><view classlogin-from><view classlogin-user><text classuser-text>手机号</text><input type"number" focustrue…

阿里云手机验证码注册(可以使用阿里云提供的测试模板,不用个人申请)

目录 打开阿里云&#xff1a;&#xff08;绑定手机号码&#xff09;&#xff0c;不用申请模板和签名手机验证码注册流程&#xff1a;实现流程创建springboot工程&#xff0c;添加依赖编写applicatioin配置文件编写controller&#xff0c;根据手机号发送短信编写service&#xf…

抖音实战~手机号验证码一键注册登录流程(限制手机终端登录)

文章目录 一、手机号验证码二、前端2.1. 点击登陆流程2.2. 点击登录源码 三、后端登录3.1. 登录流程图3.2. 流程简述3.3. 手机号验证码登录流程 一、手机号验证码 二、前端 2.1. 点击登陆流程 1.先校验手机号是否合法&#xff1f;不合法&#xff0c;则提示“请输入正确的手机…

会话——验证码注册与记住密码登录

文章目录 1、需求分析2、用户登录功能2.1、流程分析2.2、代码实现2.3、结果演示 3、登录记住密码功能3.1、流程分析3.2、代码实现3.3、结果演示 4、用户注册功能4.1、流程分析4.2、代码实现4.3、结果演示 5、注册验证码功能5.1、流程分析5.2、代码实现5.3、结果演示 1、需求分析…

关于烧写ESP8285核心板的相关事项

首先需要一个CH340的usb 转ttl 板子 然后连接到8285 脚管对应 TTL ---- 8285 VCC----VCC RXD----TX0 TXD----RX0 GND----GND 在通电之前先要把8285的GND 和io 0 连在ttl 板子的 GND上 烧写软件要设置正确否则无法启动

esp32 esp8285 wf6000OTA升级小记

近期做了3个IOT芯片的OTA升级&#xff0c;记录下&#xff1a; 最开始做完的是ESP32,升级流程也简单&#xff0c;初始烧录到固定区&#xff0c;然后OTA升级就会在user1,user2两个区内来回升&#xff0c;升级的文件是同一个&#xff08;即同一个文件&#xff0c;先升级就是user1…

Ubuntu18.04 上 ESP8285 的 esp-at release_v2.2.0.0 编译环境搭建

1 环境搭建前提 1.1 安装编译 ESP-IDF 需要的软件包&#xff1a; sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util1.2 安装 Python 3.8 sudo apt-get install python3.8-…

探索ESP8285(3)通过EMQX服务器点亮一个LED灯

CCC_122&#xff1a;博客只用于学习交流&#xff0c;不涉及任何商业用途&#xff0c;如果有错误之处&#xff0c;欢迎指正。 在上一个博客的基础上 探索ESP8285&#xff08;2&#xff09;搭建Windows版MQTT服务器 我们来通过EMQX服务器点亮ESP8285模块上的LED灯。 首先查得E…

乐鑫esp8266学习rtos3.0笔记第10篇:内置仅1M的Esp8285,如何攻破最棘手的OTA问题,大大节省资源成本开发产品;

本系列博客学习由非官方人员 半颗心脏 潜心所力所写&#xff0c;仅仅做个人技术交流分享&#xff0c;不做任何商业用途。如有不对之处&#xff0c;请留言&#xff0c;本人及时更改。 1、 Esp8266之 搭建开发环境&#xff0c;开始一个“hellow world”串口打印。 2、 Esp8266之…

晶科鑫 | 国产26MHz晶振匹配Espressif(乐鑫) ESP8285/ESP8266芯片案例

【应用】国产26MHz频率晶振应用于物联网WIFI物联网模块&#xff08;串口转WiFi模块&#xff09;&#xff0c;Espressif(乐鑫) ESP8285/ESP8266芯片匹配测试OK ESP8285其实是ESP8266的升级版本&#xff0c;两者可以共用同一套SDK&#xff0c;只是ESP8285内部集成了1MB Flash&…

ESP8285烧写问题备忘

1 问题现象 ESP8285 烧写了固件&#xff0c;怎么都跑不起来&#xff0c;串口打印如下信息&#xff1a; ets Jan 8 2013,rst cause:2, boot mode:(3,7)load 0x4010f000, len 1384, room 16 tail 8 chksum 0xef csum 0xef csum err ets_main.c 2 问题原因 上乐鑫官网查了 ESP…

ESP8285 多个bin文件合并烧录

可通过两种方式烧录固件&#xff0c;一种是基于esp-idf开发时&#xff0c;中命令终端执行make flash命令烧录&#xff1b;二是使用ESPFlashDownloadTool工具。 bin文件说明 ESP8285/ESP8266的固件一般包含4个bin文件。 查看各bin文件的路径 以带OTA的固件为例&#xff0c;在…

ESP8285+WS2812+MAX9814制作的音乐律动氛围灯

该项目主要参考了立创EDA开源广场的项目&#xff1a; esp8285芯片ESP-01F模块为主控&#xff0c;MAX9814音频采集模块&#xff0c;WS2812 2020rgb灯珠&#xff0c;Arduino编程环境简单制作一个律动灯条。 因为正在学习硬件PCB&#xff0c;所以只能算是一个仿照。 硬件&#x…

探索ESP8285(2)搭建Windows版MQTT服务器

CCC_122&#xff1a;博客只用于学习交流&#xff0c;不涉及任何商业用途&#xff0c;如果有错误之处&#xff0c;欢迎指正。 MQTT服务器有多个选择&#xff0c;例如EMQX&#xff0c;Mosquitto&#xff0c;Apollo&#xff0c;以下我们选择比较简单的EMQX来搭建MQTT的服务器。 一…

峥果智能连接不到服务器,峥果浴霸 ESP8285版本 固件

ESP ZINGUO 峥果智能浴霸个人固件. 作者声明 注意: 本项目主要目的为作者本人自己学习及使用峥果智能浴霸而开发&#xff0c;本着开源精神及造福网友而开源&#xff0c;仅个人开发&#xff0c;可能无法做到完整的测试&#xff0c;所以不承担他人使用本项目照成的所有后果。 严禁…

ESP8266 简单研究 ESP8285 研究

网址&#xff1a; http://wiki.ai-thinker.com/esp8266 ESP8266 系列模组专题 概述 ESP8266 系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP8266的超低功耗的UART-WiFi模块的模组&#xff0c;可以方便地进行二次开发&#xff0c;接入云端服务&#xff0c;实现…

基于RK3399ESP8285自动售货柜项目—MP08开发板端代码详解

基于RK3399&ESP8285自动售货柜项目—②MP08开发板端代码详解 本系列文章将详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法&#xff0c;从硬件连接到网络通信再到软件实现&#xff0c;本产品所用开发板为RK3399以及MP08_2019/11/03 , 如有疑问与见解&#xff0c;可…

ESP8285 ESP-AT编译流程和操作步骤

ESP8282ESP-AT编译流程和操作步骤 ESP8285 相当于ESP8266EX 1M SPI Flash ,他的编译工具和ESP-AT 都是跟ESP8266EX 一样的. 他的AT指令不能做OTA分区. 由于flash空间原因. 个人理解 配置好 esp8285 的编译工具链 setup-toolchain export PATH"$PATH:$HOME/xtensa-lx1…