我想使用 Java 的 javax.smartcardio 阅读有关 Mifare 经典的特定块。这是我的代码:
public byte[] getCardUID() throws CardException {
CardTerminals terminals = TerminalFactory.getDefault().terminals();
terminal = terminals.list().get(0);
Card card = terminal.connect("*");
CardChannel channel = card.getBasicChannel();
CommandAPDU command = new CommandAPDU( new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0xD4, (byte) 0x4A, (byte) 0x01, (byte) 0x00 });
ResponseAPDU response = channel.transmit(command);
card.disconnect(true);
if (response.getSW1() == 0x90) {
byte[] data = response.getData();
data = Arrays.copyOfRange(data, 0x08, data.length);
return data;
}
return new byte[] {};
}
这个方法(网上找到的示例)成功读取了卡的UID,但是当我尝试构建自己的命令时,总是出现错误SW1 = 63。
在这个网站 (http://www.acs.com.hk/drivers/eng/API_ACR122U_v2.00.pdf) 我找到了一些关于 APDU 的信息,但没有任何效果,我不知道为什么。我尝试了以下命令但没有成功(总是错误 63):FF B0 00 04 10(B0 - 读取二进制块,04 - 扇区数,10 - 读取 16 个字节)。我也试过只读取一个字节,读取值块(INS B1)但也没有成功。
FF 00 00 00 ...(来自我的示例)应该是直接传输,但我不知道遵循读取块的说明。
谁能帮我?非常感谢。(对不起我的英语不好)