리눅스 보드에서 계산된 체적값을 윈도우 PC 로 전송하는 프로그램이 필요하다
체적값은 이더넷 케이블을 통해 전달되고, PC 에서는 이 데이터가 넘어오는것을
START/STOP 할수 있는 버튼이 필요하다.
또한 데이터가 넘어올때 수신완료에 걸리는 시간과 FPS 의 측정이 필요하다
linux 의 경우 BSD socket 을 사용하고, 윈도우 에서는 winsock 과 mfc 의 cscoket 이 있다.
소켓 끊고 맺는 과정에서 2개의 다른 인터페이스를 쓰면, 작성에 필요한 배경지식도 2배가 되고,
나중에 다른이가 확장하거나 수정할때도 부담이 될것이라 판단.
두 플랫폼에서 공통적으로 쓸수 있는 socket 이 있는지 확인
--> boost::asio 소켓을 사용하는 방향으로 진행
전달해야 하는 데이터는 다음과 같다.
timestamp string (100)
체적 string (100)
point cloud 데이터 (640 x 480 x 2)
START/STOP 은 버튼을 누를떄만 접속한다. 명령을 보내고나면 연결을 종료한다.
전달해야 하는 명령은 다음과 같다.
command id (4)
command argument vector
PC 는 접속을 대기하는 서버 (acceptor) 를 열어두고, 보드에서 클라이언트를
실행하면 접속시도를 한다.
클라이언트는 데이터 구조체를 serialize 해서 전달하고, 서버는 받은 데이터를
deserialize 해서 구조체를 재구성한다.
데이터를 보낼때는 serialize 된 payload 와 payload_size 를 한번에 전달하고,
tcp framing 을 적용한다.
따라서 데이터의 실제 모양은 다음과 같다
payload_size (4bytes)
payload
payload 의 실제 모양은 다음과 같다
timestamp string size (4bytes)
timestamp string
체적 string size (4bytes)
체적 string
point cloud 데이터 size (4bytes)
point cloud 데이터
데이터를 받을때는 커널로부터 1024 bytes 씩 읽어서 데이터를 이어붙인후
deserialize 를 시도한다. deserialize 가 성공할때까지 반복한다.
따라서 데이터의 실제 모양은 다음과 같다
payload_size (4bytes)
payload
payload 의 실제 모양은 다음과 같다
command id size (4bytes)
command id
command argument vector size (4bytes)
command argument vector
클라이언트에서 write(), shutdown() 를 쓸때, 서버가 종료된 상태면
exception 이 발생할수 있으므로 try catch 로 감싸야 한다.
클라이언트에서 connect() 를 쓸때, 접속할 서버가 없으면 block 된다.
따라서 async_connect() 와 steady_timer 를 사용해 일정시간이 흐른후에
접속 성공유무를 체크한다.
접속하는 클라이언트가 없다면, 서버는 accept() 에서 block 된 상태로 대기하게 된다.
이 상태에서 서버를 종료하려면, dummy connect (자기자신에게 접속) 를 사용해
accept 를 풀어주고 종료를 해야 한다.
( 그렇지 않으면, 접속처리 스레드가 join 하지 않아서 프로그램이 종료되지 않을 수 있다. )
리눅스 보드 역활을 vm 으로 대신하였다.
https://youtu.be/EhwUyUxJ4io
https://gitlab.com/feather973/boost_linux_client
https://gitlab.com/feather973/boost_window_server