加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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.
有什么问题? 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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读