使用 ACR122U 作为 Reader/Writer 在 Windows Form Application C# 中将 Ndef 写入 NFC 标签

Writing Ndef to NFC tag in Windows Form Application C# using ACR122U as Reader/Writer

我正在尝试使用 ACR122U NFC reader.

在 Windows 表单应用程序(用 C# 编写)中创建 NDEF 消息并将其写入 NFC 标签

我使用 Andreas Jakl 的 NDEF library 创建了 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 消息?

Solution (Thanks 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

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

MIFARE Ultralight 标签符合 NFC 论坛 2 类标签操作规范。因此,您需要实施 Type 2 Tag Operation specification 才能将数据正确写入此类 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