java – 使用SCL010获取Mifare Ultralight的UID

前端之家收集整理的这篇文章主要介绍了java – 使用SCL010获取Mifare Ultralight的UID前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想获得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.
有什么问题? 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)
原文链接:https://www.f2er.com/java/124293.html

猜你在找的Java相关文章