C#使用读卡器读取身份证信息(包含物理卡号)

本文介绍了通过精伦身份证阅读器IDR210免驱读取身份证信息,重点讲解了如何获取身份证的物理卡号。开发者需要引入特定的库文件,如Dewlt.dll等,并通过DllImport调用Sdtapi.dll中的方法,例如ReadIINSNDN,来读取并存储身份证的物理卡号。

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

说明:本人用的是精伦身份证阅读器idr210 免驱

摘要:目前市面上读取身份证技术已经很成熟了,大多数文章都介绍了读取身份证的详细信息,但是这些信息里并不包含身份证的物理卡号,所以本文讲解的重点在读取身份证的物理卡号,这也是博主在开发过程中踩到的一个坑

什么是物理卡号?

我们目前所用的所有电子卡,无论是身份证还是IC卡,甚至是银行卡,它都有一个自己的唯一标识,该标识就是物理卡号,精伦读卡器读出的身份证物理卡号是138EC00375381712这样的一个格式,下面就上代码。

需要接入精伦提供的库文件:

Dewlt.dll

JpgDll.dll

SavePhoto.dll

Sdtapi.dll

Sdtapi_bkup.dll

System.Web.Services.dll

WltRS.dll

以上库文件需要的下面留言

新建一个控制台应用程序,导入以上几个库文件,使用本代码即可运行

1、身份证信息Model类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyReadCard
{
    class IdCardMessageDto
    {
        /// <summary>
        /// 证件号
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 性别
        /// </summary>
        public string Gender { get; set; }
        /// <summary>
        /// 民族
        /// </summary>
        public string Folk { get; set; }
        /// <summary>
        /// 生日
        /// </summary>
        public string BirthDay { get; set; }
        /// <summary>
        /// 家庭地址
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 签发机关
        /// </summary>
        public string Agency { get; set; }
        /// <summary>
        /// 有效期起始日期
        /// </summary>
        public string ExpireStart { get; set; }
        /// <summary>
        /// 有效期截止日期
        /// </summary>
        public string ExpireEnd { get; set; }
        /// <summary>
        /// 照片
        /// </summary>
        public string photo { get; set; }
        /// <summary>
        /// 物理卡号
        /// </summary>
        public string IINSNDN { get; set; }
    }
}

该类是身份证信息model类,这个不用多说,IINSNDN这个字段就是物理卡号字段

