【问题标题】:How to read and write to NFC tags in NDEF format using C# compatible with Android?如何使用与 Android 兼容的 C# 读取和写入 NDEF 格式的 NFC 标签?
【发布时间】:2016-07-13 18:46:25
【问题描述】:

我正在使用Mifare Ultralight C 标记并向它们写入 NDEF 格式的数据。我正在使用 NDEF-NFC library 为我的 NDEF 消息创建原始字节。我的 NDEF 消息是

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

我得到的输出是D1 01 04 54 02 65 6E 31(十六进制)。如果我按原样将此字节数组写入标签:

  • 从标签读取并使用相同的 NDEF-NFC 库后,我能够转换回所需的 NDEF 消息。
  • Android 应用程序无法识别 NDEF 消息。我为 Android 尝试了NFC Tools。

按照Writing Ndef to NFC tag in Windows Form Application C# using ACR122U as Reader/Writer中的建议,我修改了我的字节数组以写入<b>03 08</b> D1 01 04 54 02 65 6E 31 <b>FE 00</b>,而不是库生成的原始字节数组。

  • 现在我可以使用 Android 应用读取 NDEF 消息了。

  • 但是在尝试使用库将字节数组转换为 NDEF 消息对象时,我收到以下错误:

    Ndef 解析错误:第一条记录中缺少预期的消息开始。

如何正确回读 NDEF 消息?

【问题讨论】:

    标签: c# wpf format nfc ndef


    【解决方案1】:

    您已经发现,NFC Forum Type 2 标签(例如 MIFARE Ultralight、NTAG 等)需要将 NDEF 消息嵌入到 NDEF TLV(标签-长度-值)结构中。这意味着您将标签 03 和 NDEF 消息的长度添加到消息(值)本身。因此,你得到

    +-----+--------+-------------------------+
    | TAG | LENGTH | VALUE                   |
    | 03  | 08     | D1 01 04 54 02 65 6E 31 |
    +-----+--------+-------------------------+
    

    此外,您还可以添加一个 Terminator TLV(标签 = FE,长度 = 00)以指示标签上的剩余数据区域可以跳过处理。

    您使用的 NDEF 库仅处理 NDEF 消息,而不是在 NFC 标签上存储数据所需的容器格式。因此,您需要自己处理该部分。

    将 NDEF 消息打包到 TLV 结构中

    var msg = new NdefMessage { ... };
    var msgBytes = msg.toByteArray();
    var ndefTlvLen = new byte[(msgBytes.Length < 255) ? 1 : 3];
    if (msgBytes.Length < 255) {
        ndefTlvLen[0] = (byte)(msgBytes.Length);
    } else {
        ndefTlvLen[0] = (byte)0x0FF;
        ndefTlvLen[1] = (byte)((msgBytes.Length >> 8) & 0x0FF);
        ndefTlvLen[2] = (byte)(msgBytes.Length & 0x0FF);
    }
    var tagData = new byte[1 + ndefTlvLen.Length + msgBytes.Length + 2];
    int offset = 0;
    tagData[offset++] = (byte)0x003;
    Array.Copy(ndefTlvLen, 0, tagData, offset, ndefTlvLen.Length);
    offset += ndefTlvLen.Length;
    Array.Copy(msgBytes, 0, tagData, offset, msgBytes.Length);
    offset += msgBytes.Length;
    tagData[offset++] = (byte)0x0FE;
    tagData[offset++] = (byte)0x000;
    

    从 TLV 结构中解压 NDEF 消息

    var tagData = ...; // byte[]
    var msg;
    int offset = 0;
    while (offset < tagData.Length) {
        byte tag = tagData[offset++];
        int len = (tagData[offset++] & 0x0FF);
        if (len == 255) {
            len = ((tagData[offset++] & 0x0FF) << 8);
            len |= (tagData[offset++] & 0x0FF);
        }
        if (tag == (byte)0x03) {
            var msgBytes = new byte[len];
            Array.Copy(tagData, offset, msgBytes, 0, len);
            msg = NdefMessage.FromByteArray(msgBytes);
        } else if (tag == (byte)0xFE) {
            break;
        }
        offset += len;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多