c# 新中新二代身份证阅读,包含头像,支持华视
需要用到dll和文件:
其中3个dll文件是需要调用的dll,license.dat文件为解压图片的授权文件
以下是需要用到的dll里面的方法:
/************************端口类API *************************/ [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetMaxRFByte", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetMaxRFByte(int iPort, byte ucByte, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_GetCOMBaud", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_GetCOMBaud(int iPort, ref uint puiBaudRate); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetCOMBaud", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetCOMBaud(int iPort, uint uiCurrBaud, uint uiSetBaud); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_OpenPort", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_OpenPort(int iPort); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_ClosePort", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_ClosePort(int iPort); /**************************SAM类函数 **************************/ [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_ResetSAM", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_ResetSAM(int iPort, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMStatus", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMID", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_GetSAMID(int iPort, ref byte pucSAMID, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMIDToStr", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_GetSAMIDToStr(int iPort, ref byte pcSAMID, int iIfOpen); /*************************身份证卡类函数 ***************************/ [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_StartFindIDCard", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_StartFindIDCard(int iPort, ref byte pucIIN, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SelectIDCard", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SelectIDCard(int iPort, ref byte pucSN, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_ReadBaseMsg(int iPort, IntPtr pucCHMsg, ref uint puiCHMsgLen, IntPtr pucPHMsg, ref uint puiPHMsgLen, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDN", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_ReadIINSNDN(int iPort, ref byte pucIINSNDN, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsgToFile", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_ReadBaseMsgToFile(int iPort, ref byte pcCHMsgFileName, ref uint puiCHMsgFileLen, ref byte pcPHMsgFileName, ref uint puiPHMsgFileLen, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDNToASCII", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_ReadIINSNDNToASCII(int iPort, ref byte pucIINSNDN, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_ReadNewAppMsg", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref uint puiAppMsgLen, int iIfOpen); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_GetBmp", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_GetBmp(string Wlt_File, int iPort); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_FindReader", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_FindReader(); /***********************设置附加功能函数 ************************/ [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoPath", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetPhotoPath(int iOption, ref byte cPhotoPath); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoType", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetPhotoType(int iType); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoName", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetPhotoName(int iType); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetSexType", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetSexType(int iType); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetNationType", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetNationType(int iType); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetBornType", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetBornType(int iType); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeBType", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetUserLifeBType(int iType); [DllImport("idCardDll\SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeEType", CharSet = CharSet.Ansi, SetLastError = true)] public static extern int Syn_SetUserLifeEType(int iType, int iOption); [DllImport("idCardDll\WltRS.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)] static extern int GetBmp(string pucPHMsg, int intf);
读取身份证信息分两个阶段,第一个阶段是获取基本信息,第二个阶段是获取图片信息
获取基本信息很简单,直接调用dll的方法就可以完成,部分代码如下:
int status = 1;//默认为找不到身份证 try { //先查找读卡器 int i, nRet; i = Syn_FindReader(); //只支持usb if (i > 1000) { var nPort = i; if (Syn_OpenPort(nPort) == 0) { Thread.Sleep(5); if (Syn_SetMaxRFByte(nPort, 80, 0) == 0) { Thread.Sleep(5); byte[] pucIIN = new byte[4]; byte[] pucSN = new byte[8]; IDCardData cardMsg = new IDCardData(); nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0); //找卡 nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0); //选卡 string cardStr = new string(' ', 256); //身份证基本信息返回长度为256 string imgMsg = new string(' ', 1024); //身份证图片信息返回长度为1024 IntPtr msg = Marshal.StringToHGlobalAnsi(cardStr); //身份证基本信息 IntPtr img = Marshal.StringToHGlobalAnsi(imgMsg); //身份证图片 uint mLen = 0; uint iLen = 0; nRet = Syn_ReadBaseMsg(nPort, msg, ref mLen, img, ref iLen, 0); if (nRet == 0) { Syn_ClosePort(nPort); 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);