Я не могу читать или писать метки 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;
}
}
}