不同的身份证读卡器,其动态库不一样,新中新二代身份证阅读器,型号:DKQ-A16D,eg:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
namespace Zbsoft.XzxCardReader
{
/// <summary>
/// 新中新二代身份证阅读器,型号:DKQ-A16D
/// </summary>
public static class Reader
{
/// <summary>
/// 图片格式
/// </summary>
public enum PhotoType {Bmp = 0, Jpeg = 1, Base64 = 2}
/// <summary>
/// 图片命名格式
/// </summary>
public enum PhotoNameType {
/// <summary>
/// 临时,以当前时间命名
/// </summary>
Dt = 0,
/// <summary>
/// 姓名
/// </summary>
Name = 1,
/// <summary>
/// 身份证号
/// </summary>
CardNo = 2,
/// <summary>
/// 姓名_身份证号
/// </summary>
Name_CardNo = 3 }
/// <summary>
/// 日期格式
/// </summary>
public enum DateFormat
{
/// <summary>
/// YYYYMMDD
/// </summary>
YMD = 0,
/// <summary>
/// YYYY年MM月DD日
/// </summary>
YnMyD = 1,
/// <summary>
/// YYYY.MM.DD
/// </summary>
YdMdD = 2,
/// <summary>
/// YYYY-MM-DD
/// </summary>
YgMgD = 3,
/// <summary>
/// YYYY/MM/DD
/// </summary>
YxgMxgD = 4
}
static int nPort = 0;//端口
static string sPhotoPath = "";//图片文件夹
static PhotoType sPhotoType = PhotoType.Bmp;//图片文件格式
static PhotoNameType sPhotoNameType = PhotoNameType.CardNo;//图片文件命名格式
static DateFormat nDateFormat = DateFormat.YgMgD;//日期格式
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct IDCardData
{
//结构中使用的字串,[]类似限定说明 说明此公共结构传输到非托管代码时封装定义
/// <summary>
/// 姓名
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Name;
/// <summary>
/// 性别
/// </summary>
[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;
}
/************************端口类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);
/*************************身份证卡类函数 ***************************/
[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_ReadBaseMsg", CharSet = CharSet.Ansi)]
public static extern int Syn_ReadBaseMsg(int iPort, IntPtr pucCHMsg, ref uint puiCHMsgLen, IntPtr 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(string Wlt_File, int iPort);
[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)]
public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);
[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);
=========================
/// <summary>
/// 自动查询读卡器
/// </summary>
/// <param name="err">错误信息</param>
/// <returns></returns>
public static bool FindDrivers(out string err)
{
int i = 0;
err = "";
try
{
i = Syn_FindReader();
}
catch (Exception e)
{
err = e.ToString();
return false;
}
if (i > 0)
{
nPort = i;
}
else
{
nPort = 0;
return false;
}
return true;
}
/// <summary>
/// 读取身份证信息,包含图片,反复读取会出错
/// </summary>
/// <returns></returns>
public static bool ReadCardAll(out IDCardData CardMsg, out string errStr)
{
errStr = "";
CardMsg = new IDCardData();
int nRet;
byte[] pucIIN = new byte[4];
byte[] pucSN = new byte[8];
if (nPort == 0)
{
if (!FindDrivers(out errStr))
{
if (string.IsNullOrEmpty(errStr))
errStr = "没有找到读卡器";
return false;
}
if (string.IsNullOrEmpty(sPhotoPath))
{
if (!System.IO.Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "CardImg"))
System.IO.Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "CardImg");
sPhotoPath = AppDomain.CurrentDomain.BaseDirectory + "CardImg";
}
nRet = Syn_SetPhotoType((int)sPhotoType);
byte[] cPath = new byte[255];
cPath = System.Text.Encoding.Default.GetBytes(sPhotoPath);
nRet = Syn_SetPhotoPath(2, ref cPath[0]);
nRet = Syn_SetPhotoName((int)sPhotoNameType);
nRet = Syn_SetBornType((int)nDateFormat);
nRet = Syn_SetUserLifeBType((int)nDateFormat);
nRet = Syn_SetUserLifeEType((int)nDateFormat, 1);
nRet = Syn_SetNationType(2);//民族:0=卡内存储的数据,1=解释之后的数据,2=解释之后+“族”
}
if (Syn_OpenPort(nPort) == 0)
{
if (Syn_SetMaxRFByte(nPort, 80, 0) == 0)
{
nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
nRet = Syn_ReadMsg(nPort, 0, ref CardMsg);
if (nRet == 0)
{
return true;
}
else
{
errStr = "读取身份证信息错误";
}
}
}
else
{
errStr = "打开端口失败";
return false;
}
return false;
}
/// <summary>
/// 读取身份证基本信息
/// </summary>
/// <param name="CardMsg"></param>
/// <param name="errStr"></param>
/// <returns></returns>
public static bool ReadCard(out ZbsoftInterface.IDCardData CardMsg,
out string errStr)
{
CardMsg = new ZbsoftInterface.IDCardData();
errStr = "";
int nRet;
byte[] pucIIN = new byte[4];
byte[] pucSN = new byte[8];
#region 获取读卡器
if (nPort == 0)
{
if (!FindDrivers(out errStr))
{
if (string.IsNullOrEmpty(errStr))
errStr = "没有找到读卡器";
return false;
}
}
#endregion
if (Syn_OpenPort(nPort) == 0)
{
if (Syn_SetMaxRFByte(nPort, 80, 0) == 0)
{
nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
string cardMsg = new string(' ', 256); //身份证基本信息返回长度为256
string imgMsg = new string(' ', 1024); //身份证图片信息返回长度为1024
IntPtr msg = Marshal.StringToHGlobalAnsi(cardMsg); //身份证基本信息
IntPtr img = Marshal.StringToHGlobalAnsi(imgMsg); //身份证图片
try
{
uint mLen = 0;
uint iLen = 0;
nRet = Syn_ReadBaseMsg(nPort, msg, ref mLen, img, ref iLen, 0);
if (nRet == 0)
{
string card = Marshal.PtrToStringUni(msg);
char[] cartb = card.ToCharArray();
CardMsg.Name = (new string(cartb, 0, 15)).Trim();
CardMsg.Sex = new string(cartb, 15, 1);
CardMsg.Nation = new string(cartb, 16, 2);
CardMsg.Born = new string(cartb, 18, 8);
CardMsg.Address = (new string(cartb, 26, 35)).Trim();
CardMsg.IDCardNo = new string(cartb, 61, 18);
CardMsg.GrantDept = (new string(cartb, 79, 15)).Trim();
CardMsg.UserLifeBegin = new string(cartb, 94, 8);
CardMsg.UserLifeEnd = new string(cartb, 102, 8);
return true;
}
else
{
errStr = "读取身份证信息错误";
}
}
catch (Exception e) { errStr = e.Message; }
finally
{
Marshal.FreeHGlobal(msg);
Marshal.FreeHGlobal(img);
}
}
else
{
errStr = "SetMaxRFByte出错";
}
}
else
{
errStr = "打开端口失败";
}
return false;
}
}
}