当前位置:   article > 正文

Java读取ID卡卡号源码_读取卡片id的代码

读取卡片id的代码

 读卡器介绍:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.17.4aad5b43flg23y&id=562957272162https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.17.4aad5b43flg23y&id=562957272162

  1. import com.sun.jna.Library ;
  2. import com.sun.jna.Native;
  3. interface CLibrary extends Library {
  4. //DLL绝对路径的地址获取,注意要去空格,特别坑
  5. //不同版本的读写器,接口DLL文件名称、函数名称是一样的,但内核代码不一样,请选用与读写器、操作系统一致的OUR_IDR.dll
  6. String filePath = CLibrary.class.getResource("").getPath().replaceFirst("/","").replaceAll("%20"," ")+"OUR_IDR";
  7. CLibrary sdtapi = (CLibrary) Native.loadLibrary(filePath, CLibrary.class);
  8. //动态链接库中的方法
  9. byte idr_beep(int xms); //让设备发出声音
  10. byte pcdgetdevicenumber(byte[] devicenumber); //读取设备编号
  11. String pcdgetdevicenumber_str(); //读取设备编号,输出字符串
  12. byte idr_read(byte[] mypiccserial ); //轻松读卡,只要卡在感应区,每次执行此方法都可以读到卡号
  13. byte idr_read_once(byte[] mypiccserial ); //卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
  14. String idr_read_8h10d_str(); //读卡,输出十位十进制卡号
  15. String idr_read_once_8h10d_str(); //读卡,输出十位十进制卡号,卡在感应区时只读一次
  16. }
  17. public class IDReader {
  18. public static void main(String[] args) {
  19. System.setProperty("jna.encoding", "GBK");
  20. String filePath = CLibrary.class.getResource("").getPath().replaceFirst("/", "").replaceAll("%20", " ") + "OUR_IDR.DLL";
  21. System.out.println("本示例引用的DLL文件:" + filePath);
  22. if (args.length == 0) {
  23. System.out.println("\n请先输入运行参数!");
  24. System.out.println("\n参数 0:驱动读卡器嘀一声");
  25. System.out.println("\n参数 1:读取设备编号");
  26. System.out.println("\n参数 2:读取设备编号,输出字符串");
  27. System.out.println("\n参数 3:轻松读卡");
  28. System.out.println("\n参数 4:轻松读卡,卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡");
  29. System.out.println("\n参数 5:轻松读卡,输出十位十进制卡号");
  30. System.out.println("\n参数 6:轻松读卡,输出十位十进制卡号,卡在感应区时只能读一次");
  31. return;
  32. }
  33. //Java中只能使用string1.equals(string2)的方式来比较字符串
  34. if (args[0].equals("0")) { //驱动读卡器发嘀一声
  35. System.out.print("\n0-驱动读卡器嘀一声\n");
  36. CLibrary.sdtapi.idr_beep(50);
  37. System.out.print("结果:如果能听到读卡器嘀一声表示成功,否则请检查读卡器是否已连上线!\n\n");
  38. } else if (args[0].equals("1")) //读取设备编号,可做为软件加密狗用,也可以根据此编号在公司网站上查询保修期限
  39. {
  40. int status; //存放返回值
  41. byte[] devicenumber = new byte[4]; //4字节设备编号
  42. System.out.print("\n1-读取设备编号\n");
  43. status = (int) (CLibrary.sdtapi.pcdgetdevicenumber(devicenumber) & 0xff);//& 0xff用于转为无符号行数据
  44. System.out.print("结果:");
  45. if (status == 0) {
  46. CLibrary.sdtapi.idr_beep(38);
  47. System.out.print("读取成功!设备编号为:" + (devicenumber[0] & 0xff) + "-" + (devicenumber[1] & 0xff) + "-" + (devicenumber[2] & 0xff) + "-" + (devicenumber[3] & 0xff));
  48. } else {
  49. PrintErrInf(status); //错误代码提示
  50. }
  51. }else if (args[0].equals("2")) //读取设备编号,直接输出字符串
  52. {
  53. System.out.print("\n2-读取设备编号\n");
  54. String devicenumber = CLibrary.sdtapi.pcdgetdevicenumber_str(); //设备编号
  55. CLibrary.sdtapi.idr_beep(38);
  56. System.out.print("读取成功!设备编号为:" + devicenumber+"\n");
  57. }else if (args[0].equals("3")) //轻松读卡
  58. {
  59. int status; //存放返回值
  60. byte[] mypiccserial = new byte[5]; //5字节卡序列号
  61. System.out.print("\n3-轻松读卡\n");
  62. status = (int) (CLibrary.sdtapi.idr_read(mypiccserial ) & 0xff); //只要卡在感应区,每次执行此方法都可以读到卡号
  63. System.out.print("结果:");
  64. if (status == 0) {
  65. CLibrary.sdtapi.idr_beep(38);
  66. String serialnumber = "";
  67. for (int i = 0; i < 5; i++) {
  68. String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
  69. serialnumber = serialnumber + bytestr.substring(bytestr.length() - 2, bytestr.length());
  70. }
  71. System.out.print("读取成功!16进制卡序列号为:" + serialnumber+"\n");
  72. long cardnum;
  73. cardnum=mypiccserial[4] & 0xff;
  74. cardnum=cardnum+(mypiccserial[3] & 0xff) *256;
  75. cardnum=cardnum+(mypiccserial[2] & 0xff) *65536;
  76. cardnum=cardnum+(mypiccserial[1] & 0xff) *16777216;
  77. long cardno10 = 0;
  78. for (int j=28; j>=0; j-=4) {
  79. cardno10 = cardno10<<4 | (cardnum>>>j & 0xF);
  80. }
  81. System.out.print("换算成10进制卡号:"+String.format("%010d", cardno10)+"\n");
  82. } else {
  83. PrintErrInf(status); //错误代码提示
  84. }
  85. }else if (args[0].equals("4")) //轻松读卡,卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
  86. {
  87. int status; //存放返回值
  88. byte[] mypiccserial = new byte[5]; //5字节卡序列号
  89. System.out.print("\n4-轻松读一次卡\n");
  90. status = (int) (CLibrary.sdtapi.idr_read_once(mypiccserial ) & 0xff); //卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
  91. System.out.print("结果:");
  92. if (status == 0) {
  93. CLibrary.sdtapi.idr_beep(38);
  94. String serialnumber = "";
  95. for (int i = 0; i < 5; i++) {
  96. String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
  97. serialnumber = serialnumber + bytestr.substring(bytestr.length() - 2, bytestr.length());
  98. }
  99. System.out.print("读取成功!16进制卡序列号为:" + serialnumber+"\n");
  100. long cardnum;
  101. cardnum=mypiccserial[4] & 0xff;
  102. cardnum=cardnum+(mypiccserial[3] & 0xff) *256;
  103. cardnum=cardnum+(mypiccserial[2] & 0xff) *65536;
  104. cardnum=cardnum+(mypiccserial[1] & 0xff) *16777216;
  105. long cardno10 = 0;
  106. for (int j=28; j>=0; j-=4) {
  107. cardno10 = cardno10<<4 | (cardnum>>>j & 0xF);
  108. }
  109. System.out.print("换算成10进制卡号:"+String.format("%010d", cardno10)+"\n");
  110. } else {
  111. PrintErrInf(status); //错误代码提示
  112. }
  113. }else if (args[0].equals("5")) //读卡,输出十位十进制卡号
  114. {
  115. System.out.print("\n5-读10进制卡号\n");
  116. String serialnumber = CLibrary.sdtapi.idr_read_8h10d_str(); //只要卡在感应区,每次执行此方法都可以读到卡号
  117. CLibrary.sdtapi.idr_beep(38);
  118. System.out.print("读卡操作结束,返回信息:" + serialnumber+"\n");
  119. }else if (args[0].equals("6")) //读卡,输出十位十进制卡号,卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
  120. {
  121. System.out.print("\n6-读10进制卡号,只读一次\n");
  122. String serialnumber = CLibrary.sdtapi.idr_read_once_8h10d_str(); 卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
  123. CLibrary.sdtapi.idr_beep(38);
  124. System.out.print("读卡操作结束,返回信息:" + serialnumber+"\n");
  125. }
  126. }
  127. //----------------------------------------------------------------------------------错误代码提示
  128. static void PrintErrInf(int errcode) {
  129. switch(errcode){
  130. case 8:
  131. System.out.print("错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!\n");
  132. break;
  133. case 21:
  134. System.out.print("错误代码:21,没有动态库!\n");
  135. break;
  136. case 22:
  137. System.out.print("错误代码:22,动态库或驱动程序异常!\n");
  138. break;
  139. case 23:
  140. System.out.print("错误代码:23,驱动程序错误或尚未安装!\n");
  141. break;
  142. case 24:
  143. System.out.print("错误代码:24,操作超时,一般是动态库没有反映!\n");
  144. break;
  145. case 25:
  146. System.out.print("错误代码:25,发送字数不够!\n");
  147. break;
  148. case 26:
  149. System.out.print("错误代码:26,发送的CRC错!\n");
  150. break;
  151. case 27:
  152. System.out.print("错误代码:27,接收的字数不够!\n");
  153. break;
  154. case 28:
  155. System.out.print("错误代码:28,接收的CRC错!\n");
  156. break;
  157. default:
  158. System.out.print("未知错误,错误代码:"+Integer.toString(errcode)+"\n");
  159. break;
  160. }
  161. }
  162. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/983707
推荐阅读
相关标签
  

闽ICP备14008679号