当前位置: 首页 > 知识库问答 >
问题:

如何读写NDEF格式的NFC标签使用C#与Android兼容?

仲涵亮
2023-03-14

我正在使用Mifare Ultralight C标记,并以NDEF格式向它们写入数据。我使用NDEF-NFC库为我的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工具。

按照在Windows窗体应用程序C中使用ACR122U作为读写器将Ndef写入NFC标记的建议,我修改了我的字节数组,以写入03 08D1 01 04 54 02 65 6E 31FE 00,而不是库生成的原始字节数组。

>

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

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

如何正确地读回NDEF消息?

共有1个答案

赵禄
2023-03-14

正如您已经发现的,NFC论坛类型2标记(如MIFARE Ultralight、NTAG等)需要将NDEF消息嵌入NDEF TLV(标记长度值)结构中。这意味着您将标记03和NDEF消息的长度预先添加到消息(值)本身。因此,你得到

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

此外,您可以添加终止符TLV(tag=FE,length=00),以指示标记上的剩余数据区域可以从处理中跳过。

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

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

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

  • 类似的问题 - 如何在Android中读取检测到的NFC标签(NDEF内容)详细信息? 我希望我的android应用程序能够读取和解析检测到的NDEF消息。 我已经编辑了AndroidManifest.xml来检测nfc标签,并添加了意图过滤器,如下所示 我相信这很好,因为当我使用SDK附带的NFCDemo示例应用程序创建MockNDEF标签时,当我可以选择处理这些生成的标签的应用程序列表出现时,

  • 大家好,我正在开发android应用程序,需要扫描设备的nfc标签。我对nfc一无所知,在阅读了大量教程后,我找到了一些方法来检查手机中是否启用了nfc,但我不知道如何读取nfc标签。 这是我的promise 我的帐篷

  • 我想通过LLCP在一个NDEF记录中的NDEF消息中传输一个自定义数据(或者有效载荷可能会被分块到几个NDEF中)。传输的内容是具有特定格式的文件,仅在特定应用中具有意义。那么,指定NDEF头的最佳方法是什么? 1) 将TNF设置为0x04(NFC论坛外部类型),0x03(绝对URI)或0x05(未知)?0x04将在 TYPE 字段中具有自定义相对 URI,如果是绝对 URI,则0x03绝对 UR

  • 我正在开发一个用于从MIFARE标签读取和写入数据的应用程序。我买了一个可以使用NFC技术读取和写入MIFARE标签操作的设备。 NFC屏蔽 我一直在使用MIFARE ultralight标签,但在尝试验证特定内存地址时遇到了问题。由于这个原因,我不能开始阅读。这是我的Arduino代码: 此读取代码是为Arduino Mega 2560和Seeedstudio NFC Shield v1.0和M