【问题标题】:Nexus 4 read Mifare Classic card UIDNexus 4 读取 Mifare Classic 卡 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.

感谢您的回答。

【问题讨论】:

    标签: android nfc mifare nexus-4


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多