java – 使用SCL010获取Mifare Ultralight的UID
发布时间:2020-12-14 16:47:38 所属栏目:Java 来源:网络整理
导读:我想获得Mifare Ultralight NFC标签的UID. 在 Java中我有这个代码: TerminalFactory factory = TerminalFactory.getDefault();ListCardTerminal terminals = factory.terminals().list();System.out.println("Terminals: " + terminals);CardTerminal termi
我想获得Mifare Ultralight NFC标签的UID.
在 Java中我有这个代码: TerminalFactory factory = TerminalFactory.getDefault(); List<CardTerminal> terminals = factory.terminals().list(); System.out.println("Terminals: " + terminals); CardTerminal terminal = terminals.get(0); Card card = terminal.connect("*"); System.out.println("card: " + card); CardChannel channel = card.getBasicChannel(); ResponseAPDU answer = channel.transmit(new CommandAPDU(0xFF,0xCA,0x00,0x00)); byte[] uid = answer.getBytes(); 问题是我收到两个字节而不是UID. 解决方法
您实际使用的命令不是您所期望的.
使用此阅读器获取UID /序列号/枚举标识符的正确命令APDU是: +------+------+------+------+------+ | CLA | INS | P1 | P2 | Le | +------+------+------+------+------+ | 0xFF | 0xCA | 0x00 | 0x00 | 0x00 | +------+------+------+------+------+ 但是,您使用的构造函数定义为: public CommandAPDU(int cla,int ins,int p1,int p2,int ne); 所以 new CommandAPDU(0xFF,0x00) 您正在创建具有以下参数的C-APDU:CLA = 0xFF,INS = 0xCA,P1 = 0x00,P2 = 0x00.到目前为止,这与上面的APDU相同.但最后一个参数是Ne = 0x00. Ne = 0表示预期响应字节数为零(而Le = 0表示预期响应字节数为(最多)256). 这样可以有效地创建以下Case-1 APDU: +------+------+------+------+ | CLA | INS | P1 | P2 | +------+------+------+------+ | 0xFF | 0xCA | 0x00 | 0x00 | +------+------+------+------+ 因此,最多您将获得2字节状态字作为响应(指示成功使用0x90 0x00或指示错误,状态代码如0x6X 0xXX). 所以你可以使用字节数组来形成你的APDU: new CommandAPDU(new byte[] { (byte)0xFF,(byte)0xCA,(byte)0x00,(byte)0x00 } ) 或者您可以为Ne指定适当的值: new CommandAPDU(0xFF,256) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |