APDU 写命令导致 6A 81

APDU write command resulting in 6A 81

我正在创建一个 Android 应用程序,它使用 ACS ACR1255 reader/writer 读取/写入 NFC 标签。

我可以使用此 APDU 命令(读取 16 个字节,从块 04h 开始)很好地读取它:

String APDU_COMMAND_READ_16_BYTES =
        "FF" // Class: FFh
        + " B0" // Instruction: Read Binary Blocks
        + " 00" // P1: 00h
        + " 04" // P2: Block Number (the starting block)
        + " 10"; // Le: Number of bytes to read (10h = 16 bytes = 1 block)

但是,我尝试写入卡时运气不佳。当我尝试这个命令时:

String APDU_COMMAND_WRITE_16_BYTES =
        "FF" // Class: FFh
                + " D0" // Instruction: Write Binary Blocks
                + " 00" // P1: 00h
                + " 04" // P2: Block Number (the starting block)
                + " 10" // Lc: Length of data field (10h = 16 bytes = 1 block)
                + " 01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08" // String of data units to be written
                + ""; // Le: Empty

...我收到此回复:6A 81

根据 this page 上的 table 12,6A 部分表示 "Wrong parameter(s) P1-P2 (further qualification in SW2, see table 18)"。但是,table 18 表示 81 部分表示 "Function not supported".

所以我不确定哪里出了问题。有人可以为我澄清问题是什么。我需要什么命令才能成功写入标签?

注意 - 有问题的标签是 MIFARE Ultralight EV1 MFOUL21。 (而且我可以使用 Android 的 MifareUltralight class 给它写信。)

我刚刚在 Standard Instructions table 中找到了解决方案。 table 表明除了 WRITE BINARY (D0) 指令外,还有一条 UPDATE BINARY (D6) 指令。

我的标签已经在我试图写入的块上有数据,所以我需要改用 UPDATE BINARY。所以只需将我的 D0 更改为 D6 即可解决问题。

更新

这些资源也可以帮助其他 APDU 新手: