我正在使用NFCA.transceive
写入NTAG213,并且可以在标记为空时成功写入保持动态锁的位置28h,而不会出现任何问题。但是,当我尝试将其写回其默认状态时,会收到TAG_LOST异常。其他所有字段都可以重设,例如密码,AUTH0等。
在规范中,NTAG213表示对特定内存内容具有“撕裂”受保护的写操作功能,并提到28h。这和它有关吗?我不理解“撕裂”一词。
我应该提到的是,在我更新之前,我使用了身份验证,这必须可以正常进行,因为此页面/位置以外的所有内容都将更改。我一直在按顺序进行写操作,但没有任何效果。
相关代码:
public String resetBDtag(Tag tag) {
NfcA nfca = NfcA.get(tag);
String resultString = "";
byte[] result;
try {
nfca.connect();
try {
result = nfca.transceive(new byte[]{
(byte)0x1B, // Command: password Auth
(byte)0x93, (byte)0xD0, (byte)0x55, (byte)0xB7
});} catch (IOException e) {
Log.e(TAG, "IOException while authenticating :" + resultString, e );
resultString = "Error authenticating"+ e.toString();
}
try {
result = nfca.transceive(new byte[]{
(byte) 0xA2, // Command: WRITE
(byte) 0x29, // Address: page 0x29 (2)
(byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0xFF // CF
});
} catch (IOException e) {
Log.e(TAG, "IOException while resting Auth0 requirement :" + resultString, e );
resultString = "Error removing Authentication requirement"+ e.toString();;
}
try {
result = nfca.transceive(new byte[]{
(byte) 0xA2, // Command: WRITE
(byte) 0x2B, // Address: page 0x2B (2)
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF // Password
});
} catch (IOException e) {
Log.e(TAG, "IOException while clearing password :" + resultString, e );
resultString = "Error clearing password"+ e.toString();;
}
try {
result = nfca.transceive(new byte[]{
(byte) 0xA2, // Command: WRITE
(byte) 0x10, // Address: page 0x10 (2)
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 // Status / Count
});
} catch (IOException e) {
Log.e(TAG, "IOException while clearing the status data :" + resultString, e );
resultString = "Error clearing status data"+ e.toString();;
}
try {
// This does not work!
result = nfca.transceive(new byte[]{
(byte) 0xA2, // Command: WRITE
(byte) 0x28, // CFG1
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xBD // reset CFG1
});
} catch (IOException e) {
Log.e(TAG, "IOException while removing locked pages 18-19 :" + resultString, e );
resultString = "Error removing locks"+ e.toString();;
}
} catch (IOException e) {
Log.e(TAG, "IOException while writing MifareUltralight :" + resultString, e );
resultString = "Can not speak to the tag!";
} finally {
if (nfca != null) {
try {
nfca.close();
Log.d("finally","isoDep closed");
}
catch (IOException e) {
Log.e(TAG, "Error closing tag...", e);
resultString = "Can not close the connection to the tag!";
}
}
}
return resultString;
}
最佳答案
关于动态锁定位的写入命令
您尝试写入字节3(即在写入命令中字节3的值不是0x00
)。你不应该那样做。数据表明确指出,您应将所有RFUI位都设置为0(这适用于字节3,以及字节1和2中的某些位)。
写命令如何用于一次性可编程存储区(如动态锁定位)
写命令将在页面的当前值和写命令参数中发送的新值之间进行逻辑或。例如,如果页面当前设置为FF 0F 00 BD
,而您尝试编写00 00 3F 00
,则页面的新值将为FF 0F 3F BD
。因此,您只能在动态锁定位中设置位(=设置为1),而永远不能将它们重置为零。
为什么您的写命令失败
您在写入命令中将RFUI字节(字节3)设置为0xBD
。这是不允许的。
什么是“撕裂”保护?
撕裂是指您在写操作期间从读取器中删除(意外或故意)标签的情况。写入期间的这种删除操作可能导致页面的部分写入,这将使内存处于未定义状态。撕毁保护意味着标签将完全完成写入或完全不执行写入。因此,内存不会进入任何意外状态。
关于android - Android:重置NFC NTAG213上的动态锁定时出错(28h),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31734059/