[英]Distinguish NTAG213 from MF0ICU2
有沒有什么辦法來區分NTAG213從MF0ICU2基於其UID,ATQA或SAK值標簽? 由於必須對標簽進行不同的編程(NTAG213使用PWD / PACK或MF0ICU2使用3DES),因此必須有一種方法可以調用一個或另一個方法。
不幸的是,Android框架告訴我這兩個標簽都是MifareUltralight
,類型為TYPE_ULTRALIGHT_C
。 的ATQA( 0x0044
)和SAK( 0x00
)是相同的,也。
諸如NXP的NFC TagInfo之類的其他應用程序可以告訴我標簽的確切類型,因此我知道必須有某種方法。
一旦知道該標記是NXP標記(UID以0x04開頭),您將
首先發送GET_VERSION命令。 如果此命令成功,您將知道該標簽是EV1或更高版本(MIFARE Ultralight EV1,NTAG21x)。 否則,您可以假定它是第一代標簽(MIFARE Ultralight,Ultralight C,NTAG203)。
如果標簽是EV1標簽,則可以繼續分析對GET_VERSION命令的響應。 這將顯示產品類型(NTAG或Ultralight EV1)以及產品子類型,產品版本和存儲大小(可讓您確定確切的芯片類型:
\n + ------------ + ------ + --------- + ----------- + ------- ------- +\n | 芯片 類型 子類型| 版本| 儲存空間\n + ------------ + ------ + --------- + ----------- + ------- ------- +\n | NTAG210 | 0x04 | 0x01 | 0x01 0x00 | 0x0B |\n | NTAG212 | 0x04 | 0x01 | 0x01 0x00 | 0x0E |\n | NTAG213 | 0x04 | 0x02 | 0x01 0x00 | 0x0F |\n | NTAG213F | 0x04 | 0x04 | 0x01 0x00 | 0x0F |\n | NTAG215 | 0x04 | 0x02 | 0x01 0x00 | 0x11 |\n | NTAG216 | 0x04 | 0x02 | 0x01 0x00 | 0x13 |\n | NTAG216F | 0x04 | 0x04 | 0x01 0x00 | 0x13 |\n + ------------ + ------ + --------- + ----------- + ------- ------- +\n | NT3H1101 | 0x04 | 0x02 | 0x01 0x01 | 0x13 |\n | NT3H1101W0 | 0x04 | 0x05 | 0x02 0x01 | 0x13 |\n | NT3H2111W0 | 0x04 | 0x05 | 0x02 0x02 | 0x13 |\n | NT3H2101 | 0x04 | 0x02 | 0x01 0x01 | 0x15 |\n | NT3H1201W0 | 0x04 | 0x05 | 0x02 0x01 | 0x15 |\n | NT3H2211W0 | 0x04 | 0x05 | 0x02 0x02 | 0x15 |\n + ------------ + ------ + --------- + ----------- + ------- ------- +\n | MF0UL1101 | 0x03 | 0x01 | 0x01 0x00 | 0x0B |\n | MF0ULH1101 | 0x03 | 0x02 | 0x01 0x00 | 0x0B |\n | MF0UL2101 | 0x03 | 0x01 | 0x01 0x00 | 0x0E |\n | MF0ULH2101 | 0x03 | 0x02 | 0x01 0x00 | 0x0E |\n + ------------ + ------ + --------- + ----------- + ------- ------- +\n
如果該標簽不是EV1標簽,則可以發送AUTHENTICATE(第1部分)命令。 如果此命令成功,您將知道該標簽是MIFARE UltralightC。否則,您可以假定該標簽是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
,都應在以后繼續斷開連接並重新連接標簽以重置標簽的狀態,然后再繼續發送其他命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.