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

1 month ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using ShenTun.IcCard.Common;
  7. namespace ShenTun.IcCard.Instance
  8. {
  9. /// <summary>
  10. /// 华旭(HX-DFX3S)
  11. /// </summary>
  12. public class ReadCardByHXFDX3S : IReadCard
  13. {
  14. Response IReadCard.GetReadCard()
  15. {
  16. int iPort = 1001;
  17. int ret = -1;
  18. bool bDisp = false;
  19. int iIfOpen = 1;
  20. string birthday=string.Empty;
  21. StringBuilder strSAMID = new StringBuilder(64 + 1);
  22. byte[] byCHMsg = new byte[256 + 1]; //个人基本信息
  23. uint uiCHMsgSize = 0; //个人基本信息字节数
  24. byte[] byPHMsg = new byte[1024 + 1]; //照片信息
  25. uint uiPHMsgSize = 0; //照片信息字节数
  26. byte[] byFPMsg = new byte[1024 + 1]; //指纹信息
  27. uint uiFPMsgSize = 0; //指纹信息字节数
  28. int iIsSaveToBmp = 0;
  29. byte[] byBgrBuffer = new byte[38556]; //解码后图片BGR编码值
  30. byte[] byRgbBuffer = new byte[38808]; //解码后图片RGB编码值
  31. byte[] byBmpBuffer = new byte[38862]; //解码后图片RGB编码值
  32. string strTmp = string.Empty;
  33. Response res = new Response()
  34. {
  35. code = -101
  36. };
  37. IDCardInfo idCard = new IDCardInfo();
  38. try
  39. {
  40. //获得设备SAM模块ID。
  41. //PS :SAM模块ID为二代证设备唯一标志ID;
  42. //PS2:此函通常用来数来区分设备或判断设备是否连接正常;若只读卡信息的话无需添加此函数。
  43. ret = HXFDX3S.SDT_GetSAMIDToStr(iPort, strSAMID, iIfOpen);
  44. if (0x90 != ret)
  45. {
  46. res.code = -101;
  47. res.message = String.Format("获取SAMID号失败,错误代码:{0:D}", ret);
  48. return res;
  49. }
  50. byte[] byManaID = new byte[8];
  51. //寻卡
  52. ret = HXFDX3S.SDT_StartFindIDCard(iPort, byManaID, iIfOpen);
  53. if (0x9F != ret)
  54. {
  55. res.code = -101;
  56. res.message = String.Format("寻卡失败,错误代码:{0:D}", ret);
  57. return res;
  58. }
  59. //选卡
  60. byManaID.Initialize();
  61. ret = HXFDX3S.SDT_SelectIDCard(iPort, byManaID, iIfOpen);
  62. if (0x90 != ret)
  63. {
  64. res.code = -101;
  65. res.message = String.Format("选卡失败,错误代码:{0:D}", ret);
  66. return res;
  67. }
  68. //读取身份证个人基本信息、照片信息和指纹信息;
  69. //PS:指纹信息需要专门的指纹比对设备,这里只获取加密的原始数据。
  70. ret = HXFDX3S.SDT_ReadBaseFPMsg(iPort, byCHMsg, ref uiCHMsgSize, byPHMsg, ref uiPHMsgSize, byFPMsg, ref uiFPMsgSize, iIfOpen);
  71. if (0x21 == ret)//0501模块(一种老模块)无法读取指纹信息,会返回0x21错误,这里进行兼容处理;这种模块早就不用了,实际可以不做处理。
  72. {
  73. ret = HXFDX3S.SDT_ReadBaseMsg(iPort, byCHMsg, ref uiCHMsgSize, byPHMsg, ref uiPHMsgSize, iIfOpen);//采用只读卡信息和照片,不读指纹信息的接口
  74. }
  75. if (0x90 != ret)
  76. {
  77. res.code = -101;
  78. res.message = String.Format("读取身份信息失败,错误代码:{0:D}", ret);
  79. return res;
  80. }
  81. //读取身份证个人基本信息、照片信息和指纹信息;
  82. //PS:指纹信息需要专门的指纹比对设备,这里只获取加密的原始数据。
  83. //解码照片数据,获得BGR格式数据
  84. iIsSaveToBmp = 1; //调用解码库unpack函数后,由接口自动生成名为zp.bmp的图片文件,该BMP文件可直接打开,不用B、R转换
  85. //iIsSaveToBmp = 0; //不自动生成zp.bmp图片
  86. //PS :解码库需要依赖授权文件(license.dat);要确保“当前工作目录下”license.dat文件存在且正确,否则会返回-22和-12的错误
  87. //PS2 :若设置iIsSaveToBmp = 1,即由接口自动生成zp.bmp文件,请确认“当前工作目录”具有写权限,否侧接口会崩溃(WIN7以上系统需注意此项)
  88. ret = HXFDX3S.unpack(byPHMsg, byBgrBuffer, iIsSaveToBmp);
  89. if (1 != ret)
  90. {
  91. res.code = -101;
  92. res.message = String.Format("照片解码失败,错误代码:{0:D}", ret);
  93. return res;
  94. }
  95. byte[] byName = new byte[30];
  96. byte[] bySex = new byte[2];
  97. byte[] byRace = new byte[4];
  98. byte[] byBirth = new byte[16];
  99. byte[] byAddress = new byte[70];
  100. byte[] byID = new byte[36];
  101. byte[] byCompany = new byte[30];
  102. byte[] byBeginDate = new byte[16];
  103. byte[] byEndDate = new byte[16];
  104. Array.Copy(byCHMsg, 0, byName, 0, 30);
  105. Array.Copy(byCHMsg, 30, bySex, 0, 2);
  106. Array.Copy(byCHMsg, 32, byRace, 0, 4);
  107. Array.Copy(byCHMsg, 36, byBirth, 0, 16);
  108. Array.Copy(byCHMsg, 52, byAddress, 0, 70);
  109. Array.Copy(byCHMsg, 122, byID, 0, 36);
  110. Array.Copy(byCHMsg, 158, byCompany, 0, 30);
  111. Array.Copy(byCHMsg, 188, byBeginDate, 0, 16);
  112. Array.Copy(byCHMsg, 204, byEndDate, 0, 16);
  113. idCard.Name = Encoding.Unicode.GetString(byName).Trim();
  114. idCard.Sex = Encoding.Unicode.GetString(bySex).Trim();
  115. idCard.IDCode = Encoding.Unicode.GetString(byID).Trim();
  116. idCard.Birthday = Encoding.Unicode.GetString(byBirth).Trim();
  117. if (!idCard.Birthday.Contains("-"))
  118. {
  119. birthday = idCard.Birthday;
  120. idCard.Birthday=string.Format("{0}-{1}-{2}", birthday.ToString().Substring(0, 4), birthday.ToString().Substring(4, 2), birthday.ToString().Substring(6, 2));
  121. }
  122. idCard.Address = Encoding.Unicode.GetString(byAddress).Trim();
  123. //var nation = BaseData.nList.Where(p => p.Name.Equals(strTmp)).FirstOrDefault();
  124. idCard.Nation = Encoding.Unicode.GetString(byRace).Trim() + "族";
  125. //idCard.DepartmentIC = YT100.GetDepartmentIC();
  126. //LogHelper.LogWriter("GetDepartmentIC End");
  127. //idCard.StartDateIC = YT100.GetStartDateIC();
  128. //LogHelper.LogWriter("GetStartDateIC End");
  129. //某些身份证读取不了下面的字段
  130. //idCard.EndDateIC = YT100.GetEndDateIC();
  131. //LogHelper.LogWriter("GetEndDateIC End");
  132. idCard.Photo = YT100.GetPhoto();
  133. LogHelper.LogWriter("GetPhoto End");
  134. res.code = 1;
  135. res.data = idCard;
  136. res.message = "Success";
  137. }
  138. catch (Exception ex)
  139. {
  140. LogHelper.LogWriter(string.Format("ExceptionMessage:{0}", ex.Message));
  141. throw new Exception(string.Format("读卡器接口操作失败:{0}", ex.Message));
  142. }
  143. finally
  144. {
  145. if (bDisp)
  146. YT100.CloseComm();
  147. }
  148. return res;
  149. }
  150. }
  151. }