我在这个回答中使用了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));
}
我相信问题是迈克尔·罗兰的回答有一个错误。
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。 怎么了? 问题答案: 进行一些调查后发现,