Java读取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

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;
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是实现读取NFC卡卡的示例代码: 首先,在 AndroidManifest.xml 中添加以下权限: ```xml <uses-permission android:name="android.permission.NFC" /> ``` 然后,在你的 Activity 中添加以下代码: ```java public class MainActivity extends AppCompatActivity { private NfcAdapter nfcAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { Toast.makeText(this, "设备不支持NFC功能!", Toast.LENGTH_SHORT).show(); finish(); return; } if (!nfcAdapter.isEnabled()) { Toast.makeText(this, "请在系统设置中先启用NFC功能!", Toast.LENGTH_SHORT).show(); finish(); return; } } @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { filter.addDataType("*/*"); } catch (IntentFilter.MalformedMimeTypeException e) { e.printStackTrace(); } Intent intent = new Intent(this, getClass()); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); nfcAdapter.enableForegroundDispatch(this, pendingIntent, new IntentFilter[]{filter}, null); } @Override protected void onPause() { super.onPause(); nfcAdapter.disableForegroundDispatch(this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); String cardId = ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)); // 这里的 cardId 就是读取到的,可以进行相应的操作 Toast.makeText(this, ":" + cardId, Toast.LENGTH_SHORT).show(); } /** * 将 byte 数组转换为十六进制字符串 * * @param byteArray byte 数组 * @return 十六进制字符串 */ private String ByteArrayToHexString(byte[] byteArray) { StringBuilder result = new StringBuilder(); for (byte b : byteArray) { result.append(String.format("%02X", b)); } return result.toString(); } } ``` 以上代码的作用是: 1. 检查设备是否支持 NFC 功能,以及 NFC 功能是否已启用。 2. 注册一个 IntentFilter,用于指定当读取到 NFC 时,应该启动哪个 Activity。 3. 当读取到 NFC 时,会触发 onNewIntent() 方法,从 Intent 中取出信息,并进行相应的操作。 希望这个示例能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

津津有味道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值