C#身份证读卡接口代码

本文提供了C#语言实现身份证读卡接口的代码示例,包括身份证数据对象结构体和身份证类。代码中包含了读取身份证信息的方法,并展示了如何处理读卡器返回的数据。

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;

namespace SLUserInfoRead
{
///
/// 身份证数据对象
///
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct IDCardData
{
///
/// 姓名
///
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] //结构中使用的字串,[]类似限定说明 说明此公共结构传输到非托管代码时封装定义
public string Name;
///
/// 性别
///
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string Sex;

    /// <summary>
    ///名族 
    /// </summary>
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    public string Nation;


    /// <summary>
    /// 出生日期
    /// </summary>
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
    public string Born; 


    /// <summary>
    /// 住址
    /// </summary>
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
    public string Address; 


    /// <summary>
    /// 身份证号
    /// </summary>
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
    public string IDCardNo; 


    /// <summary>
    /// 发证机关
    /// </summary>
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
    public string GrantDept; 


    /// <summary>
    /// 有效开始日期
    /// </summary>
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
    public string UserLifeBegin; 


    /// <summary>
    /// 有效截止日期
    /// </summary>
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
    public string UserLifeEnd;  


    /// <summary>
    /// 保留
    /// </summary>
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
    public string reserved; 

    /// <summary>
    /// 照片路径
    /// </summary>
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
    public string PhotoFileName;




    /// <summary>
    /// 户籍地
    /// </summary>
    public string DomicilePlace;
}


