【问题标题】:NFC tag informationNFC 标签信息
【发布时间】:2014-06-05 10:40:26
【问题描述】:

我有一个问题,有可能知道我读到的解释类型标签 NFC 的代码源吗?如果是 Mifare 1k 或 Ntag203 还是其他?

protected void onNewIntent(Intent intent){
    String[] techList = tag.getTechList();
    for(String tech:techList) {
        //I think must insert here the code         
    }
}

【问题讨论】:

    标签: android nfc mifare


    【解决方案1】:

    NFC 标签的指纹识别并不容易。大多数标签不只是告诉你“我是 XY”。此外,对于某些标签技术,存在来自多个不同制造商的许多不同标签。例如。 NFC Forum Type 2 标签由 NXP、Infineon、Kovio 等制造。

    在配备 NXP NFC 芯片组的设备上,找出标签是否为 MIFARE Classic 相当简单。在这些设备上,您将在技术列表中看到android.nfc.tech.MifareClassicTag.getTechList()method 的结果)。对于其他 NfcA 标签,您可以先执行以下操作:

    1. 如果标签有一个 7 字节的 UID(通过Tag.getId() 获取),第一个字节表示标签制造商的 ISO 7816-6 注册芯片制造商代码。例如。 0x04 为 NXP,0x05 为英飞凌等。

    2. 一旦您知道芯片制造商,您可以尝试向标签发送制造商特定的命令(例如,对于 NXP 标签,您可以发送 GET_VERSION 命令来检查标签是否为 NTAG/MF Ultralight EV1 标签或一个验证命令来检查它是否是 Ultralight C) 。一些制造商还将进一步的芯片信息编码到 UID 中。

    3. 您可以扫描标签内存以查找内存大小并根据该值确定它是什么芯片类型。

    【讨论】:

    • 非常感谢您的回答。如果标签没有 7 字节的 UID?有可能知道制造商吗?
    • 根据标签类型,您可能拥有一些标签特定功能,可用于识别标签/制造商。但是,对于 7 字节以外的 UID,您无法根据 UID 的第一个字节来识别制造商。
    • Mifare Classic 或 Mifare Ultralight 还有其他方法来识别制造商吗?
    • 没有防弹的,但您可以根据标签内存的一些保留字节的内容来区分不同的标签类型/制造商。而对于 MIFARE Classic,则基于制造商块的内容。
    • 对不起,我不明白,MIFARE Classic 制造商的块在哪里?对于 NXP,如何发送 GET_VERSION 命令?存在这个库吗?
    【解决方案2】:

    当你得到 tag ,然后使用 TechList 你可以找到确切的 tag 类型。 这是示例:

     protected void onNewIntent(Intent intent){    
            getTagInfo(intent)
             }
    
    private void getTagInfo(Intent intent) {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    
        String[] techList = tag.getTechList();
        for (int i = 0; i < techList.length; i++) {
            if (techList[i].equals(MifareClassic.class.getName())) {
    
                MifareClassic mifareClassicTag = MifareClassic.get(tag);
                switch (mifareClassicTag.getType()) {
                case MifareClassic.TYPE_CLASSIC:
                    //Type Clssic
                    break;
                case MifareClassic.TYPE_PLUS:
                    //Type Plus
                    break;
                case MifareClassic.TYPE_PRO:
                    //Type Pro
                    break;
                }
            } else if (techList[i].equals(MifareUltralight.class.getName())) {
            //For Mifare Ultralight
                MifareUltralight mifareUlTag = MifareUltralight.get(tag);
                switch (mifareUlTag.getType()) {
                case MifareUltralight.TYPE_ULTRALIGHT:
                    break;
                case MifareUltralight.TYPE_ULTRALIGHT_C:
    
                    break;
                }
            } else if (techList[i].equals(IsoDep.class.getName())) {
                // info[1] = "IsoDep";
                IsoDep isoDepTag = IsoDep.get(tag);
    
            } else if (techList[i].equals(Ndef.class.getName())) {
                Ndef.get(tag);
    
            } else if (techList[i].equals(NdefFormatable.class.getName())) {
    
                NdefFormatable ndefFormatableTag = NdefFormatable.get(tag);
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多