2、读取身份证信息类

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace MyReadCard
{
    class ReadIdCardHelper
    {
        #region Api
        [DllImport("Sdtapi.dll")]
        private static extern int InitComm(int iPort);
        [DllImport("Sdtapi.dll")]
        private static extern int Authenticate();
        [DllImport("Sdtapi.dll")]
        private static extern int ReadBaseInfos(StringBuilder Name, StringBuilder Gender, StringBuilder Folk,
                                                    StringBuilder BirthDay, StringBuilder Code, StringBuilder Address,
                                                        StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd);
        [DllImport("Sdtapi.dll")]
        private static extern int ReadBaseInfosPhoto(StringBuilder Name, StringBuilder Gender, StringBuilder Folk,
                                                    StringBuilder BirthDay, StringBuilder Code, StringBuilder Address,
                                                        StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd, StringBuilder directory);
        [DllImport("Sdtapi.dll")]
        private static extern int ReadBaseInfosFPPhoto(StringBuilder Name, StringBuilder Gender, StringBuilder Folk,
                                                    StringBuilder BirthDay, StringBuilder Code, StringBuilder Address,
                                                        StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd, StringBuilder directory, StringBuilder pucFPMsg, ref int puiFPMsgLen);
        [DllImport("Sdtapi.dll")]
        private static extern int Routon_DecideIDCardType();
        [DllImport("Sdtapi.dll")]
        private static extern int Routon_ReadAllForeignBaseInfos(StringBuilder EnName, StringBuilder Gender, StringBuilder Code, StringBuilder Nation, StringBuilder CnName, StringBuilder BirthDay, StringBuilder ExpireStart, StringBuilder ExpireEnd, StringBuilder CardVertion, StringBuilder Agency, StringBuilder CardType, StringBuilder FutureItem);
        [DllImport("Sdtapi.dll")]
        private static extern int Routon_ReadAllGATBaseInfos(StringBuilder Name, StringBuilder Gender, StringBuilder FutureItem1, StringBuilder BirthDay, StringBuilder Address, StringBuilder Code, StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd, StringBuilder PassID, StringBuilder SignCnt, StringBuilder FutureItem2, StringBuilder CardType, StringBuilder FutureItem3);
        [DllImport("Sdtapi.dll")]
        private static extern int CloseComm();
        [DllImport("Sdtapi.dll")]
        private static extern int ReadBaseMsg(byte[] pMsg, ref int len);
        [DllImport("Sdtapi.dll")]
        private static extern int ReadBaseMsgW(byte[] pMsg, ref int len);
        [DllImport("Sdtapi.dll")]
        private static extern int Routon_IC_FindCard();
        [DllImport("Sdtapi.dll")]
        private static extern int Routon_IC_HL_ReadCardSN(StringBuilder SN);
        [DllImport("Sdtapi.dll")]
        private static extern int Routon_RepeatRead(bool isRepeat);
        [DllImport("Sdtapi.dll")]
        private static extern int Routon_ReadIINSNDN(StringBuilder IINS);
        [DllImport("Sdtapi.dll")]
        private static extern int ReadIINSNDN(StringBuilder IINS);

        #endregion
        public static string IdCardInfoData = "";
        static public void readCard(ref IdCardMessageDto idCardMessage)
        {
            IdCardInfoData = "";
            Routon_RepeatRead(true);
            //打开端口
            int intOpenRet = InitComm(1001);
            if (intOpenRet != 1)
            {
                return ;
            }

            //卡认证
            int intReadRet = Authenticate();
            if (intReadRet != 1)
            {
                CloseComm();
                return ;
            }
            int cardType = Routon_DecideIDCardType();
            if (cardType == 100)//身份证
            {
                StringBuilder Name = new StringBuilder(31);
                StringBuilder Gender = new StringBuilder(3);
                StringBuilder Folk = new StringBuilder(10);
                StringBuilder BirthDay = new StringBuilder(9);
                StringBuilder Code = new StringBuilder(19);
                StringBuilder Address = new StringBuilder(71);
                StringBuilder Agency = new StringBuilder(31);
                StringBuilder ExpireStart = new StringBuilder(9);
                StringBuilder ExpireEnd = new StringBuilder(9);
                StringBuilder CardId = new StringBuilder(16);
                StringBuilder directory = new StringBuilder(100);
                StringBuilder pucFPMsg = new StringBuilder(1024);
                StringBuilder IINS = new StringBuilder(16);
                int intReadBaseInfosRet = ReadBaseInfos(Name, Gender, Folk, BirthDay, Code, Address, Agency, ExpireStart, ExpireEnd);
                if (intReadBaseInfosRet != 1)
                {
                    CloseComm();
                    return ;
                }
                int intReadIINS = ReadIINSNDN(IINS);
                if (intReadIINS != 1)
                {
                    CloseComm();
                    return ;
                }
                idCardMessage = new IdCardMessageDto();
                idCardMessage.Code = Code.ToString().Trim();
                idCardMessage.Name = Name.ToString().Trim();
                idCardMessage.Gender = Gender.ToString().Trim();
                idCardMessage.Folk = Folk.ToString().Trim();
                idCardMessage.BirthDay = BirthDay.ToString().Trim();
                idCardMessage.Address = Address.ToString().Trim();
                idCardMessage.Agency = Agency.ToString().Trim();
                idCardMessage.ExpireStart = ExpireStart.ToString().Trim();
                idCardMessage.ExpireEnd = ExpireEnd.ToString().Trim();
                idCardMessage.IINSNDN = IINS.ToString().Trim();
                idCardMessage.photo = System.IO.Directory.GetCurrentDirectory() + "\\photo.bmp";
                IdCardInfoData = JsonConvert.SerializeObject(idCardMessage);
            }

        }
    }
}

   [DllImport("Sdtapi.dll")]
   private static extern int ReadIINSNDN(StringBuilder IINS);   这里就是调用精伦dll库里读取物理卡号的方法

 int intReadIINS = ReadIINSNDN(IINS);  将读取到的物理卡号存储到IINS里
  if (intReadIINS != 1)
  {
         CloseComm();
          return ;
     }

