2013-11-27 83 views
1

我有3个ACR122U NFC阅读器连接到Raspberry Pi。我有一个Java程序,它使用javax.smartcardio与读者进行交互。我的程序找到的每个读取器创建线程:Raspberry Pi上的多个NFC ACR122U设备使用Java中的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(); 
} 

每个线程类运行一个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机器时,它也可以完美运行。但是,如果我有两个或更多的连接到覆盆子pi,一个读者一开始什么也不做,但如果我第一次扫描其他读者,那么它会中途“找到卡片”然后冻结,然后我可以滑动另一个读卡器,与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设备。

感谢您的阅读!

+0

我设法解决这个问题。但我有另一个问题。我无法发现我可以用java来区分多个NFC阅读器。它们都具有相同的名称和序列号0.关于此问题的任何想法? –

+1

如果您发现问题的解决方案,最好的办法就是回答自己的问题。我们准备帮助你,希望你也想这样做。在评论中提出另一个问题并不是一个好主意(但我认为你已经注意到了这一点,因为你已经单独提出了这个问题:)) –

回答

1

看起来好像Raspberry Pi OS不能很好地使用单独的线程处理USB驱动程序。在轮询卡片时,我只是通过所有设备进行单线程循环,而不是启动新的Java线程来处理每个设备。

我使用smartcard.io java包发现了更多类似上面的问题。最后,我切换到C++ libnfc库来处理我的设备。

libnfc竟然变得更快更稳定。特别是在一个系统上处理多个设备时。

希望这可以帮助某人;)