|
|
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using ShenTun.IcCard.Common;
namespace ShenTun.IcCard.Instance{ /// <summary>
/// 华旭(HX-DFX3S)
/// </summary>
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; } }}
|