在Java中使用smartcardio在Raspberry Pi上安装多个NFC ACR122U设备

在Java中使用smartcardio在Raspberry Pi上安装多个NFC ACR122U设备,java,linux,multithreading,raspberry-pi,smartcard-reader,Java,Linux,Multithreading,Raspberry Pi,Smartcard Reader,我有3个ACR122U NFC阅读器连接到一个树莓Pi。我有一个Java程序,它使用javax.smartcardio与读者进行交互。我的程序为找到的每个读卡器创建线程: List<CardTerminal> terminals = TerminalFactory.getDefault().terminals().list(); int terminalCount = terminals.size(); System.out.println("Detected " +

我有3个ACR122U NFC阅读器连接到一个树莓Pi。我有一个Java程序,它使用javax.smartcardio与读者进行交互。我的程序为找到的每个读卡器创建线程:

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();
}
如果仅连接了1个ACR122U,则上述代码运行良好。当我将3个ACR122U连接到WINDOWS机器时,它也能完美运行。然而,如果我有两个或多个连接到树莓pi,一个读卡器一开始什么都不做,但如果我先扫描另一个读卡器,然后它到达“找到卡”的一半,然后冻结,然后我可以刷另一个读卡器,它会出现一个无卡异常。下面是错误

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
在这两种情况下,我在两个读卡器上刷的都是同一张卡。不要担心卡是无效的或有效的,这是我代码中一个不相关的检查

如果有人能给我一个解决方案,我会非常满意。我有一种感觉,这与linux没有区分两种usb设备有关


谢谢你的阅读

看起来Raspberry Pi操作系统似乎没有使用单独的线程很好地处理USB驱动程序。我没有启动一个新的Java线程来处理每个设备,而是在轮询一张卡时在所有设备上做了一个单线程循环

我使用smartcard.io java包发现了更多类似上述问题。最后,我切换到C++ LBNFC库来处理我的设备。p> 事实证明,libnfc速度更快、更稳定。尤其是在一个系统上处理多个设备时


希望这对某人有帮助;)

看起来Raspberry Pi操作系统似乎没有使用单独的线程很好地处理USB驱动程序。我没有启动一个新的Java线程来处理每个设备,而是在轮询一张卡时在所有设备上做了一个单线程循环

我使用smartcard.io java包发现了更多类似上述问题。最后,我切换到C++ LBNFC库来处理我的设备。p> 事实证明,libnfc速度更快、更稳定。尤其是在一个系统上处理多个设备时


希望这对某人有帮助;)

我设法解决了这个问题。不过,我还有一个问题。我无法发现我可以用java区分多个NFC阅读器。它们都有相同的名称和序列号0。对此有什么想法吗?如果你找到了解决问题的办法,最好是回答你自己的问题。我们准备帮助您,希望您也能这样做。在评论中再问一个问题不是一个好主意(但我想你已经注意到了,因为你已经分别问了这个问题:),我设法解决了这个问题。不过,我还有一个问题。我无法发现我可以用java区分多个NFC阅读器。它们都有相同的名称和序列号0。对此有什么想法吗?如果你找到了解决问题的办法,最好是回答你自己的问题。我们准备帮助您,希望您也能这样做。在评论中问另一个问题不是一个好主意(但我想你已经注意到了这一点,因为你已经分别问了这个问题:)
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
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