Читайте серийный номер iButton с Jssc - PullRequest
0 голосов
/ 11 декабря 2019

Я использую библиотеку Jssc для связи с устройством чтения iButton, подключенным через USB-порт. Сам порт ( / dev / ttyUSB0 , я использую ОС Debian) выглядит нормально, и мое java-приложение как-то реагирует, когда я привязываю iButton к читателю. Буфер последовательного порта Jssc заполняется некоторыми данными. Проблема в том, что я понятия не имею, как извлечь любую действительную информацию из буфера. Я пробовал разные способы обработки буферных данных, но безуспешно. Вот некоторый код Java, который я использую.

    public class iButtonReader {
    private static final int IBUTTON_CODE_BYTE_LENGTH = 6;
    private static SerialPort serialPort;

    public static void main(String[] args) {
        String portName = getDefaultPort();

        if (!portAvailable(portName)) {
            throw new IllegalStateException("Default port is not available!");
        }

        serialPort = new SerialPort(portName);

        try {
            serialPort.openPort();
            serialPort.setParams(
                    SerialPort.BAUDRATE_9600,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE
            );
            int mask = SerialPort.MASK_RXCHAR;

            serialPort.setEventsMask(mask);
            serialPort.addEventListener(new SerialPortReader());

        } catch (SerialPortException ex) {
            ex.printStackTrace();
        }
    }

    private static String getDefaultPort() {
        String os = System.getProperty("os.name").toUpperCase();

        switch (os) {
            case "LINUX":
                return  "/dev/ttyUSB0";
            case "WINDOWS":
                return  "USB1";
            default:
                throw new IllegalStateException("ОS " + os + " is not supported!");
        }
    }

    private static boolean portAvailable(String portName) {
        String[] portNames = SerialPortList.getPortNames();

        System.out.println("Available serial ports: ");
        for (String port : portNames) {
            System.out.println(port);
            if (portName.equals(port)) {
                return true;
            }
        }

        return false;
    }

    static class SerialPortReader implements SerialPortEventListener {

        @Override
        public void serialEvent(SerialPortEvent event) {
            if (event.isRXCHAR()){
                if(event.getEventValue() == IBUTTON_CODE_BYTE_LENGTH) {
                    try {
                        byte[] buffer = serialPort.readBytes();

                        System.out.println(Convert.toLong(buffer));
                        System.out.println(new String(buffer, StandardCharsets.UTF_16LE));
                        System.out.println(new String(buffer, StandardCharsets.UTF_16));
                        System.out.println(new String(buffer, StandardCharsets.UTF_16BE));
                        System.out.println(new String(buffer, StandardCharsets.US_ASCII));
                        System.out.println(new String(buffer, StandardCharsets.ISO_8859_1));
                        System.out.println(new String(buffer, StandardCharsets.UTF_8));

                    } catch (SerialPortException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
    }
}

Вывод:

281474976710655 ������ ÿÿÿÿÿÿ ������

Где 281474976710655 определенно не является действительным последовательным кодом, так как разные iButton-ы дают одинаковый результат.

UPD: фактически, с одним физическим контактом iButton он читает только 1 байт.

...