public class IDCardHelp
{
    /************************端口类API *************************/
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetMaxRFByte", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetMaxRFByte(int iPort, byte ucByte, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetCOMBaud", CharSet = CharSet.Ansi)]
    public static extern int Syn_GetCOMBaud(int iPort, ref uint puiBaudRate);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetCOMBaud", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetCOMBaud(int iPort, uint uiCurrBaud, uint uiSetBaud);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_OpenPort", CharSet = CharSet.Ansi)]
    public static extern int Syn_OpenPort(int iPort);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ClosePort", CharSet = CharSet.Ansi)]
    public static extern int Syn_ClosePort(int iPort);


    /**************************SAM类函数 **************************/
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ResetSAM", CharSet = CharSet.Ansi)]
    public static extern int Syn_ResetSAM(int iPort, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMStatus", CharSet = CharSet.Ansi)]
    public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMID", CharSet = CharSet.Ansi)]
    public static extern int Syn_GetSAMID(int iPort, ref byte pucSAMID, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMIDToStr", CharSet = CharSet.Ansi)]
    public static extern int Syn_GetSAMIDToStr(int iPort, ref byte pcSAMID, int iIfOpen);


    /*************************身份证卡类函数 ***************************/


    /// <summary>
    /// 开始找卡
    /// </summary>
    /// <param name="iPort"></param>
    /// <param name="pucIIN"></param>
    /// <param name="iIfOpen"></param>
    /// <returns></returns>
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_StartFindIDCard", CharSet = CharSet.Ansi)]
    public static extern int Syn_StartFindIDCard(int iPort, ref byte pucIIN, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SelectIDCard", CharSet = CharSet.Ansi)]
    public static extern int Syn_SelectIDCard(int iPort, ref byte pucSN, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]
    public static extern int Syn_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref uint puiCHMsgLen, ref byte pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDN", CharSet = CharSet.Ansi)]
    public static extern int Syn_ReadIINSNDN(int iPort, ref byte pucIINSNDN, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsgToFile", CharSet = CharSet.Ansi)]
    public static extern int Syn_ReadBaseMsgToFile(int iPort, ref byte pcCHMsgFileName, ref uint puiCHMsgFileLen, ref byte pcPHMsgFileName, ref uint puiPHMsgFileLen, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDNToASCII", CharSet = CharSet.Ansi)]
    public static extern int Syn_ReadIINSNDNToASCII(int iPort, ref byte pucIINSNDN, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadNewAppMsg", CharSet = CharSet.Ansi)]
    public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref uint puiAppMsgLen, int iIfOpen);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetBmp", CharSet = CharSet.Ansi)]
    public static extern int Syn_GetBmp(int iPort, ref byte Wlt_File);


    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)]
    public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);


    /// <summary>
    /// 查找读卡器
    /// </summary>
    /// <returns></returns>
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_FindReader", CharSet = CharSet.Ansi)]
    public static extern int Syn_FindReader();


    /***********************设置附加功能函数 ************************/
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoPath", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetPhotoPath(int iOption, ref byte cPhotoPath);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoType", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetPhotoType(int iType);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoName", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetPhotoName(int iType);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetSexType", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetSexType(int iType);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetNationType", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetNationType(int iType);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetBornType", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetBornType(int iType);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeBType", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetUserLifeBType(int iType);
    [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeEType", CharSet = CharSet.Ansi)]
    public static extern int Syn_SetUserLifeEType(int iType, int iOption);
}

}
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Text.RegularExpressions;

namespace SLUserInfoRead
{
///
/// 身份证类
///
public class IDCard
{
///
/// 寻找读卡器
///
/// 错误消息
/// 端口号
/// 返回端口号
public static int FindReader(ref string errMsg)
{
bool result = true;
//将读卡器读出的图片保存为 身份证号+“.jpeg”

        try
        {
            int nRet = IDCardHelp.Syn_SetPhotoName(2);
            //存为jpeg格式
            nRet = IDCardHelp.Syn_SetPhotoType(1);
        }
        catch (Exception ex)
        {
            errMsg = ex.Message;
            result = false;
        }

        if (result)
        {
            result = IsOutOfBrowser(ref errMsg);
        }

        int port = -1;

        if (result)
        {
            port = IDCardHelp.Syn_FindReader();

            if (port <= 0)
            {
                errMsg = "未找到身份证读卡器!";
            }
        }

        return port;
    }

    /// <summary>
    /// 打开端口
    /// </summary>
    /// <param name="port">端口号</param>
    /// <param name="errMsg">错误消息</param>
    /// <returns></returns>
    public static int OpenPort(int port, ref string errMsg)
    {
        int rRct = -1;
        try
        {
            rRct = IDCardHelp.Syn_OpenPort(port);

            if (rRct != 0)
            {
                errMsg = "身份证读卡器端口打开失败!";
            }
        }
        catch (Exception ex)
        {
            errMsg = ex.Message;
        }

        return rRct;
    }

    /// <summary>
    /// 设置图片保存路径
    /// </summary>
    /// <param name="path">指定路径</param>
    /// <param name="errMsg">错误消息</param>
    /// <returns></returns>
    public static bool SetPhotoPath(string path, ref string errMsg)
    {
        bool result = true;

        try
        {
            byte[] cPath = System.Text.Encoding.Unicode.GetBytes(path);
            int i = IDCardHelp.Syn_SetPhotoPath(2, ref cPath[0]);

            result = i == 0 ? true : false;
        }
        catch (Exception ex)
        {
            errMsg = ex.Message;
            result = false;
        }

        return result;
    }


    static string regPattern = "(([\\W\\w]+[省][^市]+[市])|([\\W\\w]+[省][^县]+[县])|([\\W\\w]+[自治区]+[\\W\\w]+[市])|([\\W\\w]+[^省]+[市][\\W\\w]+[市|区|县])|([\\W\\w]+[省][\\W\\w]+[自治州]))";
    /// <summary>
    /// 读取身份证信息
    /// </summary>
    /// <param name="errMsg">错误消息</param>
    /// <returns></returns>
    public static IDCardData GetCardInfo(ref string errMsg)
    {
        IDCardData cardMsg = new IDCardData();
        int port = -1, nRet;
        byte[] pucIIN = new byte[4];
        byte[] pucSN = new byte[8];


        int iifOpen = 0;

        port = FindReader(ref errMsg);

        if (string.IsNullOrEmpty(errMsg))
        {

            nRet = OpenPort(port, ref errMsg);

            if (nRet == 0)
            {


                nRet = IDCardHelp.Syn_SetMaxRFByte(port, 80, 0);
                try
                {
                    if (nRet == 0)
                    {
                        nRet = IDCardHelp.Syn_StartFindIDCard(port, ref pucIIN[0], iifOpen);
                    }

                    if (nRet == 0)
                    {
                        nRet = IDCardHelp.Syn_SelectIDCard(port, ref pucSN[0], iifOpen);

                        if (nRet == 0)
                        {
                            
                            nRet = IDCardHelp.Syn_ReadMsg(port, 0, ref cardMsg);

                            if (!string.IsNullOrEmpty(cardMsg.Address))
                            {
                                Regex regex = new Regex(regPattern);
                                cardMsg.DomicilePlace = regex.Match(cardMsg.Address).Value;
                            }
                        }
                    }

                    if (nRet != 0)
                    {
                        errMsg = "未识别到身份证卡片!";
                    }

                    IDCardHelp.Syn_ClosePort(port);
                }
                catch (Exception ex)
                {
                    errMsg = ex.Message;
                }
            }
        }

        return cardMsg;

    }

    /// <summary>
    /// 是否在浏览器外运行
    /// </summary>
    /// <param name="errMsg">错误消息</param>
    /// <returns></returns>
    private static bool IsOutOfBrowser(ref string errMsg)
    {
        bool result = true;

        if (!Application.Current.IsRunningOutOfBrowser)
        {
            result = false;
            errMsg = "请在浏览器外运行以获取得权限支持!";
        }
        return result;
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值