簡體   English   中英

通過javax.smartcardio閱讀幻像NFC標簽

[英]Reading phantom NFC tags via javax.smartcardio

我有一個舊的NFC閱讀器用於tikitag web服務(后來改名為touchatag ,最后在2012年左右放棄)。 由於網站不再可用,我再也找不到原始的tikitag / touchatag驅動程序了。 經過一番搜索,我發現這款NFC讀卡器是一款通用的ACS ACR122U USB讀卡器,並從這里安裝了合適的驅動器。 我的系統是Windows 7(64位)。

首先,我嘗試使用NFC Tools庫對NFC標簽進行高級讀寫訪問。 我收到一個錯誤,說遇到了不支持的標簽; 雖然閱讀器上沒有標簽,甚至附近也沒有標簽。 看來,其他開發商也與此庫遇到了同樣的錯誤,如圖所示這里 請注意,此標記無限期地被檢測到(因此,它不會在被檢測到一次后消失)。

我將所需的低級代碼復制到一個單獨的類中(即獨立於NFC工具庫)。 您可以在下面找到此代碼(類似的代碼也可以在教程中找到):

import java.util.List;

import javax.smartcardio.Card;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;

import org.nfctools.utils.NfcUtils;

public class NdefTest {

    public static void main(String[] args) throws Exception {
        TerminalFactory factory = TerminalFactory.getDefault();
        List<CardTerminal> terminals = factory.terminals().list();
        CardTerminal terminal = terminals.get(0);

        if (terminal.waitForCardPresent(5000)) {
            Card card = terminal.connect("T=0");
            System.out.println(NfcUtils.convertBinToASCII(card.getATR().getHistoricalBytes()));
        }
    }
}

此代碼檢測與使用NFC工具庫時完全相同的“幻像”標記。 因此,這個問題似乎與NFC工具庫無關(正如圖書館開發人員在回復錯誤報告時所暗示的那樣)。 要么我遺漏了某些東西,要么問題與安裝的驅動程序,NFC讀卡器硬件或javax.smartcardio中的某些未修復的錯誤有關(按可能性順序列出)。

我已經嘗試卸載上述驅動程序並讓Windows 7自行安裝合適的驅動程序(稱為“Microsoft Usbccid智能卡讀卡器(WUDF)”),這會導致與上述相同的錯誤。 我沒有嘗試過另一個讀者,因為我只有一個。

(注意:Windows設備概述中此NFC閱讀器的名稱是“CCID USB Reader”,而不是“ACS ACR122”或相關的東西。不知道這是否重要,只是想我會提到它。)。

有沒有人遇到過這個問題,並設法解決了嗎?

UPDATE

好的,我已經嘗試在檢測到模擬標簽后向閱讀器發送CLF命令; 即,獲取連接的PICC的ATS( ACR122U手冊第11頁):

TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();

// (this is the correct terminal)
CardTerminal terminal = terminals.get(0);

if (terminal.waitForCardPresent(5000)) {
    Card card = terminal.connect("*");

    CardChannel channel = card.getBasicChannel();

// (I tried both 0x00 and 0x01 as P1, as well as 0x05 for Le)
    CommandAPDU getAts = new CommandAPDU(0xFF, 0xCA, 0x00, 0x00, 0x04);
    ResponseAPDU response = channel.transmit(getAts);

    System.out.println(response.getSW1());
    System.out.println(response.getSW2());
}

但我一直收到錯誤響應代碼(0x63 0x00)。 關於我可能做錯的任何想法?

您遇到的問題是此版本的ACR122U閱讀器以某種非標准方式使用PC / SC(CCID)。

使用PC / SC API檢測到的“卡”實際上是讀卡器模擬的虛擬卡(即使沒有卡也允許PC / SC API打開連接)或讀卡器SAM中的智能卡芯片插槽(讀卡器外殼內有接觸卡)。

在任何一種情況下,該閱讀器僅將PC / SC用作該閱讀器(NXP PN532)中使用的非接觸式前端芯片的本機命令的傳輸協議。 因此,如果要使用閱讀器的非接觸式功能,則必須使用CLF的本機命令集。 有關更多詳細信息,請參閱ACR122U API文檔libnfc實現。

(所有功勞都歸功於Michael Roland;這篇文章的意思是解決方案摘要)

好的邁克爾,考慮到你上次評論中的例子,我終於理解了使用PC / SC協議來隧道化CLF命令的意思。 我測試了PN532文檔中的一些命令,它們返回了有效的結果。 (但是,您作為示例提供的命令不起作用並使讀取器崩潰;必須重置它。)

例如,要獲取固件版本:

CommandAPDU commApdu = new CommandAPDU(0xFF, 0x00, 0x00, 0x00, 
    new byte[] { (byte)0xD4, (byte)0x02 });

InDataExchange命令:

CommandAPDU commApdu = new CommandAPDU(0xFF, 0x00, 0x00, 0x00, 
    new byte[] { (byte)0xD4, (byte)0x40, 0x01 });

我找到了NFCIP庫 ,它支持使用InDataExchange命令在對等體之間發送字節數組(例如ACS ACR122和Nokia 6131)。 閱讀PN532文檔(p.131)時,似乎此命令也允許讀取標簽。 邁克爾,你碰巧知道任何處理的庫使用這些低級命令,目的是閱讀(不同類型的)標簽嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM