2013-06-04 72 views
0

目前我們正在爲Android開發NFC應用程序。我們的經驗Nexus 4閱讀Mifare Classic卡片UID

  • 採用恩智浦PN5xx芯片MIFARE經典(1K)的控制和CEPAS標準

    開發的POS NFC控制系統

  • 開發用於MiFareClassic和超輕下,在Galaxy Nexus的(使用NXP的Android NFC控制系統NFC芯片組)

  • 爲超輕下在的Nexus

    發達的Android NFC控制系統4

我們的挑戰:我們想要在我們的POS機(使用恩智浦芯片)和新的Android平板電腦(使用Broadcom芯片)中控制MiFareClassic 1K卡,我們已經安裝了卡基並且無法替代它們。

- 我們知道Nexus 4已經改變了NFC芯片,現在除了UID之外,它無法讀取/寫入任何Mifare經典卡片。

- 我們的代碼將Mifare經典卡檢測爲NfcA類型。 NfcA有一種稱爲收發(byte [] data)的方法來發送原始NFC-A命令到標籤並接收響應。

- 我們的問題是,我們需要知道送什麼碼設備讀取UID,其他人在網上說,他們能做到這一點,但沒有方法可以發現

目前,我們總是得到一個錯誤:機器人.nfc.TagLostException:標記丟失。

感謝您的回答。

回答

1

您可以在意圖中的標籤對象上調用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標籤。

+0

非常感謝你,它以你的方式工作。 – andy8702

+0

嗨,我的朋友使用名爲NFC工具的應用程序在S4上測試了Mifare 1K卡,該應用程序成功檢測到序列號(本例中爲UID)。你知道這是怎麼完成的嗎?謝謝。 – paradite

+0

@ zhuliangg11看到我的更新,也許解決了它? –

3

你不能談論到使用博通芯片MIFARE經典芯片的的Nexus 4

可以讀取UID找到。這是與NfcA兼容的Mifare Classic協議的一部分。

除此之外,任何事情都需要實施Broadcom芯片(以及許多其他NFC控制器)缺乏的Mifare Classic Crypto1算法。

在軟件中運行Crypto1(源代碼位於維基百科)也不是一個選項,因爲Mifare Classic的身份驗證請求需要芯片發出與NfcA不兼容的幀。

+0

尼爾斯,我同意you.How我可以讀的UID?這是我的問題。你有任何示例代碼?你可以看到我得到一個錯誤,它在我的OP上面。 – andy8702

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); 
}