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

2024-03-16

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

我使用 Andreas Jakl 创建了 NDEF 消息的原始字节NDEF库 https://github.com/andijakl/ndef-nfc。这是 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 消息?

解决方案(感谢迈克尔·罗兰)

我使用 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 Forum Type 2 标签操作规范。因此,您需要实施2 类标签操作规范 http://apps4android.org/nfc-specifications/NFCForum-TS-Type-2-Tag_1.1.pdf正确地将数据写入此类 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。然后您将添加一个终止符 TLV (0xFE) 到该数据 blob 并用零填充以与块大小的倍数对齐:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ACR122U 作为读取器/写入器在 Windows 窗体应用程序 C# 中将 Ndef 写入 NFC 标签 的相关文章

  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