ReadCardAPI.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. namespace PTMedicalInsurance.CardReaders
  7. {
  8. public static class ReadCardAPI
  9. {
  10. //////////////////////////////////////////////////////////////////////////
  11. // SAM端口函数
  12. //
  13. //////////////////////////////////////////////////////////////////////////
  14. /// <summary>
  15. /// 查看串口当前波特率(该函数只用于SAM采用RS232串口的情形,如果采用USB接口则不支持该API)
  16. /// </summary>
  17. /// <param name="iPort">[in] 整数,表示端口号。此处端口号必须为1-16,表示串口</param>
  18. /// <param name="puiBaudRate">[out] 无符号整数指针,指向普通串口当前波特率, 默认情况下为115200</param>
  19. /// <returns>0成功,1失败/不合法,5无法获得该SAM的波特率,该SAM串口不可用</returns>
  20. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_GetCOMBaud")]
  21. public static extern int Syn_GetCOMBaud(int iPort, ref int puiBaudRate);
  22. /// <summary>
  23. /// 设置SAM的串口的波特率(该函数只用于SAM采用RS232串口的情形,如果采用USB接口则不支持该API),
  24. /// 设置成功后,在该SAM和主机注册表中都记录设置后的波特率,保证在SAM重新启动和该套API被重新调用时采用设置后的波特率。
  25. /// 该函数调用成功后,需要延时5毫秒,然后才能继续与SAM通信
  26. /// </summary>
  27. /// <param name="iPort">[in] 整数,表示端口号。此处端口号必须为1-16,表示串口。</param>
  28. /// <param name="uiCurrBaud">
  29. /// [in] 无符号整数,调用该API前已设置的业务终端与SAM通信的波特率(SAM出厂时默认,业务终端与SAM通信的波特率为115200).
  30. /// 业务终端以该波特率与SAM通信,发出设置SAM新波特率的命令.。
  31. /// uiCurrBaud只能为下列数值之一:115200,57600,38400,19200,9600.如果uiCurrBaud数值不是这些值之一,函数返回0X21;
  32. /// 如果已设置的波特率与uiCurrBaud不一致, 则函数返回0X02,表示不能设置,调用API不成功。
  33. /// </param>
  34. /// <param name="uiSetBaud">
  35. /// [in] 无符号整数,将要设置的SAM与业务终端通信波特率。
  36. /// uiSetBaud只能取下列值之一::115200,57600,38400,19200,9600,
  37. /// 如果输入uiSetBaud参数不是这些数值之一,,函数返回0X21,设置不成功,保持原来的波特率不变。
  38. /// </param>
  39. /// <returns>
  40. /// 0成功,1端口打开失败/端口号不合法,2超时,设置不成功,33 uiCurrBaud 、uiSetBaud输入参数数值错误
  41. /// </returns>
  42. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_GetCOMBaud")]
  43. public static extern int Syn_SetCOMBaud(int iPort, int uiCurrBaud, int uiSetBaud);
  44. /// <summary>
  45. /// 打开端口
  46. /// </summary>
  47. /// <param name="iPort">端口号。1-16(十进制)为串口,1001-1016(十进制)为USB口,9999为USBHID</param>
  48. /// <returns>0成功,1打开端口失败/端口号不合法</returns>
  49. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_OpenPort")]
  50. public static extern int Syn_OpenPort(int iPort);
  51. /// <summary>
  52. /// 关闭端口
  53. /// </summary>
  54. /// <param name="iPort">[in]整数,表示端口号</param>
  55. /// <returns>0成功,1端口不合法</returns>
  56. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_ClosePort")]
  57. public static extern int Syn_ClosePort(int iPort);
  58. //////////////////////////////////////////////////////////////////////////
  59. // SAM类函数
  60. //
  61. //////////////////////////////////////////////////////////////////////////
  62. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetMaxRFByte")]
  63. public static extern int Syn_SetMaxRFByte(int iPort,byte ucByte, int bIfOpen);
  64. /// <summary>
  65. /// 对SAM复位
  66. /// </summary>
  67. /// <param name="iPort">
  68. /// [in] 整数,表示端口号。
  69. /// 根据SAM使用的接口不同(分为普通串口SAM和USB口SAM),
  70. /// 分别使用不同的端口号(目前串口和USB都只支持16个,即串口0001-0016和USB1001-1016)
  71. /// </param>
  72. /// <param name="iIfOpen">
  73. /// [in] 整数,0表示不在该函数内部打开和关闭串口,
  74. /// 此时确保之前调用了Syn_OpenPort来打开端口,并且在不需要与端口通信时,调用Syn_ClosePort关闭端口;
  75. /// 非0表示在API函数内部包含了打开端口和关闭端口函数,之前不需要调用Syn_OpenPort,也不用再调用Syn_ClosePort
  76. /// </param>
  77. /// <returns>0成功,其他失败(具体参见返回码表)</returns>
  78. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_ResetSAM")]
  79. public static extern int Syn_ResetSAM(int iPort, int iIfOpen);
  80. /// <summary>
  81. /// 对SAM进行状态检测
  82. /// </summary>
  83. /// <param name="iPort">[in] 整数,表示端口号。参见Syn_ResetSAM</param>
  84. /// <param name="iIfOpen">[in] 整数,参见Syn_ResetSAM</param>
  85. /// <returns>0SAM正常,96自检失败,不能接收命令,其他,命令失败</returns>
  86. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_GetSAMStatus")]
  87. public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen);
  88. /// <summary>
  89. /// 读取SAM的编号
  90. /// </summary>
  91. /// <param name="iPort">[in] 整数,表示端口号。参见Syn_ResetSAM</param>
  92. /// <param name="pucSAMID">[out] 无符号字符串指针,指向读到的SAM编号, 16字节</param>
  93. /// <param name="iIfOpen"></param>
  94. /// <returns>0成功,其他,失败</returns>
  95. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_GetSAMID")]
  96. public static extern int Syn_GetSAMID(int iPort, byte[] pucSAMID, int iIfOpen);
  97. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_GetSAMIDToStr")]
  98. public static extern int Syn_GetSAMIDToStr(int iPort, ref char[] pucSAMID, int iIfOpen);
  99. //////////////////////////////////////////////////////////////////////////
  100. // 身份证卡类函数
  101. //
  102. //////////////////////////////////////////////////////////////////////////
  103. /// <summary>
  104. /// 开始寻卡
  105. /// </summary>
  106. /// <param name="iPort">[in] 整数,表示端口号。参见Syn_ResetSAM</param>
  107. /// <param name="pucIIN">[out] 无符号字符指针,指向读到的IIN</param>
  108. /// <param name="iIfOpen">[in] 整数,参见Syn_ResetSAM</param>
  109. /// <returns>0成功,128失败</returns>
  110. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_StartFindIDCard")]
  111. public static extern int Syn_StartFindIDCard(int iPort, ref byte[] pucIIN, int iIfOpen);
  112. /// <summary>
  113. /// 选卡
  114. /// </summary>
  115. /// <param name="iPort">[in] 整数,表示端口号。参见Syn_ResetSAM</param>
  116. /// <param name="pucIIN">[out] 无符号字符指针,指向读到的SN</param>
  117. /// <param name="iIfOpen">[in] 整数,参见Syn_ResetSAM</param>
  118. /// <returns>0选卡成功,129选卡失败</returns>
  119. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SelectIDCard")]
  120. public static extern int Syn_SelectIDCard(int iPort, ref byte[] pucIIN, int iIfOpen);
  121. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_ReadBaseMsg")]
  122. public static extern int Syn_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref int puiCHMsgLen,ref byte pucPHMsg,ref int puiPHMsgLen, int iIfOpen);
  123. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_ReadBaseMsgToFile")]
  124. public static extern int Syn_ReadBaseMsgToFile(int iPort, ref char[] pcCHMsgFileName, ref int puiCHMsgLen, ref char[] pcPHMsgFileName, ref int puiPHMsgLen, int iIfOpen);
  125. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_ReadBaseFPMsg")]
  126. public static extern int Syn_ReadBaseFPMsg(int iPort, ref byte pucCHMsg, ref int puiCHMsgLen, ref byte pucPHMsg, ref int puiPHMsgLen, ref byte pucFPMsg, ref int puiFPMsgLen, int iIfOpen);
  127. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_ReadBaseFPMsgToFile")]
  128. public static extern int Syn_ReadBaseFPMsgToFile(int iPort, ref char[] pcCHMsgFileName, ref int puiCHMsgFileLen, ref char[] pcPHMsgFileName, ref int puiPHMsgFileLen, ref char[] pcFPMsgFileName, ref int puiFPMsgFileLen, int iIfOpen);
  129. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_ReadNewAppMsg")]
  130. public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref int puiAppMsgLen, int iIfOpen);
  131. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_GetBmp")]
  132. public static extern int Syn_GetBmp(int iPort, ref char[] Wlt_File);
  133. /// <summary>
  134. /// 读取身份证中的基本信息和照片信息,并按设置转化信息和照片
  135. /// </summary>
  136. /// <param name="iPort">[in] 整数,表示端口号。参见Syn_ResetSAM</param>
  137. /// <param name="iIfOpen">[in] 整数,参见Syn_ResetSAM</param>
  138. /// <param name="pIDCardData">[out] IDCardData信息</param>
  139. /// <returns>0读取身份证信息成功,1读取身份证信息成功,解码照片不成功,其他.读取身份证信息失败</returns>
  140. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_ReadMsg")]
  141. public static extern int Syn_ReadMsg(int iPort, int iIfOpen, ref IDCardData pIDCardData);
  142. /// <summary>
  143. /// 读取身份证中的基本信息和照片信息,并按设置转化信息和照片
  144. /// </summary>
  145. /// <param name="iPort">[in] 整数,表示端口号。参见Syn_ResetSAM</param>
  146. /// <param name="iIfOpen">[in] 整数,参见Syn_ResetSAM</param>
  147. /// <param name="pIDCardData">[out] IDCardData信息</param>
  148. /// <param name="cFPhotoname">cFPhotoName返回指纹信息文件名</param>
  149. /// <returns>0读取身份证信息成功,无指纹信息,1读取身份证信息成功,指纹读取成功,其他.读取身份证信息失败</returns>
  150. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_ReadFPMsg")]
  151. public static extern int Syn_ReadFPMsg(int iPort, int iIfOpen, ref IDCardData pIDCardData, byte[] cFPhotoname);
  152. /// <summary>
  153. /// 自动寻找读卡器
  154. /// </summary>
  155. /// <returns>0失败,大于0为串口号或者端口号</returns>
  156. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_FindReader")]
  157. public static extern int Syn_FindReader();
  158. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_FindUSBReader")]
  159. public static extern int Syn_FindUSBReader();
  160. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_BmpToJpeg")]
  161. public static extern int Syn_BmpToJpeg(ref char[] cBmpName, ref char[] cJpegName);
  162. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_PhotoToStrBase64")]
  163. public static extern int Syn_PhotoToStrBase64(ref char[] cBase64, ref int iLen, ref char[] cPhotoName);
  164. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_StrBase64ToPhoto")]
  165. public static extern int Syn_StrBase64ToPhoto(ref char[] cBase64, int iLen, ref char[] cPhotoName);
  166. //////////////////////////////////////////////////////////////////////////
  167. // 设置附加功能函数
  168. //
  169. //////////////////////////////////////////////////////////////////////////
  170. /// <summary>
  171. /// 设置照片文件存储的路径
  172. /// </summary>
  173. /// //!!!使用64位动态库需要将license.dat放到cPhotoPath指定的目录!!!
  174. /// //使用32位动态库需要将license.dat放到C盘根目录
  175. /// <param name="iOption">[in] 整形,0=C:根目录, 1=当前路径 ,2=指定路径</param>
  176. /// <param name="cPhotoPath">[in] 字符指针。路径名</param>
  177. /// <returns></returns>
  178. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetPhotoPath")]
  179. public static extern int Syn_SetPhotoPath(int iOption, byte[] cPhotoPath);
  180. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetPhotoType")]
  181. public static extern int Syn_SetPhotoType(int iType);
  182. /// <summary>
  183. /// 设置照片文件的文件名
  184. /// </summary>
  185. /// <param name="iType">[in]整形。0=tmp,1=姓名,2=身份证号,3=姓名_身份证号</param>
  186. /// <returns>0成功,-1失败</returns>
  187. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetPhotoName")]
  188. public static extern int Syn_SetPhotoName(int iType);
  189. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetPhotoNameEx")]
  190. public static extern int Syn_SetPhotoNameEx(int iType, ref char[] cPhotoname);
  191. /// <summary>
  192. /// 设置返回性别的格式
  193. /// </summary>
  194. /// <param name="iType">[in] 整形。0=卡内存储的数据, 1=解释之后的数据</param>
  195. /// <returns>0成功,-1失败</returns>
  196. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetSexType")]
  197. public static extern int Syn_SetSexType(int iType);
  198. /// <summary>
  199. /// 设置返回民族的格式
  200. /// </summary>
  201. /// <param name="iType">[in]整形。0=卡内存储的数据,1=解释之后的数据,2=解释之后+“族”</param>
  202. /// <returns>0成功,-1失败</returns>
  203. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetNationType")]
  204. public static extern int Syn_SetNationType(int iType);
  205. /// <summary>
  206. /// 设置返回出生日期的格式
  207. /// </summary>
  208. /// <param name="iType">in] 整形。0=YYYYMMDD,1=YYYY年MM月DD日,2=YYYY.MM.DD,3=YYYY-MM-DD,4=YYYY/MM/DD</param>
  209. /// <returns>0成功,-1失败</returns>
  210. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetBornType")]
  211. public static extern int Syn_SetBornType(int iType);
  212. /// <summary>
  213. /// 设置返回有效期开始日期的格式
  214. /// </summary>
  215. /// <param name="iType">[in] 整形。0=YYYYMMDD,1=YYYY年MM月DD日,2=YYYY.MM.DD,3=YYYY-MM-DD,4=YYYY/MM/DD</param>
  216. /// <returns>0成功,-1失败</returns>
  217. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetUserLifeBType")]
  218. public static extern int Syn_SetUserLifeBType(int iType);
  219. /// <summary>
  220. /// 设置返回有效期结束日期的格式
  221. /// </summary>
  222. /// <param name="iType">[in] 整形。0=YYYYMMDD,1=YYYY年MM月DD日,2=YYYY.MM.DD,3=YYYY-MM-DD,4=YYYY/MM/DD</param>
  223. /// <param name="iOption">[in] 整形。0=长期不转换 1=长期转换为 有效期开始加50年</param>
  224. /// <returns>0成功,-1失败</returns>
  225. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SetUserLifeEType")]
  226. public static extern int Syn_SetUserLifeEType(int iType, int iOption);
  227. //////////////////////////////////////////////////////////////////////////
  228. // USBHID函数
  229. //
  230. //////////////////////////////////////////////////////////////////////////
  231. /// <summary>
  232. /// 复位M1卡片,返回M1卡片的卡号和卡类型
  233. /// </summary>
  234. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  235. /// <param name="pdwCardSN">[out]无符号四字节,返回M1卡片卡号</param>
  236. /// <param name="pbSize">[out] 无符号字节数组,返回M1卡卡类型</param>
  237. /// <returns>0成功,其他失败</returns>
  238. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDM1Reset")]
  239. public static extern int Syn_USBHIDM1Reset(int iPort, ref UInt32 pdwCardSN, ref byte pbSize);
  240. /// <summary>
  241. /// 用密钥验证M1卡
  242. /// </summary>
  243. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  244. /// <param name="KeyType">[in]无符号字节,验证类型,0—密钥A验证 1—密钥B验证</param>
  245. /// <param name="BlockNo">[in]无符号字节,M1卡块号</param>
  246. /// <param name="pKey">[in]无符号字节数组,6字节,密钥数组</param>
  247. /// <returns>0成功,128失败</returns>
  248. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDM1AuthenKey")]
  249. public static extern int Syn_USBHIDM1AuthenKey(int iPort, byte KeyType, byte BlockNo, byte[] pKey);
  250. /// <summary>
  251. /// 读M1卡
  252. /// </summary>
  253. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  254. /// <param name="BlockNo">[in]无符号字节,M1卡块号</param>
  255. /// <param name="pBlock">[out]无符号字节数组,16字节,读取的数据</param>
  256. /// <returns>0成功,其他失败</returns>
  257. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDM1ReadBlock")]
  258. public static extern int Syn_USBHIDM1ReadBlock(int iPort, byte BlockNo, byte[] pBlock);
  259. /// <summary>
  260. /// 写M1卡
  261. /// </summary>
  262. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  263. /// <param name="BlockNo">[in]无符号字节,M1卡块号</param>
  264. /// <param name="pBlock">[in]无符号字节数组,16字节,读取的数据</param>
  265. /// <returns>0成功</returns>
  266. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDM1WriteBlock")]
  267. public static extern int Syn_USBHIDM1WriteBlock(int iPort, byte BlockNo, byte[] pBlock);
  268. /// <summary>
  269. /// 挂起M1卡
  270. /// </summary>
  271. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  272. /// <returns>0成功</returns>
  273. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDM1Halt")]
  274. public static extern int Syn_USBHIDM1Halt(int iPort);
  275. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDReadFactoryInfo")]
  276. public static extern int Syn_USBHIDReadFactoryInfo(int iPort, ref byte pFactory, ref byte pVol, ref byte pSerialNo, ref byte pReserved);
  277. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDWriteFactoryInfo")]
  278. public static extern int Syn_USBHIDWriteFactoryInfo(int iPort, ref byte pFactory, ref byte pVol, ref byte pSerialNo, ref byte pReserved);
  279. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDReadUserInfo")]
  280. public static extern int Syn_USBHIDReadUserInfo(int iPort, ref byte pInfo);
  281. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDWriteUserInfo")]
  282. public static extern int Syn_USBHIDWriteUserInfo(int iPort, ref byte pInfo);
  283. /// <summary>
  284. /// 获得读卡器支持的最大通讯字节数和版本
  285. /// </summary>
  286. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  287. /// <param name="pSAMMaxByte">[out]无符号字节,读卡器支持的最大通讯字节数</param>
  288. /// <param name="pARMVol">[out]无符号字节数组,版本号</param>
  289. /// <returns></returns>
  290. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDGetMaxByte")]
  291. public static extern int Syn_USBHIDGetMaxByte(int iPort, ref byte pSAMMaxByte, ref byte pARMVol);
  292. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDSendSound")]
  293. public static extern int Syn_USBHIDSendSound(int iPort, byte ucSound);
  294. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDControlLED")]
  295. public static extern int Syn_USBHIDControlLED(int iPort, byte ucLed);
  296. /// <summary>
  297. /// 控制蜂鸣器命令(仅A16D-HF)
  298. /// </summary>
  299. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  300. /// <param name="ucType">[in]无符号整形,命令,暂定为0X04</param>
  301. /// <param name="usTime"> [in]整形,蜂鸣器响时间,毫秒计算</param>
  302. /// <returns>0成功</returns>
  303. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDControlBeep")]
  304. public static extern int Syn_USBHIDControlBeep(int iPort, byte ucType, int usTime);
  305. /// <summary>
  306. /// 读取二代证ID号(仅A16D-HF)
  307. /// </summary>
  308. /// <param name="iPort"> [in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  309. /// <param name="pdwCardSN"> [out] 无符号字节数组,长度8字节</param>
  310. /// <returns>0成功,128失败</returns>
  311. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDGetSecCardID")]
  312. public static extern int Syn_USBHIDGetSecCardID(int iPort, byte[] pdwCardSN);
  313. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDSIMpowerOn")]
  314. public static extern int Syn_USBHIDSIMpowerOn(int iPort, ref byte ucATR,ref byte ucLen);
  315. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDSIMpowerOff")]
  316. public static extern int Syn_USBHIDSIMpowerOff(int iPort);
  317. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDSIMAPDU")]
  318. public static extern int Syn_USBHIDSIMAPDU(int iPort, int slen, ref byte datasend, ref int rlen, ref byte datareceive);
  319. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDSetUserIDCode")]
  320. public static extern int Syn_USBHIDSetUserIDCode(int iPort, ref byte code, int len);
  321. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDSetUserIDCode")]
  322. public static extern int Syn_USBHIDWriteUserMac(int iPort, ref byte pMac);
  323. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDIsEncryptMode")]
  324. public static extern int Syn_USBHIDIsEncryptMode(int iPort);
  325. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_USBHIDIsEncryptMode")]
  326. public static extern int Syn_USBHIDdoUpdate(int iPort, ref byte updateBuffer, int bufferLen, int progressCallback);
  327. //////////////////////////////////////////////////////////////////////////
  328. // 串口操作M1卡函数
  329. //
  330. //////////////////////////////////////////////////////////////////////////
  331. /// <summary>
  332. /// 打开串口
  333. /// </summary>
  334. /// <param name="iPort">串口号(1-16)</param>
  335. /// <param name="badurate">波特率(可使用Syn_GetCOMBaud获得)</param>
  336. /// <returns>0成功,其他失败</returns>
  337. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SerialOpen")]
  338. public static extern int Syn_SerialOpen(int iPort, int badurate);
  339. /// <summary>
  340. /// 关闭串口
  341. /// </summary>
  342. /// <param name="iPort">串口号(1-16)</param>
  343. /// <returns></returns>
  344. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SerialClose")]
  345. public static extern int Syn_SerialClose(int iPort);
  346. /// <summary>
  347. /// 复位M1卡片,返回M1卡片的卡号和卡类型
  348. /// </summary>
  349. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  350. /// <param name="pdwCardSN">[out]无符号四字节,返回M1卡片卡号</param>
  351. /// <param name="pbSize">[out] 无符号字节数组,返回M1卡卡类型</param>
  352. /// <returns>0成功,其他失败</returns>
  353. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SerialM1Reset")]
  354. public static extern int Syn_SerialM1Reset(int iPort, ref UInt32 pdwCardSN, ref byte pbSize);
  355. /// <summary>
  356. /// 用密钥验证M1卡
  357. /// </summary>
  358. /// <param name="iPort">[in]整形,读卡器的串口号(1-16),可以使用Syn_FindReader获得</param>
  359. /// <param name="KeyType">[in]无符号字节,验证类型,0—密钥A验证 1—密钥B验证</param>
  360. /// <param name="BlockNo">[in]无符号字节,M1卡块号</param>
  361. /// <param name="pKey">[in]无符号字节数组,6字节,密钥数组</param>
  362. /// <returns>0成功,128失败</returns>
  363. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SerialM1AuthenKey")]
  364. public static extern int Syn_SerialM1AuthenKey(int iPort,byte KeyType, byte BlockNo, byte[] pKey);
  365. /// <summary>
  366. /// 读M1卡
  367. /// </summary>
  368. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  369. /// <param name="BlockNo">[in]无符号字节,M1卡块号</param>
  370. /// <param name="pBlock">[out]无符号字节数组,16字节,读取的数据</param>
  371. /// <returns>0成功,其他失败</returns>
  372. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SerialM1ReadBlock")]
  373. public static extern int Syn_SerialM1ReadBlock(int iPort, byte BlockNo, byte[] pBlock);
  374. /// <summary>
  375. /// 写M1卡
  376. /// </summary>
  377. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  378. /// <param name="BlockNo">[in]无符号字节,M1卡块号</param>
  379. /// <param name="pBlock">[in]无符号字节数组,16字节,读取的数据</param>
  380. /// <returns>0成功</returns>
  381. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SerialM1WriteBlock")]
  382. public static extern int Syn_SerialM1WriteBlock(int iPort, byte BlockNo, byte[] pBlock);
  383. /// <summary>
  384. /// 挂起M1卡
  385. /// </summary>
  386. /// <param name="iPort">[in]整形,读卡器的端口号,可以使用Syn_FindReader获得</param>
  387. /// <returns>0成功</returns>
  388. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_SerialM1Halt")]
  389. public static extern int Syn_SerialM1Halt(int iPort);
  390. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_StartFindCPUCard")]
  391. public static extern int Syn_StartFindCPUCard(int iPort, byte[] ATS, ref int rlen);
  392. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_StartRemoveCPUCard")]
  393. public static extern int Syn_StartRemoveCPUCard(int iPort, byte[] ATS);
  394. [DllImport("SynIDCardAPI.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, EntryPoint = "Syn_PCTOCPUCard")]
  395. public static extern int Syn_PCTOCPUCard(int iPort, int slen, byte[] datasend, ref int rlen, byte[] datareceive);
  396. /// <summary>
  397. /// 寻找USB读卡器
  398. /// </summary>
  399. /// <returns></returns>
  400. public static int findUSBDriverDevice()
  401. {
  402. int nRet;
  403. for (int i = 1001; i < 1017; i++)
  404. {
  405. nRet = ReadCardAPI.Syn_OpenPort(i);
  406. if (nRet == 0)
  407. {
  408. nRet = ReadCardAPI.Syn_GetSAMStatus(i, 0);
  409. if (nRet == 0)
  410. {
  411. ReadCardAPI.Syn_ClosePort(i);
  412. return i;
  413. }
  414. ReadCardAPI.Syn_ClosePort(i);
  415. }
  416. }
  417. return 0;
  418. }
  419. /// <summary>
  420. /// 寻找USBHID读卡器
  421. /// </summary>
  422. /// <returns></returns>
  423. public static int findUSBHIDDevice()
  424. {
  425. int nRet;
  426. nRet = Syn_OpenPort(9999);
  427. if (nRet == 0)
  428. {
  429. Syn_ClosePort(9999);
  430. return 9999;
  431. }
  432. return 0;
  433. }
  434. /// <summary>
  435. /// 寻找串口读卡器
  436. /// </summary>
  437. /// <returns></returns>
  438. public static int findSerialDevice()
  439. {
  440. int nRet = 0;
  441. int m_iBaud = 0;
  442. for (int j = 1; j < 17; j++)
  443. {
  444. nRet = Syn_GetCOMBaud(j, ref m_iBaud);
  445. if (nRet == 0)
  446. {
  447. nRet = Syn_SetCOMBaud(j, m_iBaud, m_iBaud);
  448. if (nRet == 0)
  449. {
  450. Syn_ClosePort(j);
  451. return j;
  452. }
  453. Syn_ClosePort(j);
  454. }
  455. }
  456. return 0;
  457. }
  458. }
  459. #region 结构体
  460. //[StructLayout(LayoutKind.Sequential)]
  461. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
  462. public struct IDCardData
  463. {
  464. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] //ByValTStr ByValArray CertVol
  465. public string Name; //姓名
  466. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
  467. public string Sex; //性别
  468. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
  469. public string Nation; //民族
  470. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
  471. public string Born; //出生日期
  472. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
  473. public string Address; //住址
  474. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
  475. public string IDCardNo; //身份证号
  476. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
  477. public string GrantDept; //发证机关
  478. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
  479. public string UserLifeBegin; // 有效开始日期
  480. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
  481. public string UserLifeEnd; // 有效截止日期
  482. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
  483. public string PassID; //通行证号码
  484. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
  485. public string IssuesTimes; //签发次数
  486. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
  487. public string reserved; // 保留
  488. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
  489. public string PhotoFileName;// 照片路径
  490. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
  491. public string CardType;// 证件类型
  492. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 122)]
  493. public string EngName;// 英文名
  494. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
  495. public string CertVol;// 证件版本号
  496. //
  497. public override string ToString()
  498. {
  499. return JsonConvert.SerializeObject(this);
  500. }
  501. }
  502. #endregion
  503. }