簡體   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