微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/java/124293.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