Nexus 4 读取 Mifare Classic 卡 UID

Posted

技术标签:

【中文标题】Nexus 4 读取 Mifare Classic 卡 UID【英文标题】:Nexus 4 read Mifare Classic card UID 【发布时间】:2013-06-04 07:25:49 【问题描述】:

目前我们正在开发适用于 android 的 NFC 应用程序。我们的经验

使用 NXP PN5xx 芯片开发的 POS NFC 控制系统,用于控制 Mifare Classic (1K) 和 CEPAS 标准

为 Galaxy Nexus 中的 MiFareClassic 和 Ultralight C 开发 Android NFC 控制系统(使用 NXP NFC 芯片组)

为 Nexus 4 中的 Ultralight C 开发 Android NFC 控制系统

我们的挑战:我们想在我们的 POS 机(带有 NXP 芯片)和新的 Android 平板电脑(带有 Broadcom 芯片)中控制 MiFareClassic 1K 卡,我们已经安装了卡库,无法替换它们。

  -我们知道Nexus 4已经改变了NFC芯片,现在除了UID之外它不能读/写任何Mifare经典卡块。

 - 我们的代码将 Mifare 经典卡检测为 NfcA 类型。 NfcA 有一个叫做transceive(byte[] data) 的方法将原始的 NFC-A 命令发送到标签并接收响应。

 - 我们的问题是我们需要知道发送什么代码到设备来读取UID,网上其他人说可以但是找不到方法

目前我们总是报错:android.nfc.TagLostException: Tag was lost.

感谢您的回答。

【问题讨论】:

【参考方案1】:

您无法使用 Nexus 4 中的 Broadcom 芯片与 Mifare Classic 芯片通话。

您可以读取 UID。这是与 NfcA 兼容的 Mifare Classic 协议的一部分。

除此之外,还需要实施 Broadcom 芯片(以及许多其他即将推出的 NFC 控制器)所缺乏的 Mifare Classic Crypto1 算法。

在软件中运行 Crypto1(源代码在***上)也不是一种选择,因为 Mifare Classic 的身份验证请求将要求芯片发送与 NfcA 不兼容的帧。

【讨论】:

Nils,我同意你的看法。如何读取 UID?这是我的问题。你有任何示例代码吗?你可以看到我收到一个错误,它在我上面的 OP 中。【参考方案2】:

您可以在 Intent 中的 Tag 对象上调用 getId()。这将返回标签的 ID(在 MIFARE Classic 的情况下,可能是 4 或 7 字节的唯一 ID、随机 ID 或固定的非唯一 4 字节 ID;取决于确切的 MIFARE Classic产品)。 无需在NfcA 上致电connect()(也无法做任何有意义的事情)。

请注意,这不适用于三星 Galaxy S4。当点击 MIFARE 标签时,该手机不会发送 NFC 意图。相反,它会在屏幕上显示一条错误消息,指出手机与该标签不兼容,然后忽略该标签。

更新: 在运行 Android 4.4 KitKat 的 S4 上,您可以使用 NFC 阅读器模式来访问卡 UID 等详细信息,也可以访问 MIFARE Classic 标签。

【讨论】:

您好,朋友在S4上用NFC tools的app测试了一张Mifare 1K卡,app成功检测到了序列号(本例为UID)。你知道这是怎么做到的吗?谢谢。【参考方案3】:

好吧,调度器已经设置好了,你可以在你的活动中使用它:

    private String serialId = "";

@Override
    public void onNewIntent(Intent intent) 
    String action = intent.getAction();
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action))           
        try 
            byte[] tagId = tag.getId();
            serialId = bytesToHex(tagId);
            Log.d("[ReadCardTools]", "Serial Number: " + result);
         catch (NullPointerException ex) 
            ex.printStackTrace();
            serialId = "ERROR";
        
     else 
        Toast.makeText(this, "This tag is not supported. Action: " + action, Toast.LENGTH_LONG).show();
    


private String bytesToHex(byte[] bytes) 
    char[] hexChars = new char[bytes.length * 2];
    int v;
    for (int j = 0; j < bytes.length; j++) 
        v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[(j * 2) + 1] = hexArray[v & 0x0F];
    
    return new String(hexChars);

【讨论】:

以上是关于Nexus 4 读取 Mifare Classic 卡 UID的主要内容,如果未能解决你的问题,请参考以下文章

.NET - 通过 NFC 阅读器读取 Mifare Classic。恩智浦与博通阅读器

将 javax.smartcardio 用于 MIFARE Classic 和 Omnikey 5021 CL

Mifare Classic一操作就显示。 错误: 这不是一张MIFARE CLASSIC卡片。

Mifare Classic Tool读水卡扇区显示没密钥发现(或死扇区)怎么回事

复制MIFARE Classic卡

Proxmark3 小白入门 复制 NXP MIFARE CLASSIC 1k 卡