
연구 코드명: Project J3D-TurntableApp_MobileControl
핵심 기술: Flutter (Dart) · Provider 상태관리 · TCP/UDP 소켓 통신 · Android SDK
해결 과제:
3D 스캐너용 자동 턴테이블을 제어하는 PC S/W 이미 개발 완료, 피사체 옆에서 실시간으로 동작을 확인하며 제어하려면 PC 앞에서만 조작 가능한 구조적 한계
또한 촬영 중 즉각적인 긴급 정지, 연속 회전 중 특정 지점 스윙 실행 등 현장 밀착형 제어가 불가능하여 스캔 품질 저하 및 작업 효율 손실 발생.
모바일 앱으로 무선 원격 제어 환경을 구축하여 PC에서 손을 떼고 피사체 옆에서 직접 제어할 수 있도록 함.
핵심 방향 : Android 스마트폰에서 Wi-Fi를 통해 PC 턴테이블 SW와 TCP 소켓으로 직접 통신. 하단 내비게이션 3탭 구조(메인 / 연결설정 / 동작제어)로 초보자도 순서대로 따라가면 즉시 제어 가능한 단일 앱으로 구현. 공유기 모드(모바일이 PC 탐색)와 핫스팟 모드(PC가 모바일에 연결) 두 가지 네트워크 환경을 모두 지원.
기술 스택 : Flutter 3.x · Dart · Provider (상태관리) · TCP Socket Port 1103 (제어 명령) · UDP Broadcast Port 1104 (기기 자동 탐색) · package_info_plus (버전 자동 반영) · Android API 21+

Issue: 사용자가 매번 PC의 IP 주소를 직접 입력하는 방식은 비전문가에게 진입 장벽이 됨. 공유기 환경에서는 PC IP가 바뀔 수 있고, 모바일 핫스팟 환경에서는 구조 자체가 달라짐.
Approach: 두 가지 모드를 이중으로 지원하는 탐색 구조를 설계.
공유기 모드: 모바일이 UDP 포트 1104로 브로드캐스트를 전송 → PC SW가 수신 후 자신의 IP와 TCP 포트 1103을 담은 응답 패킷 전송 → 모바일이 수신 즉시 자동 TCP 연결 시도
핫스팟 모드: 모바일이 핫스팟을 열고 PC가 연결 요청을 보내면 모바일이 승인 또는 거절을 선택하는 역방향 구조
두 모드 모두 사용자가 IP를 입력하지 않아도 자동으로 연결되며, 연결 성공 후 동작제어 탭으로 자동 이동하여 즉시 제어 가능.

Issue: TCP 연결이 장시간 유지될 경우 중간 네트워크 장비나 OS가 유휴 소켓을 임의로 끊는 현상을 방지하기 위해, 모바일 앱은 5초마다 {"ping": true} 신호를 자동 전송하고 10초 내에 {"pong": true} 응답이 없으면 연결 끊김으로 판단하여 자동 재연결하는 하트비트 체계를 구현. 그런데 PC 턴테이블 SW의 명령이 action 필드 기반으로 동작하여, ping 키만 포함된 패킷을 수신하면 action 값이 빈 문자열로 인식되어 PC 로그에 알 수 없는 명령 무시: 메시지가 5초 간격으로 반복 출력되었다. 로그가 의미 없는 오류로 가득 차 실제 동작 로그를 파악하기 어려운 문제.
Approach: PC SW 명령 파서 최상단에 ping 키 존재 여부를 먼저 확인하는 분기를 추가. ping 수신 시 즉시 {"pong": true}를 응답하고 명령 처리 흐름을 건너뛰도록 수정. 모바일-PC 간 프로토콜 계약이 양쪽 코드에서 완전히 일치해야 한다는 것을 알게됨.
Issue: 초기 설계는 모바일 → PC 방향의 명령 전송에만 집중하였고, PC → 모바일 방향의 상태 전송은 구현되지 않았다. 결과적으로 PC에서 회전이 완료되어도 모바일 앱은 RUNNING 상태를 계속 표시하였고, PC에서 동작을 멈추면 모바일의 정지·긴급정지 버튼이 여전히 활성 상태. 반대로 PC에서 회전을 시작해도 모바일은 여전히 READY 상태를 표시하는 등 양방향 상태 불일치가 상시 발생.
Approach: PC SW가 동작 상태가 변경될 때마다 아래 JSON을 즉시 모바일로 전송하는 상태 브로드캐스트 체계를 추가 정의.
PC 동작 시점전송 신호
회전 시작{"state": "RUNNING"} / 회전 완료·정지{"state": "READY"} / 감속 중{"state": "STOPPING"} / 장치 연결됨{"state": "DEVICE_CONNECTED"} / 오류 발생{"state": "ERROR", "message": "내용"}
모바일의 핸들러가 이 신호를 수신하여 UI 버튼 활성·비활성 및 상태 표시를 즉시 갱신. 단방향 명령 앱에서 진정한 양방향 연동 앱으로 전환됨.

❌ Before (기존 방식)

✅ After (개선된 방식)
3D 스캐너 활용성 향상: 턴테이블 제어의 공간적 제약 해소, 1인 스캔 작업 완결 가능
3D스캔하면서 턴테이블 제어: 피사체 상태를 눈으로 확인하며 즉각 개입 가능
기존 Einscan PRO 용 턴테이블(고정식 3D스캐너 전용 턴테이블)을 핸디형 레이저 3D스캐너에 알맞게 변형하여, 추가적인 필요 기능 및 물리적 부분 업데이트 가능
