3

我正在尝试使用 ACR122U NFC 阅读器在 Windows 窗体应用程序(用 C# 编写)中创建 NDEF 消息并将其写入 NFC 标签。

我使用 Andreas Jakl 的NDEF 库创建了 NDEF 消息的原始字节。这是 C# 代码:

var spRecord = new NdefTextRecord {
                    Text = "1",
                    LanguageCode = "en"
                };

var msg = new NdefMessage { spRecord };

string hex = BitConverter.ToString(msg.ToByteArray());

resultBox.Text = hex.Replace('-',' ');

我得到的输出是D1 01 04 54 02 65 6E 31(十六进制)。

然后,我使用以下 APDU 命令从块 #5 开始将此数据写入 NFC 标签(MIFARE Ultralight):

CL INS P1 P2 Lc     DATA IN
FF D6  00 05 04     D1 01 04 54

CL INS P1 P2 Lc     DATA IN
FF D6  00 05 04     02 65 6E 31

但是当我尝试使用 Android 读取该标签时,无法识别写入的 NDEF 消息。

为了让 Android 识别 NDEF 消息,我需要做什么?

解决方案(感谢 Michael Roland)

我使用 Android 应用程序编写了一个 NDEF 标签,然后将我在该标签上生成的值与我使用上述方法编写的标签进行了比较。一开始的差异是0x03 0x08。所以 0x03 是必需的起始字节,0x08 是 NDEF 消息的长度。

FF D6 00 04 04   03 08 D1 01
FF D6 00 05 04   04 54 02 65
FF D6 00 06 04   6E 31 FE 00
4

1 回答 1

4

您不能只在标签内的随机位置写入 NDEF 数据,然后期望其他设备可以发现这些数据。顺便说一句,请注意,您的两个写入命令似乎都将不同的数据块写入标签上的相同块号。

MIFARE Ultralight 标签符合 NFC Forum Type 2 标签操作规范。因此,您需要实现类型 2 标签操作规范才能正确地将数据写入此类 NFC 标签。

因此,您需要首先确保标签在块 3 上包含正确配置的功能容器。对于 MIFARE Ultralight,这可能类似于E1 10 06 00. (请注意,对于其他标签类型,如 Ultralight C 和各种 NTAG 标签,可能需要不同的 CC。另请注意,您只能设置 CC 块中的位,但一旦设置就无法清除它们,因此请注意您写入的值那里。)

接下来,您可以将从 NDEF 库作为输出获得的 NDEF 消息包装到 NDEF 消息 TLV(标签-长度-值)结构中。标记是0x03,后跟一个长度字节,然后是实际的 NDEF 数据。因此,对于上面的 NDEF 消息,这看起来像03 08 D1 01 04 54 02 65 6E 31. 然后,您将向该数据 blob 添加终止符 TLV ( 0xFE) 并用零填充以对齐块大小的倍数:

03 08 D1 01
04 54 02 65
6E 31 FE 00

现在您可以将这三个块写入从块 4 开始的标签。例如,

FF D6 00 04 04   03 08 D1 01
FF D6 00 05 04   04 54 02 65
FF D6 00 06 04   6E 31 FE 00
于 2015-11-18T09:25:30.950 回答