我想获得Mifare Ultralight NFC标签的UID.
在 Java中我有这个代码:
在 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.
有什么问题? APDU是否正确?
解决方法
您实际使用的命令不是您所期望的.
使用此阅读器获取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)