使用ACR122U作为读/写器,在Windows窗体应用程序C#中将Ndef写入NFC标记

时间:2015-11-17 15:25:23

标签: c# nfc mifare ndef acr122

我正在尝试使用ACR122U NFC读卡器在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命令将这些数据写入NFC标签(MIFARE Ultralight),从#5开始:

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

1 个答案:

答案 0 :(得分:3)

您不能只在标签内的随机位置写入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(tag-length-value)结构。标签为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