如何创建RFID应用程序读取HID OMNIKEY 5427 CK

问题描述 投票:2回答:3

我的同事和我正在试图创建一个Java程序与HID OMNIKEY 5427 CK阅读卡。我们与RFID没有以往的经验,并检查:https://support.impinj.com/hc/communities/public/questions/201883748-How-do-I-create-RFID-applications-with-Java-

对于一些示例代码(我们一直没能找到除了这么多的示例代码),我们已经适应和使用,但在运行我们的代码时,我们得到

java.nio.channels.UnresolvedAddressException
at sun.nio.ch.Net.checkAddress(Unknown Source)
at sun.nio.ch.SocketChannelImpl.connect(Unknown Source)
at org.apache.mina.transport.socket.nio.SocketConnector.connect(SocketConnector.java:187)
at org.apache.mina.transport.socket.nio.SocketConnector.connect(SocketConnector.java:137)
at org.apache.mina.common.support.BaseIoConnector.connect(BaseIoConnector.java:40)
at org.llrp.ltk.net.LLRPConnector.connect(LLRPConnector.java:135)
at org.llrp.ltk.net.LLRPConnector.connect(LLRPConnector.java:116)
at hellojavaltk.HelloJavaLtk.connect(HelloJavaLtk.java:212)
at hellojavaltk.HelloJavaLtk.run(HelloJavaLtk.java:227)
at hellojavaltk.HelloJavaLtkMain.main(HelloJavaLtkMain.java:9)​

代码基本上是:

public class HelloJavaLtkMain
{
public static void main(String[] args) throws InterruptedException
{
HelloJavaLtk app = new HelloJavaLtk();

System.out.println("Starting reader.");
app.run("HID-OMNIKEY-5427-CK");
Thread.sleep(30000);
System.out.println("Stopping reader.");
app.stop();
System.out.println("Exiting application.");
System.exit(0);
}
}

和HelloJavaLtk是实现上述LLRPEndpoint界面,基本上复制粘贴形式的链接的类。

因此,我们不知道,如果我们只是没有正确与运行寻址装置(“HID-OMNIKEY-5427-CK”)或试图达到这个终点时,我们是否应该做一些完全不同的。

我们将不胜感激任何帮助,如果有人已经能够使用OMNIKEY-5427-CK(或其他读卡器)与Java代码,可以带我们去其他的代码示例或给我们什么是我们做错了进一步的见解。

感谢所有。

java rfid smartcard-reader
3个回答
3
投票

所述HID OMNIKEY 5427 CK是PC / SC(CCID)兼容智能卡读取器。你试图使用该库是用于EPC RFID阅读器。这Omnikey的读者是通过PC / SC但是访问。目前甲骨文Java已经内置支持访问使用Java SmartcardIO API PC / SC智能卡读卡器。


1
投票

我认为你正在使用的代码是不兼容的,因为它看起来与LLRP协议的工作和设备支持CCID和键盘口。

CCID:

我无法找到你的设备的文档,但它看起来像CCID可能工作使用串行连接,如果是这样的话,你可以使用RXTX连接到设备(http://mfizz.com/oss/rxtx-for-java),然后从它发送命令和读取响应。

这是一个小例子:

// change to right port
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("/dev/ttyS0"); 
    if (portIdentifier.isCurrentlyOwned()) {
        throw new RfidReaderUnavailableException();
    } else {
        CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);
        if (commPort instanceof SerialPort) {
            SerialPort serialPort = (SerialPort) commPort;
            // This details have to match your device configuration or it won't work
            serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);

            in = serialPort.getInputStream();
            out = serialPort.getOutputStream();

            <-- Here you write the commands on out and read the responses from in -->

        } else {
            System.out.println("Error: Only serial ports are handled by this.");
        }
   }

在CCID的情况下不支持,他们将不得不为它提供一个驱动程序的串行通信。如果驾驶员不来与Java的兼容性,那么你将需要写一个JNI包装从Java代码中使用它。

键盘接口:

在这种模式下的功能将可能减少写卡ID,如果它是一个键盘,就像条形码扫描仪。你将无法从键盘输入和读者告诉我们,您将无法读取或写入或者从卡存储数据,但它可能取决于你什么你的应用程序必须实现工作。


1
投票

我知道这是很老的问题,因为我没有找到工作的例子与命令的任何地方,通过下面的代码就可以拿到卡的ATR和UID。

TerminalFactory factory = TerminalFactory.getDefault(); 
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
// get the first terminal
CardTerminal terminal = terminals.get(0);

// establish a connection with the card
Card card = terminal.connect("*");
System.out.println("card: " + card);
ATR atr = card.getATR();
System.out.println("Card ATR: " + DatatypeConverter.printHexBinary(atr.getBytes()));
CardChannel channel = card.getBasicChannel();
CommandAPDU commandAPDU;
commandAPDU = new CommandAPDU(new byte[]{(byte) 0xFF,(byte) 0xCA,(byte) 0x00,(byte) 0x00,(byte) 0x00});             
ResponseAPDU r = channel.transmit(commandAPDU);
System.out.println("Response: " + r.toString() + ", NR: " + r.getNr());
String hex = DatatypeConverter.printHexBinary(r.getBytes());
System.out.println("Response: " + hex);
System.out.println("Card UID: " + DatatypeConverter.printHexBinary(r.getData()));
byte[] copyOf = Arrays.copyOf(r.getBytes(), r.getNr());
System.out.println("Card UID from bytes: " + DatatypeConverter.printHexBinary(copyOf));
// disconnect
card.disconnect(false);
© www.soinside.com 2019 - 2024. All rights reserved.