5

我得到了一个 ACR122U NFC 读卡器 SDK,其中包含来自 ACS 的示例演示和工具。然后,我正在尝试运行 ACR122U 读卡器工具,将 mifare 卡 1K 放在 NFC 读卡器上以运行该工具。.然后,一切正常。但是,只有当ATS出现问题时..它说功能不支持。然后,因为它不能做负载认证,认证,读块和所有的事情。意思是,PICC命令( T=CL Emulation) 用于无法运行的 mifare 经典存储卡。

当我尝试获取 ATS 时,topaz 和 mifare ultralight 也发生了同样的情况。即使与手机 nokia c7 连接,该标签也不受支持。

所以,你能建议为什么不支持功能吗?当我设置 PICC 操作参数时也有问题。下面是代码

ACR122U PICC 接口连接到:ACS ACR122 0

ACR122U 获取固件版本 固件版本 : ACR122U207

ACR122U 状态 < FF 00 00 00 02 D4 04

D5 05 00 00 01 01 00 00 00 80 90 00 错误代码:00 场:00(RF 场不存在且未检测到) 目标数:01 逻辑数:01 接收比特率:00 (106 kbps) 比特率in 传输:00 (106 kbps) 调制类型:00(ISO14443 或 Mifare)

ACR122U 获取 ATR

ATR 值:3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A 活动协议:T=CL 卡类型:ISO 14443A,Part3 (Mifare 1K)

ACR122U APDU 命令

< FF CA 00 00 04

13 29 东风 97 90 00

这里显示了问题。它应该返回 90 00-成功

ACR122U 获取数据 获取 UID < FF CA 00 00 00

90 00 UID:13 29 DF 97

获取 ATS < FF CA 01 00 00

6A 81 功能不支持

ACR122U 加载认证密钥 < FF 82 00 00 06 FF FF FF FF FF FF

90 00 < 密钥结构:00 < 密钥编号:00 < 密钥:FF FF FF FF FF FF 加载认证密钥成功

mifare 经典存储卡的 PICC 命令 (T=CL Emulation) 无法运行。

ACR122U 读取二进制块

ACR122U 认证 < FF 86 00 00 05 01 00 04 60 00

63 00 操作失败 < FF B0 00 04 10 63 00 操作失败

4

1 回答 1

2

我意识到这是一个老问题,但我正在使用同一张卡(Mifare 1K)。我的起始代码是:

public void start() throws CardReaderException {
    TerminalFactory factory = TerminalFactory.getDefault();
    List<CardTerminal> terminals;
    try {
        terminals = factory.terminals().list();
        //System.out.println("Terminals: " + terminals);
        // get the first terminal
        CardTerminal terminal = terminals.get(0);
        // establish a connection with the card
        card = terminal.connect("*");
        //System.out.println("card: " + card);
        channel = card.getBasicChannel();
    } catch (CardException e) {
        e.printStackTrace();
    }       
}

然后是验证码:

private boolean authenticate(byte block) {
    byte [] setKey = new byte[]{(byte) 0xff, (byte) 0x82, 00, 01, 06, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF};
    byte [] authKey = new byte[] {(byte) 0xff, (byte) 0x86, 00, 00, 0x05, 0x01, 0x00, block, 0x60, 0};

    ResponseAPDU r;
    try {
        r = channel.transmit(new CommandAPDU(setKey));
        if ( r.getBytes()[0] != retOk) {
            return false;
        }

        r = channel.transmit(new CommandAPDU(authKey));
        if ( r.getBytes()[0] != retOk) {
            return false;
        }
    } catch (CardException e) {
        e.printStackTrace();
    }


    return true;
}

经过身份验证后,我可以读取 (0xFF, 0xB0, 0x00, block, 0x10) 或写入 (0xFF, 0xD6, 0x00, block, 0x10) 卡。

于 2012-08-14T16:55:04.840 回答