区分 NTAG213 和 MF0ICU2

2023-12-03

有没有什么方法可以区分NTAG213 from a MF0ICU2基于 UID、ATQA 或 SAK 值的标签?由于我必须对标签进行不同的编程(NTAG213 的 PWD/PACK 或 MF0ICU2 的 3DES),因此必须有一种方法来调用一种或另一种方法。

不幸的是,Android 框架告诉我这两个标签都是MifareUltralight与类型TYPE_ULTRALIGHT_C。 ATQA(0x0044) 和 SAK (0x00) 也相同。

其他应用程序如NXP 的 NFC TagInfo可以告诉我标签的确切类型,所以我知道一定有某种方法。


一旦您知道该标签是 NXP 标签(UID 以 0x04 开头),您将

  1. 首先发送 GET_VERSION 命令。如果此命令成功,您就知道该标签是 EV1 或更高版本(MIFARE Ultralight EV1、NTAG21x)。否则,您可以假设它是第一代标签(MIFARE Ultralight、Ultralight C、NTAG203)。

  2. 如果标签是 EV1 标签,您可以继续分析对 GET_VERSION 命令的响应。这将显示产品类型(NTAG 或 Ultralight EV1)以及产品子类型、产品版本和存储大小(这使您可以确定确切的芯片类型:

    
    
    +------------+------+---------+-----------+--------------+
    | Chip       | Type | Subtype | Version   | Storage size |
    +------------+------+---------+-----------+--------------+
    | NTAG210    | 0x04 | 0x01    | 0x01 0x00 | 0x0B         |
    | NTAG212    | 0x04 | 0x01    | 0x01 0x00 | 0x0E         |
    | NTAG213    | 0x04 | 0x02    | 0x01 0x00 | 0x0F         |
    | NTAG213F   | 0x04 | 0x04    | 0x01 0x00 | 0x0F         |
    | NTAG215    | 0x04 | 0x02    | 0x01 0x00 | 0x11         |
    | NTAG216    | 0x04 | 0x02    | 0x01 0x00 | 0x13         |
    | NTAG216F   | 0x04 | 0x04    | 0x01 0x00 | 0x13         |
    +------------+------+---------+-----------+--------------+
    | NT3H1101   | 0x04 | 0x02    | 0x01 0x01 | 0x13         |
    | NT3H1101W0 | 0x04 | 0x05    | 0x02 0x01 | 0x13         |
    | NT3H2111W0 | 0x04 | 0x05    | 0x02 0x02 | 0x13         |
    | NT3H2101   | 0x04 | 0x02    | 0x01 0x01 | 0x15         |
    | NT3H1201W0 | 0x04 | 0x05    | 0x02 0x01 | 0x15         |
    | NT3H2211W0 | 0x04 | 0x05    | 0x02 0x02 | 0x15         |
    +------------+------+---------+-----------+--------------+
    | MF0UL1101  | 0x03 | 0x01    | 0x01 0x00 | 0x0B         |
    | MF0ULH1101 | 0x03 | 0x02    | 0x01 0x00 | 0x0B         |
    | MF0UL2101  | 0x03 | 0x01    | 0x01 0x00 | 0x0E         |
    | MF0ULH2101 | 0x03 | 0x02    | 0x01 0x00 | 0x0E         |
    +------------+------+---------+-----------+--------------+
      
  3. 如果标签不是 EV1 标签,您可以发送 AUTHENTICATE(第 1 部分)命令。如果此命令成功,您就知道该标签是 MIFARE Ultralight C。否则,您可以假设该标签是 Ultralight 或 NTAG203。

  4. 为了区分MIFARE Ultralight和NTAG203,您可以尝试读取Ultralight上不存在的页面(例如读取第41页)。

您可以使用以下命令向标签发送命令NfcA or MifareUltralight(如果甚至可用于标签)标签技术:

boolean testCommand(NfcA nfcA, byte[] command) throws IOException {
    final boolean leaveConnected = nfcA.isConnected();

    boolean commandAvailable = false;

    if (!leaveConnected) {
        nfcA.connect();
    }

    try {
        byte[] result = nfcA.transceive(command);
        if ((result != null) &&
            (result.length > 0) &&
            !((result.length == 1) && ((result[0] & 0x00A) == 0x000))) {
            // some response received and response is not a NACK response
            commandAvailable = true;

            // You might also want to check if you received a response
            // that is plausible for the specific command before you
            // assume that the command is actualy available and what
            // you expected...
        }
    } catch (IOException e) {
        // IOException (including TagLostException) could indicate that
        // either the tag is no longer in range or that the command is
        // not supported by the tag 
    }

    try {
        nfcA.close();
    } catch (Exception e) {}

    if (leaveConnected) {
        nfcA.connect();
    }

    return commandAvailable;
}

请注意,某些 NFC 堆栈会生成IOException(通常是一个TagLostException)当标签不支持命令时。无论收到 NACK 响应还是IOException对于不支持的命令,您应该断开并重新连接标签,以便在继续发送其他命令之前重置标签的状态。

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

区分 NTAG213 和 MF0ICU2 的相关文章

随机推荐

  • 使用海龟模块 exitonclick()

    我的代码应该在第一部分之后关闭turtle screen 然后启动另一个屏幕并执行第二部分 但在那里它没有按预期工作 import turtle ws turtle Screen tod 1 turtle Turtle tod 1 colo
  • UIScrollview获取触摸事件

    如何检测我的触摸点UIScrollView 触摸委托方法不起作用 设置点击手势识别器 UITapGestureRecognizer singleTap UITapGestureRecognizer alloc initWithTarget
  • 为什么向量持有一个类类型在push_back()时会再次调用复制构造函数?

    我有以下代码 include
  • Java-切换字符串中的字母大小写

    我有我的代码可以将大小写从上切换到下 反之亦然 我也有它可以从上到下 从下到上切换的位置 我的问题是 有没有办法让它也包含逗号或句点等字符 例如 如果我输入字符串 Hello there 我会得到 你好 那里 你好 那里 和 你好 我怎样才
  • Unity Hololens2 构建错误

    我尝试构建 Hololens 2 应用程序 但遇到无法解决的错误 当我尝试使用 Unity 播放按钮测试应用程序时 它按预期工作 我还尝试了 MRTK 示例场景 它也只能通过播放按钮起作用 但当我尝试构建它时却不起作用 构建错误 Libra
  • 熊猫在索引列上合并? [复制]

    这个问题在这里已经有答案了 In 88 c Out 88 Address Name CustomerID 10 Address for Mike Mike 11 Address for Marcia Marcia In 89 c index
  • 为 javafx textField 添加最多 2 位小数的侦听器

    我想将 javaFX 文本字段设置为小数点后两位 我找到了答案 但它是针对数值的 例如 force the field to be numeric only textField textProperty addListener new Ch
  • 如何更改 UIImagePickerController 中的取消按钮标题?

    目前我正在开发一个多语言应用程序 我想更改Cancel Use and Retake的按钮标题UIImagePickerController 我怎样才能做到这一点 我的问题是通过使用自定义覆盖类解决的 self picker UIImage
  • 如何用日期标记 x 轴?

    我似乎无法弄清楚如何在 Matlab 中绘制不按数字顺序排列的日期 我需要的日期是从 1 月 22 日到 2 月 1 日 但是当我将其放入 Matlab 中时 它从 1 日开始按数字顺序排列 所以我想知道如何获取它 以便它按照我的列表顺序排
  • Google Cast SDK3 Android 示例应用程序在低于 5.0 的设备上崩溃

    我已经尝试过 Google Cast Android 示例应用程序 但对于低于 5 0 的设备会崩溃 有人知道为什么吗 下面是我的崩溃日志 0830 12 38 57 242 E AndroidRuntime 16269 引起 java l
  • 如何从极坐标中的日期时间列中提取日期

    我正在尝试从熊猫转移到极地 但遇到了以下问题 import polars as pl df pl DataFrame integer 1 2 3 date 2010 01 31T23 00 00 00 00 2010 02 01T00 00
  • 批量更改文件扩展名

    简单的问题 IMDU 命令执行 imdu b file imd file raw 并将 file imd 转换为 file raw 我有很多 imd 所以我需要一批 我努力了 for x in imd do imdu b x nx raw
  • jQuery:包含用于搜索多个字符串的选择器

    假设我有 li Mary li li John Mary Dave li li John Dave Mary li li John li 如果我需要找到所有包含 John 和 Mary 的 元素 我将如何构建 jQuery 搜索单个字符串似
  • 在 R 中将 raw 转换为 long?

    我需要读取一个编码长整型的二进制文件 我只举其中一个多头作为例子 don t know a simpler way to create the raw vector z lt writeBin c 8L 208L 59L 233L 106L
  • PHP签入签出系统

    我有 PHP 的基本知识 我正在尝试通过向数据库添加签入时间和签出时间来创建签入和签出系统 报到 session start SESSION inchecken true tijd date H i s query INSERT INTO
  • 使用 R/Selenium 仅查找 Disqus 中最热门的帖子

    首先 我对这篇文章的长度表示歉意 因为我想提供足够的细节来说明我正在尝试做的事情 我正在尝试完善我用 R 编写的抓取应用程序以获取 Disqus 评论 到目前为止 我可以使用各种 RSelenium 功能获取特定页面上的所有评论 我现在想做
  • C# 面板作为 MDI 容器

    在 C 中 我想创建一个具有 MDI 容器属性的面板 即 isMdiContainer true 我尝试过这样的事情 form MDIParent this panel1 但这不起作用 有什么建议么 可以创建一个 MDI 面板并在该面板中显
  • 如何在 android 中的 glSurfaceView 之上构建 GUI/HUD

    我有一个glSurfaceView看起来像这样 public class GLLayer extends GLSurfaceView implements SurfaceHolder Callback Camera PreviewCallb
  • IE 条件注释与 Sass 和 Bourbon

    我想为不同的浏览器提供不同的字体 请参阅这个问题 有没有一种巧妙的方法可以用 Sass Bourbon 来做到这一点 这是我到目前为止所拥有的 include font face myicons myicons weight normal
  • 区分 NTAG213 和 MF0ICU2

    有没有什么方法可以区分NTAG213 from a MF0ICU2基于 UID ATQA 或 SAK 值的标签 由于我必须对标签进行不同的编程 NTAG213 的 PWD PACK 或 MF0ICU2 的 3DES 因此必须有一种方法来调用