簡體   English   中英

在Java中使用smartcardio在Raspberry Pi上使用多個NFC ACR122U設備

[英]Multiple NFC ACR122U devices on a Raspberry Pi using smartcardio in Java

我有3個ACR122U NFC閱讀器連接到Raspberry Pi。 我有一個使用javax.smartcardio與讀者進行交互的Java程序。 我的程序為找到的每個讀者創建線程:

List<CardTerminal> terminals = TerminalFactory.getDefault().terminals().list();
int terminalCount = terminals.size();        
System.out.println("Detected " + String.valueOf(terminalCount) + " terminal/s");
for(int i = 0; i < terminalCount; i++)
{
     System.out.println("Initiating thread :" + String.valueOf(i));
     new Thread(new AccessTerminal(i,terminals.get(i))).start();
}

每個線程類都運行一個AccessTerminal類,該類基本上執行以下操作:

System.out.println("Thread started... Waiting for card...");
cardTerminal.waitForCardPresent(0);
System.out.println("Card found");
card = cardTerminal.connect("*");
cardChannel = card.getBasicChannel();
if(authenticate())
{
     int UID = getUID();
     System.out.println("User identified as :" + String.valueOf(UID));
}
cardTerminal.waitForCardAbsent(0);

如果僅連接1個ACR122U,則上面的代碼可以完美運行。 當我將3個ACR122U連接到WINDOWS機器時,它也可以完美運行。 但是,如果我有兩個或多個連接到樹莓派,則一個讀取器起初不執行任何操作,但是如果我先掃描另一個讀取器,則它到達“找到卡”的一半,然后凍結,然后我可以刷另一個讀取器來與NoCardPresent異常。 波紋管是錯誤。

Starting system...
Detected 2 terminal/s
Initiating thread :0
Initiating thread :1
Thread started... Waiting for card...
Thread started... Waiting for card...
Card found
Card found
Card not valid
Nov 27, 2013 1:02:01 PM livaccess.AccessTerminal run
SEVERE: null
javax.smartcardio.CardNotPresentException: No card present
    at sun.security.smartcardio.TerminalImpl.connect(TerminalImpl.java:82)
    at livaccess.AccessTerminal.run(AccessTerminal.java:41)
    at java.lang.Thread.run(Thread.java:722)
Caused by: sun.security.smartcardio.PCSCException: SCARD_W_REMOVED_CARD
    at sun.security.smartcardio.PCSC.SCardStatus(Native Method)
    at sun.security.smartcardio.CardImpl.<init>(CardImpl.java:85)
    at sun.security.smartcardio.TerminalImpl.connect(TerminalImpl.java:78)
    ... 2 more

如果我在Windows計算機上使用相同的設置執行完全相同的程序,則會得到以下輸出:

Starting system...
Detected 2 terminal/s
Initiating thread :0
Initiating thread :1
Thread started... Waiting for card...
Thread started... Waiting for card...
Card found
Card is valid
User identified as :1534
Thread started... Waiting for card...
Card found
Card is valid
User identified as :1534

在這兩種情況下,我在兩個讀卡器上刷了同一張卡。 不必擔心該卡無效或有效,這與我的代碼無關。

如果有人對我有解決方案,我將非常滿意。 我有一種感覺,它與linux沒有區分兩個USB設備有關。

謝謝閱讀!

看起來Raspberry Pi OS使用單獨的線程不能很好地處理USB驅動程序。 我沒有啟動一個新的Java線程來處理每個設備,而是在輪詢卡時在所有設備上進行了單線程循環。

我使用smartcard.io java包發現了更多類似上面的問題。 最后,我切換到C ++ libnfc庫來處理我的設備。

事實證明,libnfc更快,更穩定。 特別是在一個系統上處理多個設備時。

希望這可以幫助某人;)

暫無
暫無

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

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