You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用外接NFC读卡器向NTAG213写入NDEF记录失败,但内存写入正常

问题:写入NDEF数据到ntag216标签后NFC Tools无法识别

我参考了Michael Roland的示例代码,修改字节命令结构适配另一篇回答的要求后,执行写入操作时读卡器返回90 00响应,但使用NFC Tools扫描标签却无法识别到NDEF记录。查看标签内存后确认,我的数据已经从块4开始写入,但使用NFC Tools自带的写标签功能写入NDEF消息后,扫描就能正常识别。

对比内存内容发现,除了块4起始的区块外,其他内存区块和NFC Tools写入后的完全一致,块3(Capability Container)的内容也完全相同,因此我认为这不是Capability Container的问题。请问在写入块4之前,是否需要执行其他NDEF读取/检查命令?

以下是我的代码:

byte[] ndefMessage = new byte[] {
        (byte)0xD1, (byte)0x01, (byte)0x0C, (byte)0x55, (byte)0x01, (byte)0x65, (byte)0x78, (byte)0x61, 
        (byte)0x6D, (byte)0x70, (byte)0x6C, (byte)0x65, (byte)0x2E, (byte)0x63, (byte)0x6F, (byte)0x6D, 
        (byte)0x2F
};

// wrap into TLV structure
byte[] tlvEncodedData = null;
Log.e("length",String.valueOf(ndefMessage.length));
if (ndefMessage.length < 255) {
    tlvEncodedData = new byte[ndefMessage.length + 3];
    tlvEncodedData[0] = (byte)0x03;  // NDEF TLV tag
    tlvEncodedData[1] = (byte)(ndefMessage.length & 0x0FF);  // NDEF TLV length (1 byte)
    System.arraycopy(ndefMessage, 0, tlvEncodedData, 2, ndefMessage.length);
    tlvEncodedData[2 + ndefMessage.length] = (byte)0xFE;  // Terminator TLV tag
} else {
    tlvEncodedData = new byte[ndefMessage.length + 5];
    tlvEncodedData[0] = (byte)0x03;  // NDEF TLV tag
    tlvEncodedData[1] = (byte)0xFF;  // NDEF TLV length (3 byte, marker)
    tlvEncodedData[2] = (byte)((ndefMessage.length >>> 8) & 0x0FF);  // NDEF TLV length (3 byte, hi)
    tlvEncodedData[3] = (byte)(ndefMessage.length & 0x0FF);          // NDEF TLV length (3 byte, lo)
    System.arraycopy(ndefMessage, 0, tlvEncodedData, 4, ndefMessage.length);
    tlvEncodedData[4 + ndefMessage.length] = (byte)0xFE;  // Terminator TLV tag
}

// fill up with zeros to block boundary:
tlvEncodedData = Arrays.copyOf(tlvEncodedData, (tlvEncodedData.length / 4 + 1) * 4);

for (int i = 0; i < tlvEncodedData.length; i += 4) {
    byte[] command = new byte[] {
            (byte)0xFF, // WRITE
            (byte)0xD6,
            (byte)0x00,
            (byte)((4 + i / 4) & 0x0FF), // block address
            (byte)0x04,
            0, 0, 0, 0
    };

    System.arraycopy(tlvEncodedData, i, command, 5, 4);

    ResponseAPDU answer = cardChannel.transmit(new CommandAPDU(command));
    byte[] response = answer.getBytes();
    writeLogWindow("response: "+ byteArrayToHexString(response));
}

内容的提问来源于stack exchange,提问作者policenauts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:35:44