728x90
반응형
개발 환경이 Windows라면, 도커 컨테이너는 wsl 기반이기 때문에 바인딩을 해주어야 한다.
참고로 windows와 wsl 환경에서 동시에 쓰일 수 없다.
1. usbipd 설치
먼저 Windows PowerShell을 관리자 모드로 키고 usbipd를 다운로드 받는다.
$ winget install usbipd
그 다음 USB를 연결하고 아래 명령어로 연결된 장치를 확인한다.
$ usbipd list
여기서 USB 직렬 장치(COM5) <- 장비를 쓸 예정인데, 지금 State를 보면 Not shared인 것을 확인할 수 있다.
이 State를 Shared로 바꿔야 wsl에서 인식할 수 있다.
먼저 바인딩을 해준다. ( 위 사진의 BUSID 참고 )
$ usbipd bind --busid 2-4
그 다음 wsl attach를 해준다.
$ usbipd attach --wsl -b 2-4
우분투 shell에서 확인해보면,
/# lsusb
이렇게 04d8:000a 주소가 잘 뜨는 것을 확인할 수 있다.
이제 Docker Container Spring boot에서 해당 데이터를 송 수신 해보자.
2. build.gradle 추가
dependencies {
...
implementation 'com.fazecast:jSerialComm:2.11.0'
...
}
3. 메서드 구현
read() 메서드를 @Scheduled를 사용한 스케줄링으로도 사용이 가능하다.
@Getter
@Slf4j
@Component
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class UA10SerialImpl implements ThMeterSerial {
private final static byte[] WRITE_DATA_BYTE_ARRAY = new byte[]{65, 84, 67, 68, 13, 10};
@Setter
@Getter
public DeviceDto deviceDto;
private SerialPort serialPort;
public void connect() {
try {
if (serialPort == null) {
serialPort = SerialPort.getCommPort(this.deviceDto.getSerialPort());
}
serialPort.setComPortParameters(9600, 8, SerialPort.ONE_STOP_BIT, SerialPort.NO_PARITY);
serialPort.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 0, 0);
if (!serialPort.openPort()) {
disconnect();
}
this.deviceDto.setIsConnected(true);
} catch (Exception e) {
log.error("[ Serial Connect Exception ] message : {}", e.getMessage());
}
}
public void disconnect() {
if (!serialPort.closePort()) {
log.info("Failed to close port.");
}
serialPort.setComPortTimeouts(SerialPort.TIMEOUT_NONBLOCKING, 0, 0);
serialPort = null;
this.deviceDto.setIsConnected(false);
}
public synchronized void read() {
if (!deviceDto.getIsConnected()) {
return;
}
if (serialPort == null || serialPort.bytesAvailable() < 0) {
connect();
return;
}
serialPort.writeBytes(WRITE_DATA_BYTE_ARRAY,
WRITE_DATA_BYTE_ARRAY.length);
byte[] readBuffer = new byte[serialPort.bytesAvailable()];
int numRead = serialPort.readBytes(readBuffer, readBuffer.length);
if (numRead == 0) {
return;
}
String receivedData = new String(readBuffer, 0, numRead);
log.info("Received data: {}", receivedData);
}
}
728x90
반응형