using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ShenTun.IcCard.Common; namespace ShenTun.IcCard.Instance { /// /// 华旭(HX-DFX3S) /// public class ReadCardByHXFDX3S : IReadCard { Response IReadCard.GetReadCard() { int iPort = 1001; int ret = -1; bool bDisp = false; int iIfOpen = 1; string birthday=string.Empty; StringBuilder strSAMID = new StringBuilder(64 + 1); byte[] byCHMsg = new byte[256 + 1]; //个人基本信息 uint uiCHMsgSize = 0; //个人基本信息字节数 byte[] byPHMsg = new byte[1024 + 1]; //照片信息 uint uiPHMsgSize = 0; //照片信息字节数 byte[] byFPMsg = new byte[1024 + 1]; //指纹信息 uint uiFPMsgSize = 0; //指纹信息字节数 int iIsSaveToBmp = 0; byte[] byBgrBuffer = new byte[38556]; //解码后图片BGR编码值 byte[] byRgbBuffer = new byte[38808]; //解码后图片RGB编码值 byte[] byBmpBuffer = new byte[38862]; //解码后图片RGB编码值 string strTmp = string.Empty; Response res = new Response() { code = -101 }; IDCardInfo idCard = new IDCardInfo(); try { //获得设备SAM模块ID。 //PS :SAM模块ID为二代证设备唯一标志ID; //PS2:此函通常用来数来区分设备或判断设备是否连接正常;若只读卡信息的话无需添加此函数。 ret = HXFDX3S.SDT_GetSAMIDToStr(iPort, strSAMID, iIfOpen); if (0x90 != ret) { res.code = -101; res.message = String.Format("获取SAMID号失败,错误代码:{0:D}", ret); return res; } byte[] byManaID = new byte[8]; //寻卡 ret = HXFDX3S.SDT_StartFindIDCard(iPort, byManaID, iIfOpen); if (0x9F != ret) { res.code = -101; res.message = String.Format("寻卡失败,错误代码:{0:D}", ret); return res; } //选卡 byManaID.Initialize(); ret = HXFDX3S.SDT_SelectIDCard(iPort, byManaID, iIfOpen); if (0x90 != ret) { res.code = -101; res.message = String.Format("选卡失败,错误代码:{0:D}", ret); return res; } //读取身份证个人基本信息、照片信息和指纹信息; //PS:指纹信息需要专门的指纹比对设备,这里只获取加密的原始数据。 ret = HXFDX3S.SDT_ReadBaseFPMsg(iPort, byCHMsg, ref uiCHMsgSize, byPHMsg, ref uiPHMsgSize, byFPMsg, ref uiFPMsgSize, iIfOpen); if (0x21 == ret)//0501模块(一种老模块)无法读取指纹信息,会返回0x21错误,这里进行兼容处理;这种模块早就不用了,实际可以不做处理。 { ret = HXFDX3S.SDT_ReadBaseMsg(iPort, byCHMsg, ref uiCHMsgSize, byPHMsg, ref uiPHMsgSize, iIfOpen);//采用只读卡信息和照片,不读指纹信息的接口 } if (0x90 != ret) { res.code = -101; res.message = String.Format("读取身份信息失败,错误代码:{0:D}", ret); return res; } //读取身份证个人基本信息、照片信息和指纹信息; //PS:指纹信息需要专门的指纹比对设备,这里只获取加密的原始数据。 //解码照片数据,获得BGR格式数据 iIsSaveToBmp = 1; //调用解码库unpack函数后,由接口自动生成名为zp.bmp的图片文件,该BMP文件可直接打开,不用B、R转换 //iIsSaveToBmp = 0; //不自动生成zp.bmp图片 //PS :解码库需要依赖授权文件(license.dat);要确保“当前工作目录下”license.dat文件存在且正确,否则会返回-22和-12的错误 //PS2 :若设置iIsSaveToBmp = 1,即由接口自动生成zp.bmp文件,请确认“当前工作目录”具有写权限,否侧接口会崩溃(WIN7以上系统需注意此项) ret = HXFDX3S.unpack(byPHMsg, byBgrBuffer, iIsSaveToBmp); if (1 != ret) { res.code = -101; res.message = String.Format("照片解码失败,错误代码:{0:D}", ret); return res; } byte[] byName = new byte[30]; byte[] bySex = new byte[2]; byte[] byRace = new byte[4]; byte[] byBirth = new byte[16]; byte[] byAddress = new byte[70]; byte[] byID = new byte[36]; byte[] byCompany = new byte[30]; byte[] byBeginDate = new byte[16]; byte[] byEndDate = new byte[16]; Array.Copy(byCHMsg, 0, byName, 0, 30); Array.Copy(byCHMsg, 30, bySex, 0, 2); Array.Copy(byCHMsg, 32, byRace, 0, 4); Array.Copy(byCHMsg, 36, byBirth, 0, 16); Array.Copy(byCHMsg, 52, byAddress, 0, 70); Array.Copy(byCHMsg, 122, byID, 0, 36); Array.Copy(byCHMsg, 158, byCompany, 0, 30); Array.Copy(byCHMsg, 188, byBeginDate, 0, 16); Array.Copy(byCHMsg, 204, byEndDate, 0, 16); idCard.Name = Encoding.Unicode.GetString(byName).Trim(); idCard.Sex = Encoding.Unicode.GetString(bySex).Trim(); idCard.IDCode = Encoding.Unicode.GetString(byID).Trim(); idCard.Birthday = Encoding.Unicode.GetString(byBirth).Trim(); if (!idCard.Birthday.Contains("-")) { birthday = idCard.Birthday; idCard.Birthday=string.Format("{0}-{1}-{2}", birthday.ToString().Substring(0, 4), birthday.ToString().Substring(4, 2), birthday.ToString().Substring(6, 2)); } idCard.Address = Encoding.Unicode.GetString(byAddress).Trim(); //var nation = BaseData.nList.Where(p => p.Name.Equals(strTmp)).FirstOrDefault(); idCard.Nation = Encoding.Unicode.GetString(byRace).Trim() + "族"; //idCard.DepartmentIC = YT100.GetDepartmentIC(); //LogHelper.LogWriter("GetDepartmentIC End"); //idCard.StartDateIC = YT100.GetStartDateIC(); //LogHelper.LogWriter("GetStartDateIC End"); //某些身份证读取不了下面的字段 //idCard.EndDateIC = YT100.GetEndDateIC(); //LogHelper.LogWriter("GetEndDateIC End"); idCard.Photo = YT100.GetPhoto(); LogHelper.LogWriter("GetPhoto End"); res.code = 1; res.data = idCard; res.message = "Success"; } catch (Exception ex) { LogHelper.LogWriter(string.Format("ExceptionMessage:{0}", ex.Message)); throw new Exception(string.Format("读卡器接口操作失败:{0}", ex.Message)); } finally { if (bDisp) YT100.CloseComm(); } return res; } } }