You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

169 lines
7.9 KiB

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;
}
}
}