1

有没有办法根据 UID、ATQA 或 SAK 值区分NTAG213MF0ICU2标签?因为我必须对标签进行不同的编程(NTAG213 的 PWD/PACK 或 MF0ICU2 的 3DES),所以必须有一种方法可以调用一个或另一个方法。

不幸的是,Android 框架告诉我这两个标签都MifareUltralight带有 type TYPE_ULTRALIGHT_C。ATQA ( 0x0044) 和 SAK ( 0x00) 也相同。

NXP 的 NFC TagInfo等其他应用程序可以告诉我标签的确切类型,所以我知道一定有某种方法。

4

1 回答 1

7

一旦您知道标签是 NXP 标签(UID 以 0x04 开头),您将

  1. 首先发送一个 GET_VERSION 命令。如果此命令成功,您就知道标签是 EV1 或更高版本(MIFARE Ultralight EV1、NTAG21x)。否则,您可以假设它是第一代标签(MIFARE Ultralight、Ultralight C、NTAG203)。

  2. 如果标签是 EV1 标签,您可以继续分析对 GET_VERSION 命令的响应。这将显示产品类型(NTAG 或 Ultralight EV1)以及产品子类型、产品版本和存储大小(这使您可以确定确切的芯片类型:

    +------------+------+---------+------------+----- --------+
    | 芯片 | 类型 | 亚型 | 版本 | 存储大小 |
    +------------+------+---------+------------+----- --------+
    | NTAG210 | 0x04 | 0x01 | 0x01 0x00 | 0x0B |
    | NTAG212 | 0x04 | 0x01 | 0x01 0x00 | 0x0E |
    | NTAG213 | 0x04 | 0x02 | 0x01 0x00 | 0x0F |
    | NTAG213F | 0x04 | 0x04 | 0x01 0x00 | 0x0F |
    | NTAG215 | 0x04 | 0x02 | 0x01 0x00 | 0x11 |
    | NTAG216 | 0x04 | 0x02 | 0x01 0x00 | 0x13 |
    | NTAG216F | 0x04 | 0x04 | 0x01 0x00 | 0x13 |
    +------------+------+---------+------------+----- --------+
    | NT3H1101 | 0x04 | 0x02 | 0x01 0x01 | 0x13 |
    | NT3H1101W0 | 0x04 | 0x05 | 0x02 0x01 | 0x13 |
    | NT3H2111W0 | 0x04 | 0x05 | 0x02 0x02 | 0x13 |
    | NT3H2101 | 0x04 | 0x02 | 0x01 0x01 | 0x15 |
    | NT3H1201W0 | 0x04 | 0x05 | 0x02 0x01 | 0x15 |
    | NT3H2211W0 | 0x04 | 0x05 | 0x02 0x02 | 0x15 |
    +------------+------+---------+------------+----- --------+
    | MF0UL1101 | 0x03 | 0x01 | 0x01 0x00 | 0x0B |
    | MF0ULH1101 | 0x03 | 0x02 | 0x01 0x00 | 0x0B |
    | MF0UL2101 | 0x03 | 0x01 | 0x01 0x00 | 0x0E |
    | MF0ULH2101 | 0x03 | 0x02 | 0x01 0x00 | 0x0E |
    +------------+------+---------+------------+----- --------+
    
  3. 如果标签不是 EV1 标签,您可以发送 AUTHENTICATE(第 1 部分)命令。如果此命令成功,您知道标签是 MIFARE Ultralight C。否则,您可以假设标签是 Ultralight 或 NTAG203。

  4. 为了区分 MIFARE Ultralight 和 NTAG203,您可以尝试读取 Ultralight 上不存在的页面(例如读取第 41 页)。

NfcA您可以使用或MifareUltralight(如果标签甚至可用)标签技术向标签发送命令:

boolean testCommand(NfcA nfcA, byte[] command) throws IOException {
    final boolean leaveConnected = nfcA.isConnected();

    boolean commandAvailable = false;

    if (!leaveConnected) {
        nfcA.connect();
    }

    try {
        byte[] result = nfcA.transceive(command);
        if ((result != null) &&
            (result.length > 0) &&
            !((result.length == 1) && ((result[0] & 0x00A) == 0x000))) {
            // some response received and response is not a NACK response
            commandAvailable = true;

            // You might also want to check if you received a response
            // that is plausible for the specific command before you
            // assume that the command is actualy available and what
            // you expected...
        }
    } catch (IOException e) {
        // IOException (including TagLostException) could indicate that
        // either the tag is no longer in range or that the command is
        // not supported by the tag 
    }

    try {
        nfcA.close();
    } catch (Exception e) {}

    if (leaveConnected) {
        nfcA.connect();
    }

    return commandAvailable;
}

请注意,当标签不支持命令时,某些 NFC 堆栈会生成IOException(通常是 a )。TagLostException无论收到 NACK 响应还是IOException针对不支持的命令,您都应该在之后断开并重新连接标签,以便在继续发送其他命令之前重置标签的状态。

于 2016-05-05T09:46:55.243 回答