Я не могу читать или писать метки RFID. Как правильно сделать это с помощью устройства ввода-вывода Java Smart Card и устройства acr122u?

Моя команда и я пытаемся разработать приложение, способное читать и писать о картах RFID, используя библиотеку JAVA SmartCardIO. Эта тема совершенно новая для нас, поэтому мы почувствовали некоторую путаницу. Используемые нами устройства - acr122u и acr1255u-J1. Мы не знаем, какие именно карты мы покупаем, хе-хе.

Исследуя сеть, мы нашли несколько примеров на нескольких языках, но мы нашли лучшие результаты, используя Java.

У нас проблема в том, что мы не смогли записать или прочитать данные на карточках. Мы считаем, что наша ошибка в том, что мы не понимаем, как использовать команды APDU и их инструкции.

Из того, что мы исследовали, мы знаем о структуре команды APDU, об ошибках, среди прочего.

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

Я оставляю код, который у нас есть:

//This program attemps to run an example APDU from the acr122 API pdf file at page 16
package simplerfid;

import java.util.List;
import java.util.Scanner;
import javax.smartcardio.*;

public class SimpleRFID {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    int CLA; 
    int INS; 
    int P1; 
    int P2; 
    int LC; 
    int LE;

    //[FF] [B0] [00] [04] [0A] Read 4th block, legth of 10
    CLA = 0XFF;
    INS = 0xB0;
    P1 = 0x00;
    P2 = 0x01;
    LC = 0x0A;
    LE = 0x00;

    System.out.println("Searching devices...");
    //while(true){
        try {
            int CONT = 1;
            TerminalFactory factory = TerminalFactory.getDefault();
            CardTerminals terminals = factory.terminals();
            List<CardTerminal> listTerminals = terminals.list();
            CardTerminal cardTerminal = listTerminals.get(0);

            System.out.println("Device name: " + cardTerminal.getName());
            System.out.println("Waiting for Tag: ");
            while(true){//Infinite loop witing for tag
                cardTerminal.waitForCardPresent(0);
                System.out.println("TAG detected...");

                System.out.println("Building APDU...");
                byte[] newAPDU = new byte[]{(byte)CLA, (byte)INS, (byte)P1, (byte)P2, (byte)LC};
                CommandAPDU comandoAPDU = new CommandAPDU(newAPDU);//DATA, LE);

                System.out.println("Connecting with Terminal...");
                Card card = cardTerminal.connect("*");//Connect with all kind
                System.out.println(card.toString());
                System.out.println("ATR: " +  card.getATR().toString());

                System.out.println("Getting basic channel...");
                CardChannel channel = card.getBasicChannel();
                System.out.println("Geting Full ATR...");
                System.out.println(card.getATR());
                //System.out.println("PRESIONA UNA TECLA PARA ENVIAR EL COMANDO APDU...");
                //String keyboard = scanner.nextLine();                    
                System.out.println("Sending APDU command...");
                ResponseAPDU response = channel.transmit(comandoAPDU);
                System.out.println("Converting response...");
                byte[] byteResponseDATA = response.getData();
                System.out.println("GetBytes: " + response.getBytes().toString());
                System.out.println("NR: " + response.getNr());
                System.out.println("SW: " + response.getSW());
                System.out.println("SW1: " + response.getSW1());
                System.out.println("SW2: " + response.getSW2());
                System.out.println("Hascode: " + response.hashCode());
                System.out.println(response.toString());//Respuesta

                String strResponse = convertidorBytesAString(byteResponseDATA);
                System.out.println("BLOCK: " + CONT);
                CONT ++;
                System.out.println("Response without convertion: " + strResponse);
                //[41] [43] [52] [31] 32 32 55 32
                System.out.println("Converting bytes...");
                System.out.println("Bytes response: " + convertidorBytesAString(byteResponseDATA));
                System.out.println("Converted response to string utf-8: " + getStringFromByteArray(byteResponseDATA));
                System.out.println("=======================================================");
                System.out.println("Continue? y/n");
                if("n".equals(scanner.nextLine())){
                    break;
                }
                P2 += 0x01;//This is because I was searching on the next block over and over, but now I think this is not ok
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    //}
}   



//Converts the Bytes to a string
private static String convertidorBytesAString(byte[] uiBytes){
    StringBuilder result = new StringBuilder();
    for(byte b:uiBytes){
        result.append(String.format("%02x", b));
    }
    return result.toString();
}
//Gets an utf-8 string from an byte array 
private static String getStringFromByteArray(byte[] byteArray){
    try{
        return new String(byteArray, "UTF-8");
    }
    catch(Exception ex){
        System.out.println("Error!!!");
        System.out.println(ex.getMessage());
        return null;
    }
}

}

0 ответов

Другие вопросы по тегам