我一直在使用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阅读器:
我尝试在网络和读卡器文档中搜索响应代码的解释,但没有运气。其他人有类似的问题,并知道如何从卡片返回sw1 sw2 98 130读取UID?
答案 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 };