0

目前,我们正在为 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 芯片,现在它不能读/写任何 Mifare 经典卡块,除了 UID。

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

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

目前我们总是得到一个错误:android.nfc.TagLostException: Tag was lost。

感谢您的回答。

4

3 回答 3

3

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

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

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

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

于 2013-06-04T09:40:31.203 回答
1

您可以getId()在 Intent 中调用 Tag 对象。这将返回标签的 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 标签。

于 2013-06-04T22:20:02.927 回答
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);
}
于 2013-09-26T16:24:05.750 回答