gpt4 book ai didi

java - 在 Java 中使用 smartcardio 在 Raspberry Pi 上使用多个 NFC ACR122U 设备

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:55 26 4
gpt4 key购买 nike

我有 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 更快更稳定。尤其是在一个系统上处理多个设备时。

希望这对某人有帮助;)

关于java - 在 Java 中使用 smartcardio 在 Raspberry Pi 上使用多个 NFC ACR122U 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20244670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com