当前位置: 首页 > 面试题库 >

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

陆飞捷
2023-03-14
问题内容

我已经实现了通过低级通信方法与NTAG216进行交互的代码(紧随NTAG212 Mifare Ultralight withAuthentication和NTAG216的数据表之后)。

到目前为止,我取得了以下成就:

  • 如果未设置密码或新标签/空白标签,请在NTAG216上设置密码写保护。
  • 如果已设置密码,请使用PWD_AUTH并比较PACK进行身份验证。
  • 读取数据。
  • 写入/覆盖数据。

到目前为止,我无法做到的是:

  • 检测我在其他应用程序中写入标签的NDEF消息。换句话说,我可以使用writePage()方法写入标签,也可以使用读取标签readPage()。但是,在编写页面时,我将一个转换NdefMessage为一个字节数组,该字节数组可以读取也可以写入。但是,在其他应用程序中未检测到此NDEF消息。

为了能够检测到我从其他应用程序写入的NDEF消息,我需要做什么?


问题答案:

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 structure
byte[] tlvEncodedData = null;
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)0xA2, // WRITE
        (byte)((4 + i / 4) & 0x0FF), // block address
        0, 0, 0, 0
    };
    System.arraycopy(tlvEncodedData, i, command, 2, 4);
    byte[] response = nfc.transceive(command);
}

最后,请注意,如果在NDEF数据区域上设置了读取密码,则不能将其用作NDEF标签,因为NFC论坛2类标签操作规范要求该标签可自由读取。



 类似资料:
  • 我已经实现了通过低级通信方法与NTAG216交互的代码(遵循NTAG212 Mifare Ultralight与身份验证和NTAG216的数据表)。 如果未设置或如果新/空白标签,请在NTAG216上设置密码写入保护。 如果已设置密码,请使用PWD_AUTH并比较PACK进行身份验证。 读取数据。 写入/覆盖数据。 检测我在其他应用程序中写入标签的NDEF消息。换句话说,我可以使用方法写入标签,也

  • 如何将NDEF消息写入NFC标记?我必须更改清单文件吗?到目前为止,我有生成NDEF消息的代码: 如何发现标签?有人能帮我吗?

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

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

  • 我正在使用Mifare Ultralight C标记,并以NDEF格式向它们写入数据。我使用NDEF-NFC库为我的NDEF消息创建原始字节。我的NDEF消息是 我得到的输出是D1 01 04 54 02 65 6E 31(十六进制)。如果我按原样将此字节数组写入标记: 从标签读取并使用相同的NDEF NFC库后,我能够转换回所需的NDEF消息。 Android应用程序不识别NDEF消息。我尝试了

  • 我有一个应用程序可以读取一个NDEF标签,没什么大不了的:-) 我找到了这个链接:如何发现NFC标签是否还在Android的范围内?什么是一个开始,但我不知道如何更新标签。 我很挣扎,我甚至不知道我尝试做的事情在技术上是否可行。 有没有人知道怎么做的?干杯 对不起,我试着看了一些教程和例子,但我还是不明白。 这是我的全部密码。读取标签需要长得多的时间,有时并不需要。我不知道如何和在哪里更新标签,以