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
반응형

+ Recent posts