IDCardManager.cs 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. using System;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Text;
  5. namespace Vinno.IdentificationCardApp
  6. {
  7. public class IDCardManager
  8. {
  9. private IDCardInfo _idCardInfo = new IDCardInfo();
  10. private const int IfOpen = 0; //Switch com port automatically
  11. private int _portID;
  12. private bool _isUsbPort = true;
  13. private bool _portIsOpened;
  14. private readonly string _tempPath;
  15. public IDCardManager()
  16. {
  17. _tempPath = Path.Combine(Path.GetTempPath(), "IDCardApp");
  18. if (Directory.Exists(_tempPath)==false)
  19. {
  20. Directory.CreateDirectory(_tempPath);
  21. }
  22. }
  23. public IDCardInfo IDCardInfo {
  24. get { return _idCardInfo; }
  25. }
  26. public bool PortIsOpened
  27. {
  28. get { return _portIsOpened; }
  29. }
  30. public bool OpenPort()
  31. {
  32. _isUsbPort = false;
  33. int openPortReturnCode = 0;
  34. for (var iPort = 1001; iPort <= 1016; iPort++)
  35. {
  36. openPortReturnCode = SdtApi.SDT_OpenPort(iPort);
  37. if (openPortReturnCode == 0x90)
  38. {
  39. _portID = iPort;
  40. _isUsbPort = true;
  41. break;
  42. }
  43. }
  44. if (openPortReturnCode != 0x90)
  45. {
  46. _portIsOpened = false;
  47. return false;
  48. }
  49. _portIsOpened = true;
  50. return true;
  51. }
  52. public bool ClosePort()
  53. {
  54. var returnCode = SdtApi.SDT_ClosePort(_portID);
  55. if (returnCode == 0x90)
  56. {
  57. _portIsOpened = false;
  58. return true;
  59. }
  60. return false;
  61. }
  62. public ReadCardReturnCodeEnum ReadIcCard()
  63. {
  64. int pucIin = 0;
  65. int pucSn = 0;
  66. int puiChMsgLen = 0;
  67. int puiPhMsgLen = 0;
  68. var zpBmpFile = Path.Combine(_tempPath, "zp.bmp");
  69. var zpWltFile = Path.Combine(_tempPath, "zp.wlt");
  70. ReadCardReturnCodeEnum readCardCode = ReadCardReturnCodeEnum.Ok;
  71. //Find card
  72. var returnCode = SdtApi.SDT_StartFindIDCard(_portID, ref pucIin, IfOpen);
  73. if (returnCode == 0x80)
  74. {
  75. return ReadCardReturnCodeEnum.FindCardFailed;
  76. }
  77. if (returnCode != 0x80 && returnCode != 0x9F) //0x80 is FindCardFailed, 0x9F is OK, it is workaround to check the device connection error
  78. {
  79. return ReadCardReturnCodeEnum.DeviceConnectionError;
  80. }
  81. //Select card
  82. returnCode = SdtApi.SDT_SelectIDCard(_portID, ref pucSn, IfOpen);
  83. if (returnCode == 0x81)
  84. {
  85. return ReadCardReturnCodeEnum.SelectCardFailed;
  86. }
  87. if (returnCode != 0x81 && returnCode != 0x90)//0x81 is FindCardFailed, 0x90 is OK, it is workaround to check the device connection error
  88. {
  89. return ReadCardReturnCodeEnum.DeviceConnectionError;
  90. }
  91. try
  92. {
  93. var objFile = new FileInfo(zpBmpFile);
  94. if (objFile.Exists)
  95. {
  96. objFile.Attributes = FileAttributes.Normal;
  97. objFile.Delete();
  98. }
  99. objFile = new FileInfo(zpWltFile);
  100. if (objFile.Exists)
  101. {
  102. objFile.Attributes = FileAttributes.Normal;
  103. objFile.Delete();
  104. }
  105. }
  106. catch (Exception ex)
  107. {
  108. Logger.Error("ReadIcCard", ex);
  109. return ReadCardReturnCodeEnum.ClearTempFileFailed;
  110. }
  111. byte[] pucChMsg = new byte[4096];
  112. byte[] pucPhMsg = new byte[4096];
  113. returnCode = SdtApi.SDT_ReadBaseMsg(_portID, pucChMsg, ref puiChMsgLen, pucPhMsg, ref puiPhMsgLen, IfOpen);
  114. if (returnCode != 0x90)
  115. {
  116. return ReadCardReturnCodeEnum.ReadCardFailed;
  117. }
  118. try
  119. {
  120. _idCardInfo = new IDCardInfo();
  121. _idCardInfo.Name = GetString(pucChMsg, 0, 30); //Encoding.Unicode.GetString(pucChMsg, 0, 30).Trim();
  122. _idCardInfo.SexCode = GetString(pucChMsg, 30, 2); //Encoding.Unicode.GetString(pucChMsg, 30, 2).Trim();
  123. _idCardInfo.PeopleCode = GetString(pucChMsg, 32, 4); //Encoding.Unicode.GetString(pucChMsg, 32, 4).Trim();
  124. var strBirthday = GetString(pucChMsg, 36, 16); //Encoding.Unicode.GetString(pucChMsg, 36, 16).Trim();
  125. try
  126. {
  127. if (string.IsNullOrEmpty(strBirthday) == false)
  128. {
  129. var birthday = string.Format("{0}-{1}-{2}", strBirthday.Substring(0, 4),
  130. strBirthday.Substring(4, 2),
  131. strBirthday.Substring(6, 2));
  132. Logger.Info("Birthday: " + birthday);
  133. _idCardInfo.Birthday = Convert.ToDateTime(birthday, DateTimeFormatInfo.InvariantInfo);
  134. }
  135. }
  136. catch (Exception ex)
  137. {
  138. Logger.Error("Birthday", ex);
  139. }
  140. _idCardInfo.Address = GetString(pucChMsg, 52, 70); //Encoding.Unicode.GetString(pucChMsg, 52, 70).Trim();
  141. _idCardInfo.Idc = GetString(pucChMsg, 122, 36); //Encoding.Unicode.GetString(pucChMsg, 122, 36).Trim();
  142. _idCardInfo.SignAddress = GetString(pucChMsg, 158, 30); //Encoding.Unicode.GetString(pucChMsg, 158, 30).Trim();
  143. var strTem = GetString(pucChMsg, 188, pucChMsg.GetLength(0) - 188); //Encoding.Unicode.GetString(pucChMsg, 188, pucChMsg.GetLength(0) - 188).Trim();
  144. try
  145. {
  146. if (string.IsNullOrEmpty(strTem) == false)
  147. {
  148. var strStartDate = string.Format("{0}-{1}-{2}", strTem.Substring(0, 4), strTem.Substring(4, 2),
  149. strTem.Substring(6, 2));
  150. Logger.Info("StartDate: " + strStartDate);
  151. _idCardInfo.StartDate = Convert.ToDateTime(strStartDate, DateTimeFormatInfo.InvariantInfo);
  152. }
  153. }
  154. catch (Exception ex)
  155. {
  156. Logger.Error("StartDate", ex);
  157. }
  158. try
  159. {
  160. if (string.IsNullOrEmpty(strTem) == false)
  161. {
  162. strTem = strTem.Substring(8);
  163. Logger.Info("EndDate: " + strTem.Trim());
  164. if (strTem.Trim() != "长期")
  165. {
  166. var strEndDate = string.Format("{0}-{1}-{2}", strTem.Substring(0, 4), strTem.Substring(4, 2),
  167. strTem.Substring(6, 2));
  168. Logger.Info("EndDate: " + strEndDate);
  169. _idCardInfo.EndDate = Convert.ToDateTime(strEndDate, DateTimeFormatInfo.InvariantInfo);
  170. }
  171. else
  172. {
  173. _idCardInfo.EndDate = DateTime.MaxValue;
  174. }
  175. }
  176. }
  177. catch (Exception ex)
  178. {
  179. Logger.Error("EndDate", ex);
  180. }
  181. //using (FileStream fs = File.Open(zpWltFile, FileMode.Create, FileAccess.ReadWrite))
  182. //{
  183. // fs.Write(pucPhMsg, 0, pucPhMsg.Length);
  184. //}
  185. //0: call sdtapi error
  186. //1: Ok
  187. //-1: Picture decode error
  188. //-2: wlt file suffix error
  189. //-3: wlt file open error
  190. //-4: wlt file format error
  191. //-5: Software unauthorized;
  192. //-6: Device connection error
  193. ////Temporary disable the image
  194. //returnCode = SdtApi.GetBmp(zpWltFile, _isUsbPort ? 2 : 1);
  195. //if (returnCode != 1)
  196. //{
  197. // readCardCode = ReadCardReturnCodeEnum.GetPictureFailed;
  198. //}
  199. //var fileInfo = new FileInfo(zpBmpFile);
  200. //if (fileInfo.Exists)
  201. //{
  202. // using (var binReader = new BinaryReader(File.Open(zpBmpFile, FileMode.Open)))
  203. // {
  204. // byte[] bytes = binReader.ReadBytes((int)fileInfo.Length);
  205. // binReader.Close();
  206. // var image = new BitmapImage();
  207. // image.BeginInit();
  208. // image.StreamSource = new MemoryStream(bytes);
  209. // image.EndInit();
  210. // //Compress the image
  211. // using (var m = new MemoryStream())
  212. // {
  213. // var encoder = new JpegBitmapEncoder { QualityLevel = 50 };
  214. // encoder.Frames.Add(BitmapFrame.Create(image));
  215. // encoder.Save(m);
  216. // _idCardInfo.PicByte = m.ToArray();
  217. // }
  218. // }
  219. //}
  220. }
  221. catch (Exception ex)
  222. {
  223. Logger.Error("ReadIcCard", ex);
  224. return ReadCardReturnCodeEnum.ParseCardInfoFailed;
  225. }
  226. return readCardCode;
  227. }
  228. private string GetString(byte[] bytes, int index, int count)
  229. {
  230. try
  231. {
  232. var str= Encoding.Unicode.GetString(bytes, index, count).Trim();
  233. return str;
  234. }
  235. catch (Exception ex)
  236. {
  237. Logger.Error(string.Format("GetString index:{0}, count:{1}", index, count));
  238. Logger.Error("GetString", ex);
  239. }
  240. return string.Empty;
  241. }
  242. }
  243. }