我在这个答案中使用了Michael Roland提供的示例,并修改了字节命令结构以匹配这个答案。
扫描标签后,我会收到来自阅读器的90 00
响应。不过,当我使用NFC工具扫描标签时,我没有看到它有NDEF记录(照片(。如果我检查内存,我可以看到从块4开始写入的数据,如下所示。
同时,如果我使用NFC工具的写标签功能写NDEF消息,然后再次扫描标签,它确实有效。除了从块4开始的那些块之外的块中的存储器看起来是相同的(照片(。
我不认为这是功能容器的问题,因为在从我的读取器与NFC工具写入标签后,块3中的内存是相同的。
在写入块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));
}
我认为问题在于Michael Roland的答案中有一个错误。
D1 01 0C 55 01 65 78 61 6D 70 6C 65 2E 63 6F 6D 2F
不是有效的Ndef消息。
如果你看看Ndef的各种规格https://github.com/haldean/ndef/tree/master/docs(特别是NFCForum-TS-RTD_URI_1.0.pdf和NFCForum-TS-NDEF-1.0.pdf(;http://www.example.com/"实际上是由";http://www."其具有CCD_ 3的类型代码和12个字符或URL的其余部分。
因此,有效载荷长度为13(1+12(字节,因此OD
作为他的消息:-
D1 010C55 01 65 78 61 6D 70 6C 65 2E 63 6F 6D 2F
只指定URL第二部分的长度,而不指定前缀,因此一个字节太短。
如果您尝试使用NFC Tools应用程序或NXP的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
};