Как создать приложение RFID для чтения HID OMNIKEY 5427 CK

Мы с коллегами пытаемся создать 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, мог бы указать нам на другие примеры кода или дать нам дополнительную информацию о том, что мы делаем неправильно.

Спасибо всем.


person Diego    schedule 21.08.2014    source источник


Ответы (3)


HID OMNIKEY 5427 CK — это считыватель смарт-карт, совместимый с ПК/SC (CCID). Библиотека, которую вы пытаетесь использовать, предназначена для считывателей EPC RFID. Однако доступ к этому считывателю Omnikey осуществляется через ПК/SC. Текущая версия Oracle Java имеет встроенную поддержку доступа к устройствам чтения смарт-карт ПК/SC с использованием Java SmartcardIO API.

person Michael Roland    schedule 21.08.2014
comment
Спасибо. javax.smartcardio.* работал! мы успешно подключились к считывателю RFID и отправили команды APDU, которые вернули UID тега. - person Diego; 29.08.2014
comment
@Diego Alonso, не могли бы вы добавить дополнительную информацию о своем решении? Я пытаюсь отправить transmitAPDU(new CommandAPDU(new byte[]{(byte)0x80, (byte)0xA6, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00}));, но получаю sun.security.smartcardio.PCSCException: Unknown error 0x1f - person bvdb; 04.12.2015
comment
@Diego: Не могли бы вы поделиться своим решением. У меня проблема с поиском правильного APDU для omnikey 5427CK. - person SK.; 01.02.2018
comment
Skumar, Давно я этим не увлекался. Я считаю, что исходный код был опубликован здесь. Я не могу вспомнить, был ли это DDSsmartcardio или SampleLoginWindow. Это был своего рода эксперимент, и парень, который его кодировал, был инженером-биомедиком. Я надеюсь, что это поможет вам, но я не могу обещать, что вы найдете там решение своей проблемы. Удачи. - person Diego; 01.02.2018

Я думаю, что код, который вы используете, несовместим, так как он работает с протоколом 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.

Разрыв клавиатуры:

Функциональность в этом режиме, вероятно, будет сведена к записи идентификатора карты, как если бы это была клавиатура, очень похожая на сканеры штрих-кода. вы не сможете определить это по вводу с клавиатуры и устройству чтения, а также не сможете читать или записывать данные из памяти карты, однако это может сработать для вас в зависимости от того, чего должно достичь ваше приложение.

person Adrian Lopez    schedule 21.08.2014
comment
Спасибо, хотя наш читатель, похоже, не имеет возможности общаться по серийному номеру. - person Diego; 29.08.2014

Я знаю, что это очень старый вопрос. Поскольку я нигде не нашел рабочего примера с командой, с помощью приведенного ниже кода вы можете получить 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);
person jan_kiran    schedule 08.02.2019