Używam czytnika RFID ID-12LA i biblioteki Java RxTx.

Ładowanie danych z czytnika, ale dane: „\ u000267009CB3541C”

Jak usunąć \ u0002? Identyfikator karty to 67009CB3541C. Wydruk systemowy to 67009CB3541C

        BufferedReader input = new BufferedReader(new InputStreamReader(port.getInputStream()));
                        port.addEventListener(event -> {
                            if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
                                try {
                                    String inputLine = input.readLine();
                                    inputLine.replace("\"\\u0002\"", "");

                                    System.out.println("Read data: " + inputLine);
}
catch (IOException | URISyntaxException e) {
                            System.err.println(e.toString());

                        }

    });

Potrzebuję String, który reprezentuje kod karty. Potrzebuję czytnika numerów kart i zezwalam na dostęp.

0
Evzenkooo 23 marzec 2020, 17:41

2 odpowiedzi

Najlepsza odpowiedź

Nie znam protokołu używanego przez ten czytnik RFID, ale wygląda na to, że używanie java.io.Reader nie jest bezpieczne. Jeśli wczytujesz nieprzetworzone bajty do ciągu, ryzykujesz uszkodzenie danych, gdy są one kodowane przy użyciu zestawu znaków.

Wygląda na to, że urządzenie odsyła bajt odpowiedzi (w tym przypadku 02), po którym następują bajty ASCII reprezentujące identyfikator karty. Dlatego unikaj używania InputStreamReader; zamiast tego przeczytaj pierwszy bajt, a następnie przeczytaj bajty, aż napotkasz znak nowej linii i przekonwertuj je na łańcuch. ( Nie pomijaj zestawu znaków podczas konwersji - nie chcesz polegać na domyślnym zestawie znaków systemu!)

InputStream input = port.getInputStream();

int code = input.read();
if (code != 2) {
    throw new IOException("Reader did not return expected code 2.");
}

ByteArrayOutputStream idBuffer = new ByteArrayOutputStream();
int b;
while ((b = input.read()) >= 0 && b != '\r' && b != '\n') {
    idBuffer.write(b);
}

String cardID = idBuffer.toString(StandardCharsets.UTF_8);
0
VGR 23 marzec 2020, 16:27

Wtedy rzeczywiście możesz go zastąpić w następujący sposób:

inputLine = inputLine.replace("\u0002", "");

Zwróć uwagę na składnię \ u0002, która reprezentuje jeden znak.

Lub, jeśli masz pewność, że jest to zawsze pierwszy znak:

inputLine = inputLine.substring(1);
0
Botje 23 marzec 2020, 16:21