区分NTAG213和MF0ICU2
Distinguish NTAG213 from MF0ICU2
有什么方法可以根据 UID、ATQA 或 SAK 值来区分 NTAG213 from a MF0ICU2 标签吗?由于我必须以不同方式对标签进行编程(PWD/PACK 用于 NTAG213 或 3DES 用于 MF0ICU2),因此必须有一种方法可以调用一种或另一种方法。
不幸的是,Android 框架告诉我这两个标签都是 MifareUltralight
,类型为 TYPE_ULTRALIGHT_C
。 ATQA (0x0044
) 和 SAK (0x00
) 也是相同的。
NFC TagInfo by NXP 等其他应用程序可以告诉我标签的确切类型,所以我知道一定有办法。
一旦知道标签是 NXP 标签(UID 以 0x04 开头),您就会
先发送一个GET_VERSION命令。如果此命令成功,则您知道标签是 EV1 或更高版本(MIFARE Ultralight EV1、NTAG21x)。否则,您可以假设它是第一代标签(MIFARE Ultralight、Ultralight C、NTAG203)。
如果标签是EV1标签,可以继续分析GET_VERSION命令的响应。这将显示产品类型(NTAG 或 Ultralight EV1)以及产品子类型、产品版本和存储大小(这使您可以确定确切的芯片类型:
+------------+------+---------+-----------+--------------+
| Chip | Type | Subtype | Version | Storage size |
+------------+------+---------+-----------+--------------+
| 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 |
+------------+------+---------+-----------+--------------+
如果标签不是 EV1 标签,您可以发送 AUTHENTICATE(第 1 部分)命令。如果此命令成功,则您知道标签是 MIFARE Ultralight C。否则,您可以假设标签是 Ultralight 或 NTAG203。
为了区分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
(通常是 TagLostException
)。无论收到 NACK 响应还是针对不受支持的命令的 IOException
,您都应该在之后断开并重新连接标签,以便在继续发送其他命令之前重置标签的状态。
有什么方法可以根据 UID、ATQA 或 SAK 值来区分 NTAG213 from a MF0ICU2 标签吗?由于我必须以不同方式对标签进行编程(PWD/PACK 用于 NTAG213 或 3DES 用于 MF0ICU2),因此必须有一种方法可以调用一种或另一种方法。
不幸的是,Android 框架告诉我这两个标签都是 MifareUltralight
,类型为 TYPE_ULTRALIGHT_C
。 ATQA (0x0044
) 和 SAK (0x00
) 也是相同的。
NFC TagInfo by NXP 等其他应用程序可以告诉我标签的确切类型,所以我知道一定有办法。
一旦知道标签是 NXP 标签(UID 以 0x04 开头),您就会
先发送一个GET_VERSION命令。如果此命令成功,则您知道标签是 EV1 或更高版本(MIFARE Ultralight EV1、NTAG21x)。否则,您可以假设它是第一代标签(MIFARE Ultralight、Ultralight C、NTAG203)。
如果标签是EV1标签,可以继续分析GET_VERSION命令的响应。这将显示产品类型(NTAG 或 Ultralight EV1)以及产品子类型、产品版本和存储大小(这使您可以确定确切的芯片类型:
+------------+------+---------+-----------+--------------+ | Chip | Type | Subtype | Version | Storage size | +------------+------+---------+-----------+--------------+ | 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 | +------------+------+---------+-----------+--------------+
如果标签不是 EV1 标签,您可以发送 AUTHENTICATE(第 1 部分)命令。如果此命令成功,则您知道标签是 MIFARE Ultralight C。否则,您可以假设标签是 Ultralight 或 NTAG203。
为了区分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
(通常是 TagLostException
)。无论收到 NACK 响应还是针对不受支持的命令的 IOException
,您都应该在之后断开并重新连接标签,以便在继续发送其他命令之前重置标签的状态。