首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建RFID应用程序读取HID OMNIKEY 5427 CK

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

Stack Overflow用户
提问于 2014-08-21 16:10:43
回答 3查看 5.5K关注 0票数 2

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

对于一些示例代码(除了这些代码,我们还找不到更多的示例代码),我们已经对这些代码进行了修改和使用,但是在运行代码时,我们得到了

代码语言:javascript
运行
复制
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)​

代码基本上是:

代码语言:javascript
运行
复制
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”),或我们是否应该做一些完全不同的事情,当我们试图到达终点。

如果有人能够在Java代码中使用OMNIKEY-5427-CK (或其他读卡器),可以指出其他代码示例,或者给我们进一步了解我们做错了什么,我们将非常感激。

谢谢大家。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-21 16:51:33

HID OMNIKEY 5427 CK是一个符合PC/SC (CCID)的智能卡读卡器。您正在尝试使用的库是为EPC RFID阅读器设计的。然而,这个Omnikey读取器可以通过PC/SC访问。当前的Oracle支持使用Java SmartcardIO API访问PC/SC智能卡读取器。

票数 3
EN

Stack Overflow用户

发布于 2019-02-08 11:01:33

我知道这是一个很老的问题,因为我在任何地方都找不到一个使用命令的示例,使用下面的代码,您可以得到卡片的ATR和UID。

代码语言:javascript
运行
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2014-08-21 17:18:15

我认为您使用的代码不兼容,因为它看起来与LLRP协议和您的设备支持CCID和键盘楔形。

CCID:

我找不到您的设备的文档,但是它似乎可以使用串行连接工作,如果是这样的话,您可以使用RXTX连接到设备(http://mfizz.com/oss/rxtx-for-java),然后发送命令并从它读取响应。

这是一个很小的例子:

代码语言:javascript
运行
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25431030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档