NTAG216是NFC论坛2型标签。因此,将数据写入此类型的NFC标签时,必须遵循NFC论坛2类标签操作规范。
因此,您需要遵循一些规则以使标记可被发现为NDEF标签(类型2标签):
首先,需要配置功能容器(位于块3中)。
- 字节0必须设置为“ magic”值
0xE1
。 - 字节1必须设置
0x10
为指示映射版本1.0。 - 必须将字节2设置为
0x6D
指示NTAG216的存储器大小。 - 字节3可以设置为
0x00
指示对NDEF数据的读/写访问或0x0F
指示只读访问(请注意,这些是应用程序层的权限)。
因此,您可以将功能容器编写为:
byte[] response = nfc.transceive(new byte[] { (byte)0xA2, // WRITE (byte)3, // block address (byte)0xE1, (byte)0x10, (byte)0x6D, (byte)0x00});NTAG216已随附正确配置的功能容器,因此无需手动执行此操作。还要注意,块3是可一次性编程的,这意味着位只能设置为1,而不能再次清零。因此,如果您确实已经使用其他值覆盖了功能容器,则该标记很可能不再用作NDEF标记。
必须将数据写入从块4开始的数据块中。NDEF消息必须包装到NDEF消息TLV(标记长度值)结构中。该TLV的标签为
0x03。长度可以是一字节格式(对于长度在0到254字节之间的NDEF消息),也可以是三字节格式(对于长度为255或更多字节的NDEF消息)。该TLV块的数据是实际的NDEF消息(可以从中获取
ndefMessage.toByteArray())。
例如,对于NDEF消息
D1 01 0C 55 01 65 78 61 6D 70 6C 65 2E 63 6F 6D 2F(这是一个URL为“
http://www.example.com/ ” 的URI记录),您将获得以下TLV结构:
03 11 D1010C55016578616D706C652E636F6D2F
如果您有NDEF消息(例如259字节的消息),则可以使用三字节长度的格式:
03 **_FF_ 0103** D101FF5501 ...
此外,您应该在标签上用终结符TLV(tag
0xFE,没有长度和数据字段)标记数据的结尾:
有限元
然后,您可以按以下方式将此数据写入标签:
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 structurebyte[] tlvEnpredData = null;if (ndefMessage.length < 255) { tlvEnpredData = new byte[ndefMessage.length + 3]; tlvEnpredData[0] = (byte)0x03; // NDEF TLV tag tlvEnpredData[1] = (byte)(ndefMessage.length & 0x0FF); // NDEF TLV length (1 byte) System.arraycopy(ndefMessage, 0, tlvEnpredData, 2, ndefMessage.length); tlvEnpredData[2 + ndefMessage.length] = (byte)0xFE; // Terminator TLV tag} else { tlvEnpredData = new byte[ndefMessage.length + 5]; tlvEnpredData[0] = (byte)0x03; // NDEF TLV tag tlvEnpredData[1] = (byte)0xFF; // NDEF TLV length (3 byte, marker) tlvEnpredData[2] = (byte)((ndefMessage.length >>> 8) & 0x0FF); // NDEF TLV length (3 byte, hi) tlvEnpredData[3] = (byte)(ndefMessage.length & 0x0FF); // NDEF TLV length (3 byte, lo) System.arraycopy(ndefMessage, 0, tlvEnpredData, 4, ndefMessage.length); tlvEnpredData[4 + ndefMessage.length] = (byte)0xFE; // Terminator TLV tag}// fill up with zeros to block boundary:tlvEnpredData = Arrays.copyOf(tlvEnpredData, (tlvEnpredData.length / 4 + 1) * 4);for (int i = 0; i < tlvEnpredData.length; i += 4) { byte[] command = new byte[] { (byte)0xA2, // WRITE (byte)((4 + i / 4) & 0x0FF), // block address 0, 0, 0, 0 }; System.arraycopy(tlvEnpredData, i, command, 2, 4); byte[] response = nfc.transceive(command);}最后,请注意,如果在NDEF数据区域上设置了读取密码,则不能将其用作NDEF标签,因为NFC论坛2类标签操作规范要求该标签可自由读取。



