繁体   English   中英

如何在读取的内容中获取自定义NFC标签?

[英]How to get a custom NFC tags in its read?

我正在尝试为智能手机创建一个将复制NFC标签的应用程序。 在某些情况下,我面临着无法为标签类型添加标签的问题。

有一种方法:

/**
 * Callback when a new tag is discovered by the system.
 * <p>
 * <p>Communication with the card should take place here.
 *
 * @param tag Discovered tag
 */
@Override
public void onTagDiscovered(Tag tag) {

    ... ... ... ... ... ...
    MifareClassic mifareClassic = MifareClassic.get(tag);

    if (mifareClassic != null) {
        mAccountCallback.get().onTagsTypeReceived(
            TECH_TYPE_MFR_CLASS, mifareClassic.getType());
        mAccountCallback.get().onMifareClassicReceived(mifareClassic);
    }
    ... ... ... ... ... ...
    NfcA nfcA = NfcA.get(tag);

    if (nfcA != null) {
        mAccountCallback.get().onNfcAReceived(nfcA);
    }
    ... ... ... ... ... ...
}

对于包含MifareUltralight MifareClassic技术列表或标签访问类型的标签,可通过以下方法:

.getType()

但是,如果这些技术不可用,则此方法将不可用。 但是,通过使用与PC连接的读取器b程序Arduino 1.8.5读取相同的标签,可以毫无问题地读取其数据:

程序Arduino 1.8.5的监视器输出的屏幕截图

如何键入任何标签?

由于您的标签似乎是MIFARE Ultralight标签,因此您可以从MifareUltralight标签技术对象中获得类似的类型信息(即getType()方法):

MifareUltralight mifareUltralight = MifareUltralight.get(tag);
if (mifareUltralight != null) {
    ... = mifareUltralight.getType();
}

尽管这种类型的信息可能有用,但还是值得怀疑的。 请参见以下问题,以获得更好的指纹识别不同类型的MIFARE Ultralight / NTAG产品的方法:

但是,还要注意,对任意类型的标签进行指纹识别当然不是一件容易的事 (另请参阅如何使用Android从NFC标签中检测制造商? )。

对于任意NFC标签任务,仍无法解决。 仅针对NFC类型A找到该解决方案。文档公司“ NXP Semiconductors” AN10833“ MIFARE类型识别过程”在3.2选择确认编码(SAK)编码中定义了SAK不同类型标签的相应值。 在此代码的基础上出现了:

getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {

        String type = "";
        int mSak = (int) (sak & 0x7F);

        if (mTagType.getText().toString().equals(getString(R.string.tag_type))) {
            switch (mSak) {
                case 0x04:
                    type = getString(R.string.sak_indicates_uid_is_not_complete);
                    break;
                case 0x09:
                    type = getString(R.string.mifare_classic_protocol_320_bytes);
                    break;
                case 0x08:
                    type = getString(R.string.mifare_classic_protocol_1kb);
                    break;
                case 0x18:
                    type = getString(R.string.mifare_classic_protocol_4kb);
                    break;
                case 0x00:
                    type = getString(R.string.mifare_ultralight_or_ultralight_c);
                    break;
                case 0x10:
                case 0x11:
                    type = getString(R.string.mifare_plus);
                    break;
                case 0x01:
                    type = getString(R.string.only_mentioned_in_nxp_an_10833_mifare_type_identification_procedure);
                    break;
                case 0x20:
                    type = getString(R.string.picc_compliant_with_iso_iec_14443_4);
                    break;
                case 0x40:
                    type = getString(R.string.picc_compliant_with_iso_iec_18092_nfc);
                    break;
                default:
                    type = getString(R.string.picc_type_unknown);
                    break;
                }
                mTagType.setText(type);
            }
        }
    });

获得值SAK是android.nfc.tech.NfcA类的方法:

.getSak()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM