栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用低级NFC通信方法将NDEF数据写入NTAG216标签

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用低级NFC通信方法将NDEF数据写入NTAG216标签

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类标签操作规范要求该标签可自由读取。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506238.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号