2

我正在使用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;
}
4

1 回答 1

2

关于动态锁定位的写入命令

您尝试写入字节 3(即字节 3 的值不是0x00您的写入命令中的值)。你不应该那样做。数据表明确指出您应该将所有 RFUI 位设置为 0(这适用于字节 3,以及字节 1 和 2 中的某些位)。

写命令如何作用于一次性可编程内存区域,如动态锁定位

写入命令将在页面的当前值和写入命令参数中发送的新值之间进行逻辑或。例如,如果页面当前设置为FF 0F 00 BD并且您尝试写入00 00 3F 00,则页面的新值将是FF 0F 3F BD。因此,您只能在动态锁定位中设置位(= 设置为 1),但您永远不能将它们重置为零。

为什么您的写入命令失败

您在写入命令中将 RUI 字节(字节 3)设置为0xBD。这是不允许的。

什么是“撕裂”保护?

撕裂是指您在写入操作期间从阅读器中移除(意外或有意)标签。写入期间的这种删除可能会导致页面的部分写入,这将使内存处于未定义状态。撕裂保护意味着标签要么完全完成写入,要么根本不执行写入。因此,内存不会进入任何意外状态。

于 2015-07-31T06:07:43.490 回答