赞
踩
- import com.sun.jna.Library ;
- import com.sun.jna.Native;
-
- interface CLibrary extends Library {
- //DLL绝对路径的地址获取,注意要去空格,特别坑
- //不同版本的读写器,接口DLL文件名称、函数名称是一样的,但内核代码不一样,请选用与读写器、操作系统一致的OUR_IDR.dll
- String filePath = CLibrary.class.getResource("").getPath().replaceFirst("/","").replaceAll("%20"," ")+"OUR_IDR";
- CLibrary sdtapi = (CLibrary) Native.loadLibrary(filePath, CLibrary.class);
-
- //动态链接库中的方法
- byte idr_beep(int xms); //让设备发出声音
- byte pcdgetdevicenumber(byte[] devicenumber); //读取设备编号
- String pcdgetdevicenumber_str(); //读取设备编号,输出字符串
- byte idr_read(byte[] mypiccserial ); //轻松读卡,只要卡在感应区,每次执行此方法都可以读到卡号
- byte idr_read_once(byte[] mypiccserial ); //卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
- String idr_read_8h10d_str(); //读卡,输出十位十进制卡号
- String idr_read_once_8h10d_str(); //读卡,输出十位十进制卡号,卡在感应区时只读一次
- }
- public class IDReader {
- public static void main(String[] args) {
- System.setProperty("jna.encoding", "GBK");
- String filePath = CLibrary.class.getResource("").getPath().replaceFirst("/", "").replaceAll("%20", " ") + "OUR_IDR.DLL";
- System.out.println("本示例引用的DLL文件:" + filePath);
-
- if (args.length == 0) {
- System.out.println("\n请先输入运行参数!");
- System.out.println("\n参数 0:驱动读卡器嘀一声");
- System.out.println("\n参数 1:读取设备编号");
- System.out.println("\n参数 2:读取设备编号,输出字符串");
- System.out.println("\n参数 3:轻松读卡");
- System.out.println("\n参数 4:轻松读卡,卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡");
- System.out.println("\n参数 5:轻松读卡,输出十位十进制卡号");
- System.out.println("\n参数 6:轻松读卡,输出十位十进制卡号,卡在感应区时只能读一次");
- return;
- }
-
- //Java中只能使用string1.equals(string2)的方式来比较字符串
- if (args[0].equals("0")) { //驱动读卡器发嘀一声
- System.out.print("\n0-驱动读卡器嘀一声\n");
- CLibrary.sdtapi.idr_beep(50);
- System.out.print("结果:如果能听到读卡器嘀一声表示成功,否则请检查读卡器是否已连上线!\n\n");
-
- } else if (args[0].equals("1")) //读取设备编号,可做为软件加密狗用,也可以根据此编号在公司网站上查询保修期限
- {
- int status; //存放返回值
- byte[] devicenumber = new byte[4]; //4字节设备编号
-
- System.out.print("\n1-读取设备编号\n");
- status = (int) (CLibrary.sdtapi.pcdgetdevicenumber(devicenumber) & 0xff);//& 0xff用于转为无符号行数据
- System.out.print("结果:");
- if (status == 0) {
- CLibrary.sdtapi.idr_beep(38);
- System.out.print("读取成功!设备编号为:" + (devicenumber[0] & 0xff) + "-" + (devicenumber[1] & 0xff) + "-" + (devicenumber[2] & 0xff) + "-" + (devicenumber[3] & 0xff));
- } else {
- PrintErrInf(status); //错误代码提示
- }
-
- }else if (args[0].equals("2")) //读取设备编号,直接输出字符串
- {
- System.out.print("\n2-读取设备编号\n");
- String devicenumber = CLibrary.sdtapi.pcdgetdevicenumber_str(); //设备编号
- CLibrary.sdtapi.idr_beep(38);
- System.out.print("读取成功!设备编号为:" + devicenumber+"\n");
-
- }else if (args[0].equals("3")) //轻松读卡
- {
- int status; //存放返回值
- byte[] mypiccserial = new byte[5]; //5字节卡序列号
-
- System.out.print("\n3-轻松读卡\n");
- status = (int) (CLibrary.sdtapi.idr_read(mypiccserial ) & 0xff); //只要卡在感应区,每次执行此方法都可以读到卡号
- System.out.print("结果:");
- if (status == 0) {
- CLibrary.sdtapi.idr_beep(38);
- String serialnumber = "";
- for (int i = 0; i < 5; i++) {
- String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
- serialnumber = serialnumber + bytestr.substring(bytestr.length() - 2, bytestr.length());
- }
- System.out.print("读取成功!16进制卡序列号为:" + serialnumber+"\n");
-
- long cardnum;
- cardnum=mypiccserial[4] & 0xff;
- cardnum=cardnum+(mypiccserial[3] & 0xff) *256;
- cardnum=cardnum+(mypiccserial[2] & 0xff) *65536;
- cardnum=cardnum+(mypiccserial[1] & 0xff) *16777216;
- long cardno10 = 0;
- for (int j=28; j>=0; j-=4) {
- cardno10 = cardno10<<4 | (cardnum>>>j & 0xF);
- }
- System.out.print("换算成10进制卡号:"+String.format("%010d", cardno10)+"\n");
- } else {
- PrintErrInf(status); //错误代码提示
- }
-
- }else if (args[0].equals("4")) //轻松读卡,卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
- {
- int status; //存放返回值
- byte[] mypiccserial = new byte[5]; //5字节卡序列号
-
- System.out.print("\n4-轻松读一次卡\n");
- status = (int) (CLibrary.sdtapi.idr_read_once(mypiccserial ) & 0xff); //卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
- System.out.print("结果:");
- if (status == 0) {
- CLibrary.sdtapi.idr_beep(38);
- String serialnumber = "";
- for (int i = 0; i < 5; i++) {
- String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);
- serialnumber = serialnumber + bytestr.substring(bytestr.length() - 2, bytestr.length());
- }
- System.out.print("读取成功!16进制卡序列号为:" + serialnumber+"\n");
-
- long cardnum;
- cardnum=mypiccserial[4] & 0xff;
- cardnum=cardnum+(mypiccserial[3] & 0xff) *256;
- cardnum=cardnum+(mypiccserial[2] & 0xff) *65536;
- cardnum=cardnum+(mypiccserial[1] & 0xff) *16777216;
- long cardno10 = 0;
- for (int j=28; j>=0; j-=4) {
- cardno10 = cardno10<<4 | (cardnum>>>j & 0xF);
- }
- System.out.print("换算成10进制卡号:"+String.format("%010d", cardno10)+"\n");
- } else {
- PrintErrInf(status); //错误代码提示
- }
-
- }else if (args[0].equals("5")) //读卡,输出十位十进制卡号
- {
- System.out.print("\n5-读10进制卡号\n");
- String serialnumber = CLibrary.sdtapi.idr_read_8h10d_str(); //只要卡在感应区,每次执行此方法都可以读到卡号
- CLibrary.sdtapi.idr_beep(38);
- System.out.print("读卡操作结束,返回信息:" + serialnumber+"\n");
-
- }else if (args[0].equals("6")) //读卡,输出十位十进制卡号,卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
- {
- System.out.print("\n6-读10进制卡号,只读一次\n");
- String serialnumber = CLibrary.sdtapi.idr_read_once_8h10d_str(); 卡在感应区时只能读一次,需将卡从感应区盒开再放入感应区才能再次读到卡
- CLibrary.sdtapi.idr_beep(38);
- System.out.print("读卡操作结束,返回信息:" + serialnumber+"\n");
- }
-
-
- }
-
- //----------------------------------------------------------------------------------错误代码提示
- static void PrintErrInf(int errcode) {
- switch(errcode){
- case 8:
- System.out.print("错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!\n");
- break;
- case 21:
- System.out.print("错误代码:21,没有动态库!\n");
- break;
- case 22:
- System.out.print("错误代码:22,动态库或驱动程序异常!\n");
- break;
- case 23:
- System.out.print("错误代码:23,驱动程序错误或尚未安装!\n");
- break;
- case 24:
- System.out.print("错误代码:24,操作超时,一般是动态库没有反映!\n");
- break;
- case 25:
- System.out.print("错误代码:25,发送字数不够!\n");
- break;
- case 26:
- System.out.print("错误代码:26,发送的CRC错!\n");
- break;
- case 27:
- System.out.print("错误代码:27,接收的字数不够!\n");
- break;
- case 28:
- System.out.print("错误代码:28,接收的CRC错!\n");
- break;
- default:
- System.out.print("未知错误,错误代码:"+Integer.toString(errcode)+"\n");
- break;
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。