除了探测特定的页号和检查是否存在特定的页号之外,以编程方式检测NFC芯片(MIFARE、Ultralight或NTAGxxx)的内存大小或页数的最简单方法是什么?
在返回的ATR中是否有一个特定的字节,或者存储在芯片内存的受保护区域中,以指示它是特定的NTAGxxx芯片,还是页面计数或字节计数?
发布于 2018-11-27 23:08:11
我认为,从被接受的答案看,下面的代码是有意义的,
int numberOfPages = 0;
int tagType = ulTag.getType();
if(tagType == MifareUltralight.TYPE_ULTRALIGHT) {
numberOfPages = 16;
} else if(tagType == MifareUltralight.TYPE_ULTRALIGHT_C) {
numberOfPages = 47;
}getMaxTransceiveLength()是检索最大字节数,可以用收发信机(byte[])发送。Transceive命令使用前3个字节分别用于标志、命令和页号。
我们需要检查下面的代码是否有效?
int totalBytes = ulTag.getMaxTransceiveLength() + 3;
int totalPages = totalBytes / ulTag.PAGE_SIZE;发布于 2020-01-16 14:21:09
对于MIFARE超轻,您可以以这种方式检查版本。
public static final int OFFSET_128_BYTE = 0x025;
public static final int OFFSET_48_BYTE = 0x010;
public static int checkType(MifareUltralight mrfid){
int cfgOffset = -1;
byte[] response = null;
byte[] writeResponse = null;
try {
response = mrfid.transceive(new byte[]{
(byte) 0x60 // GET_VERSION
});
} catch (TagLostException tle) {
Utility.log("setPasswordAndEnable GET_VERSION, TagLostException ... ");
return cfgOffset;
} catch (IOException ioe) {
Utility.log("setPasswordAndEnable GET_VERSION, IOException ... ");
return cfgOffset;
}
if ((response != null) && (response.length >= 8)) {
// success
if ((response[0] == (byte) 0x00) && (response[1] == (byte) 0x04)) {
// tag is from NXP
if (response[2] == (byte) 0x03) {
// MIFARE Ultralight
if ((response[4] == (byte) 0x01) && (response[5] == (byte) 0x00)) {
// MIFARE Ultralight EV1 (V0)
switch (response[6]) {
case (byte) 0x0B:
// MF0UL11
cfgOffset = OFFSET_48_BYTE;
break;
case (byte) 0x0E:
// MF0UL21
cfgOffset = OFFSET_128_BYTE;
break;
default:
// unknown
break;
}
}
}
}
}
return cfgOffset;
}https://stackoverflow.com/questions/28627394
复制相似问题