我正在使用NFC标签(Mifare Ultralight C),但我在身份验证方面存在问题。
如果我在第42页上正确理解,则应该是有关受限页面的信息。有值04d83460所以第4页应该要求身份验证吗?
在第43页上,值为4a402b80。为什么会有这样的价值,这意味着什么?
我可以写入和阅读4-40页,但如果我尝试写第41页,那么没有任何事情发生。
修改
MifareUltralight mifare = MifareUltralight.get(tag);
if(mifare == null){
Log.e(LOG, "mifare null");
} else {
Log.e(LOG, "mifare not null");
switch(mifare.getType()){
case MifareUltralight.TYPE_ULTRALIGHT:
Log.e(LOG, "ultralight");
break;
case MifareUltralight.TYPE_ULTRALIGHT_C:
Log.e(LOG, "ultralight c");
break;
case MifareUltralight.TYPE_UNKNOWN:
Log.e(LOG, "type unknown");
break;
}
}
try {
mifare.connect();
mifare.writePage(39, new byte[]{0x10, 0x02, 0x02, 0x02});
Log.e(LOG, "read");
byte[] resp = mifare.readPages(40);
for(byte b : resp){
Log.e(LOG, "resp: " + b);
}
mifare.close();
} catch (IOException e1) {
e1.printStackTrace();
}
答案 0 :(得分:2)
标签似乎不是MIFARE Ultralight C标签。相反,它似乎是一个有42页的标签(这可能是,例如NTAG203)。
第一个指示是您从第42页读取的值:04d83460
。这看起来像UID的开头,包括BCC0。 0x04
看起来像恩智浦的制造商ID。此外,值0x60
将是0x88
(级联标记)XOR 0x04
XOR 0xD8
XOR 0x34
的有效BCC0。因此,这可能是第0页的有效值。
对此的第二个指示是您阅读这些页面的方式:
byte[] resp = mifare.readPages(40);
使用此行,您可以从第40页开始读取四页。如果内存区域小于44页,此命令将翻转到内存区域的开头。因此,如果存储区域包含42个页面,则此命令将返回页面40,41,0和1.因此,您解释为页面42和43的实际上是页面0和1。
唯一奇怪的是,您的第2页包含值6f480000
。如果第1页包含4a402b80
(剩余的UID),那么第2页的第一个字节(BCC1)应为0x4A
XOR 0x40
XOR 0x2B
XOR 0x80
= 0xA1
而不 0x6F
。