Nexus 4读取Mifare Classic卡UID

时间:2013-06-04 07:25:50

标签: android nfc mifare nexus-4

目前我们正在为Android开发NFC应用程序。我们的经验

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

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

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

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

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

- 我们的代码将Mifare经典卡片检测为NfcA类型。 NfcA有一种称为收发(byte []数据)的方法,用于将原始NFC-A命令发送到标签并接收响应。

- 我们的问题是我们需要知道要发送到设备的代码才能读取UID,其他人在网上说他们可以做到但没有找到方法

目前我们总是收到错误:android.nfc.TagLostException:标签丢失。

感谢您的回答。

3 个答案:

答案 0 :(得分:3)

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

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

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

在软件中运行Crypto1(源代码在维基百科上)也不是一个选项,因为Mifare Classic的身份验证请求需要芯片发送与NfcA不兼容的帧。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

好了,调度员已经设置好了,您可以在活动中使用它:

    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);
}