需要帮助了解APDU响应

时间:2014-08-21 12:42:49

标签: java nfc apdu

我一直在使用ACR122读卡器,读取Mifare 1K或Mifare Ultralight NFC卡时没有问题。

将读卡器升级到最新版本(ACR1251)后,我的程序无法从Mifare 1K卡读取UID。

这是我用来阅读的片段:

CardTerminal terminal = terminalWithCardPresent.get(0);
terminal.waitForCardPresent(0);
Card card = terminal.connect("T=1");
if (card != null) {
    CommandAPDU command = new CommandAPDU((byte) 0xFF, (byte) 0xCA, (byte) 0x00, (byte) 0x00, (byte) 0x07);
    CardChannel channel = card.getBasicChannel();
    ResponseAPDU response = channel.transmit(command);
    StringBuilder sb = new StringBuilder();
    if (response.getSW1() == 0x90 && response.getSW2() == 0x00) {
        byte[] data = response.getData();
        String code = decoder.apply(data);
        sb.append(code);
    }
    cardIdRead.recieve(sb.toString());
}
terminal.waitForCardAbsent(0);

使用新版本的rad阅读器:

  • ResponseAPDU.getSW1()函数返回98
  • 而getSW2()返回130

我尝试在网络和读卡器文档中搜索响应代码的解释,但没有运气。其他人有类似的问题,并知道如何从卡片返回sw1 sw2 98 130读取UID?

2 个答案:

答案 0 :(得分:0)

将SW 98 130转换为十六进制为‘6282’。从this table起,它意味着"可以读取Le参数指定的字节数,因为首先遇到文件的末尾。"

'FF CA'已在ACR122U reader documentation中记录,但未在ACR1251U documentation中找到。在ACR122U文档中,Le应该是'00'而不是'07'

我建议尝试发送APDU 'FFCA000000',如果失败,请尝试发送'FFCA0000XX'(来自' 01'到' 06')

答案 1 :(得分:0)

对于JAVASE目的(Ultralight nfc Card),您可以按照此链接和下面的代码进行操作。

对于Read UID,命令是:

 baReadUID = new byte[] { (byte) 0xFF, (byte) 0xCA, (byte) 0x00,
            (byte) 0x00, (byte) 0x00 };

从Specefic Block读取(这里阅读第04页到第07页)命令是:

read_four_to_seven = new byte[]{(byte) 0xFF, (byte) 0x00, (byte) 0x00,
                     (byte) 0x00, (byte) 0x05, (byte) 0x0D4, (byte) 0x40, (byte) 0x01,
                     (byte) 0x30, (byte) 0x04, (byte) 0x07 };

写入第04页:

Write_Page_Four = new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x15, (byte) 0xD4, (byte) 0x40,
(byte) 0x01, (byte) 0xA0, (byte) 0x04, (byte) 0x4D,
(byte) 0x65, (byte) 0x73, (byte) 0x75, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00 };

All Complete code is here...