使用javax.smartcardio阅读NFC Mifare超轻卡

使用javax.smartcardio阅读NFC Mifare超轻卡,java,nfc,smartcard,mifare,apdu,Java,Nfc,Smartcard,Mifare,Apdu,我尝试通过以下方式阅读带有ACR1252U和javax.smartcardio Java库的NFC Mifare Ultralight卡(第4页): TerminalFactory factory = TerminalFactory.getDefault(); List<CardTerminal> terminals = factory.terminals().list(); System.out.println("Terminals: " + terminals); CardTe

我尝试通过以下方式阅读带有ACR1252U和javax.smartcardio Java库的NFC Mifare Ultralight卡(第4页):

TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);

CardTerminal terminal = terminals.get(0);

System.out.println("Waiting for a card..");

if (terminal == null)
    return;
terminal.waitForCardPresent(0);

Card card = terminal.connect("T=1");
System.out.println("Card: " + card);
System.out.println("ATR: " + bytesToHex(card.getATR().getBytes()));
System.out.println("Protocol: " + card.getProtocol());

CardChannel channel = card.getBasicChannel();

CommandAPDU command = new CommandAPDU(new byte[]{(byte) 0xFF, 
    (byte) 0xB0, (byte) 0x00, (byte) 0x04, (byte) 0x04});
ResponseAPDU response = channel.transmit(command);

if (response.getSW1() == 0x90) {
    // success command
    byte[] data = response.getData();
    System.out.println(new String(data));
}
TerminalFactory工厂=TerminalFactory.getDefault();
列表端子=工厂.terminals().List();
System.out.println(“终端:+终端”);
CardTerminal=terminals.get(0);
System.out.println(“等待卡片”);
如果(终端==null)
返回;
终端。waitForCardPresent(0);
卡=终端连接(“T=1”);
System.out.println(“卡:+卡”);
System.out.println(“ATR:+bytesToHex(card.getATR().getBytes()));
System.out.println(“协议:+card.getProtocol());
CardChannel=card.getBasicChannel();
CommandAPDU command=newcommandapdu(新字节[]{(字节)0xFF,
(字节)0xB0,(字节)0x00,(字节)0x04,(字节)0x04});
ResponseADU response=信道传输(命令);
if(response.getSW1()==0x90){
//成功命令
byte[]data=response.getData();
System.out.println(新字符串(数据));
}
有时有效,有时无效(使用同一张卡)

当读数起作用时,我得到以下值:

  • ATR=0x3B8F8001804F0CA0000003060300030000000068
  • SW1=0x90
  • SW2=0x00
当它不起作用时,我会得到:

  • ATR=0x3B80800101
  • SW1=0x63
  • SW2=0x00

知道我做错了什么吗?

第二种情况下(它不工作)的ATR
3B80800101
表明读卡器没有检测到(或没有正确检测到)卡。ACR1252U似乎只模拟此ATR,以允许通过PC/SC API(例如,
javax.smartcardio
)进行连接,即使实际没有卡。如果读卡器明确指示卡不存在,则无法执行此操作

检查读卡器是否检测到您的卡(并将其识别为MIFARE Ultralight)的更可靠方法是根据PC/SC规范解析ATR(请参阅非接触式存储卡的ATR部分):

3B 8F 80 01 80 4F 0C A00000306 03 0003 00000000 68 | | | | ||| \-->RR=保留供将来使用 || \-->NN=MIFARE超轻 |\----------->SS=ISO 14443 A类第3部分 \--------------------->PC/SC RID
谢谢你的回答!为什么您认为“读卡器没有检测到(或没有正确检测到)卡”?有可能我的NFC卡(几乎)没了吗?即使我再次尝试断开/连接,结果也是一样的。。 3B 8F 80 01 80 4F 0C A000000306 03 0003 00000000 68 | | | | | | | \--> RR = reserved for future use | | \-------> NN = MIFARE Ultralight | \----------> SS = ISO 14443 Type A part 3 \---------------------> PC/SC RID