当前位置: 首页 > 知识库问答 >
问题:

使用外部NFC读取器将NDEF记录写入NTAG213时出现问题(但写入内存有效)

益明朗
2023-03-14

我在这个回答中使用了Michael Roland提供的示例,并修改了bytes命令结构以匹配这个回答。

扫描标签后,我收到了来自读者的 90 00 个回复。但是,当我使用 NFC 工具扫描标签时,我没有看到它有 NDEF 记录(照片)。如果我检查内存,我可以看到从块 4 开始写入的数据,如下所示。

同时,如果我使用NFC工具的写标签功能来写NDEF消息,然后再次扫描标签,它确实有效。除了从块4开始的块以外的块中的存储器看起来是相同的(照片)。

我不认为这是一个能力容器问题,因为在从我的阅读器写入标签后,块3中的内存与NFC工具相同。

在写入数据块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));
                        }

共有1个答案

仲孙景胜
2023-03-14

我相信问题是迈克尔·罗兰的回答有一个错误。

D1 01 0C 55 01 65 78 61 6D 70 6C 65 2E 63 6F 6D 2F 不是有效的 Ndef 消息。

如果你查看https://github.com/haldean/ndef/tree/master/docsNdef的各种规格(特别是NFCForum-TS-RTD_URI_1.0.pdf和NFCForum-TS-NDEF_1.0.pdf),他的http://www.example.com/示例实际上是由超文本传输协议组成的。它的类型代码为01和12个字符或URL的其余部分。

因此,有效载荷长度为13 (1 12)字节,因此< code>OD的消息如下

D1 01 0C 55 01 65 78 61 6D 70 6C 65 2E 63 6F 6D 2F

仅指定URL第二部分的长度,而不是前缀,因此一个字节太短。

如果您尝试使用NFC工具应用程序或恩智浦TagWriter应用程序为该URL写入记录,就会确认这一点,这两种应用程序都会生成一条消息

<代码>D1 01 0D 55 01 65 78 61 6D 70 6C 65 2E 63 6F 6D 2F

所以请尝试在代码中使用

byte[] ndefMessage = new byte[] {
    (byte)0xD1, (byte)0x01, (byte)0x0D, (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
};
 类似资料:
  • 如何将NDEF消息写入NFC标记?我必须更改清单文件吗?到目前为止,我有生成NDEF消息的代码: 如何发现标签?有人能帮我吗?

  • 我正在尝试使用react-native-NFC-Manager在我的react-本机应用程序中添加NFC功能,它工作正常。但问题是我第一次无法读取/写入NFC卡。第一次,我需要使用NFC工具应用程序编写一个新标签,将“NdeFormatable”转换为“Ndef”,否则我无法读取/写入NFC卡 我用这段代码写数据: 这个问题有什么解决办法吗?

  • 我正在使用以下命令从Mifare超轻型标签读取二进制块: 但是现在我想使用ACR1252 NFC阅读器精确地执行存储在Mifare Ultralight标签中的NDEF消息。我必须使用哪个命令来获取完整的 NDEF 消息?NDEF 消息存储在标签中的哪个位置?

  • 我正在尝试使用ACR122U NFC阅读器在Windows窗体应用程序(用C#编写)中创建并写入NFC标记的NDEF消息。 我使用Andreas Jakl的NDEF库创建了NDEF消息的原始字节。这是C#代码: 我得到的输出是D1 01 04 54 02 65 6E 31(十六进制)。

  • 我想将简单的文本数据写入我的恩智浦MiFARE DesFire EV1(NDEF Type 4标签)。但是,写入过程总是失败,并显示 为了写作,我得到NFC标签,我使用函数: 第三行()的结果如下: 由此我假设,标签的格式正确(作为NDEF)。现在,当调用<code>ndef时。connect()它只显示

  • 问题内容: 我正在尝试使用PrintStream在Java文件中写入0xFF。当我使用十六进制编辑器打开其他值时,会将其他值正确写入文件,但是假定显示0xFF的值却改为0xC3BF。 使用的变量类型为int。经过几次尝试后,我还发现我可以输入的“最大值”值为0x7F,这将在十六进制编辑器中正确显示,如果我输入0x80,则十六进制编辑器将显示0xC280。 怎么了? 问题答案: 进行一些调查后发现,