2014-01-22 17 views
0

我正在開發一個Java swing應用程序,我必須使用smartcardio api使用hid omnikey 5325 感應讀卡器讀取身份證。 (XP操作系統,)感應讀卡器 - smartcardio問題

try { 
    terminals = factory.terminals().list(); 
    System.out.println("Terminals: " + terminals); 
    // get the first terminal 
    CardTerminal terminal = terminals.get(0); 
    terminal.waitForCardPresent(0); 
    Card card = terminal.connect("T=0");      
    System.out.println("Card present!");    
    System.out.println("card: " + card);   
} catch (CardException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} 

的代碼檢測讀取器,但是當卡插入時,所述 terminal.waitForCardPresent(0)應該返回,其它不。

當我使用HID自己的工作臺時,卡被檢測到,因此卡或讀卡器沒有問題 。

回答

1

您正在使用索引從列表中選擇卡終端。這不是選擇終端最可靠的方法。你得到錯誤的終端的原因是,讀者包含一個接觸式和非接觸式閱讀器,它們是系統中的獨立閱讀器。所以你正在等待插入一張聯繫卡。

相反,它更好choose a card reader by name。您可以使用ListCardTerminal s,然後打印出name(或使用診斷實用程序等,名稱是PCSC確定的讀取器名稱,由操作系統使用讀取器特性和序列編譯數)。

+0

這很有道理。謝謝! – devMKZ

+1

沒問題,如果解決了這個問題,最好的方法是感謝答案左邊的V符號:) –

0

解決了這個問題。 更改線路:

CardTerminal terminal = terminals.get(0); 至 CardTerminal terminal = terminals.get(1);訣竅。 猜測此數組從1開始,而不是從0開始。

+0

不,它不 - 沒有Java'List'以1開頭。請參閱我的答案... –