Я использую библиотеку 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 байт.