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