读取到物理卡号 intReadIINS 的值就为1

3、Program调用类

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyReadCard
{
    class Program
    {
        public static string IdCardInfoData = "";
        static void Main(string[] args)
        {
            IdCardMessageDto idCardMessage = null;           
            ReadIdCardHelper.readCard(ref idCardMessage);
            IdCardInfoData = ReadIdCardHelper.IdCardInfoData;
            //var data = JsonConvert.DeserializeObject<IdCardMessageDto>(IdCardInfoData);
            Console.WriteLine(IdCardInfoData);
        }
    }
}

### C# 实现无驱 USB 射频卡读卡器卡号读取 为了实现无驱 USB 射频卡读卡器卡号读取功能,通常需要借助第三方动态链接库(DLL),这些 DLL 提供了与硬件交互的功能接口。以下是基于 C# 的示例代码,假设使用的是一些常见的射频卡读卡器设备。 #### 动态库加载与函数声明 在实际开发过程中,需先确认所用读卡器厂商提供的 SDK 或者动态库文件,并按照其说明文档完成初始化、打开端口、发送命令等功能调用。以下是一个通用的例子: ```csharp using System; using System.Runtime.InteropServices; class Program { // 加载动态库中的方法 [DllImport("ReaderSDK.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)] public static extern int OpenDevice(); // 打开设备 [DllImport("ReaderSDK.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)] public static extern int CloseDevice(); // 关闭设备 [DllImport("ReaderSDK.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)] public static extern int ReadCardID(string buffer); // 读取卡片 ID static void Main() { try { Console.WriteLine("正在尝试连接到射频卡读卡器..."); // 初始化并打开设备 var resultOpen = OpenDevice(); if (resultOpen != 0) { throw new Exception($"设备打开失败,错误码:{resultOpen}"[^1]); } string cardIdBuffer = new string(' ', 20); var readResult = ReadCardID(cardIdBuffer); if (readResult == 0 && !string.IsNullOrWhiteSpace(cardIdBuffer)) { Console.WriteLine($"成功读取卡号:{cardIdBuffer.Trim()}"); } else { Console.WriteLine("未能检测到有效卡片或读取失败"); } // 关闭设备 var closeResult = CloseDevice(); if (closeResult != 0) { throw new Exception($"关闭设备失败,错误码:{closeResult}"); } } catch (Exception ex) { Console.WriteLine($"发生异常:{ex.Message}"); } } } ``` 上述代码展示了如何通过 `DllImport` 来引入外部动态库的方法,并实现了基本的设备操作流程。需要注意的是,具体 API 名称和参数可能因不同厂家而异,因此务必参照官方提供的 SDK 文档调整相应部分[^3]。 #### 注意事项 - **动态库路径配置**:确保项目运行目录下存在指定名称的 `.dll` 文件或者将其放置于系统环境变量 PATH 中可访问的位置。 - **权限问题**:某些情况下,程序可能需要管理员权限才能正常访问硬件资源。 - **兼容性测试**:由于不同的操作系统版本可能会对驱动支持有所区别,在部署前应充分验证目标平台上的表现情况。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值