환영합니다, 운영자님

농장 관리 서비스 연결 설정을 구성하세요.

연결 설정 (Connection Profile)

시스템 개요

MQTT 브로커
221.157.125.41 (WebSockets)
명령 토픽 (Command)
whynot/field1/cmd
데이터 토픽 (Data)
whynot/field1/data

장치 제어 (Controls)

AUTO MANUAL

현장 액추에이터를 직접 제어합니다.

CCTV 카메라 목록

목록을 불러오는 중...

장치 목록을 불러오는 중이거나 장치가 없습니다.
'장치 설정' 탭에서 [장치 목록 불러오기]를 클릭하세요.

실시간 모니터링 (Monitor)

센서 데이터 스트림을 확인합니다.

수신 데이터 (Data Stream)

데이터 수신 대기 중... (whynot/field1/data)

장치 설정 (Settings)

장치 이름을 관리합니다.

장치 이름 관리

'장치 목록 불러오기' 버튼을 눌러주세요.

밸브 그룹 설정 (Valve Groups)

펌프 작동 시 함께 열려야 할 밸브들을 설정합니다.

'그룹 목록 불러오기' 버튼을 눌러주세요.

그룹 추가 / 수정

TheIMC 스마트팜 SDK v2.0 인터페이스 명세서

스마트팜 제어 인터페이스 구현을 위한 통합 개발자 가이드입니다.

1. 시스템 구조 및 연결 (Architecture & Connection)

이 시스템은 MQTT over WebSockets를 사용합니다. 클라이언트는 브로커에 연결하고 아래의 두 가지 주요 토픽을 필수로 구독해야 합니다.

브로커 URL ws://221.157.125.41:9001
명령 토픽 (Pub) theIMC/{field_id}/cmd
응답(Ack) 토픽 (Sub) theIMC/{field_id}/ack
데이터 토픽 (Sub) theIMC/{field_id}/data

* {field_id}는 일반적으로 'office' 또는 특정 현장 ID를 사용합니다.

2. 액추에이터 제어 (Actuator Control)

포트 인터페이스(0~15)를 통한 직접 하드웨어 제어입니다.

제어 명령 (Client → Server)

{
  "action": "set",  // 수동관수 + 모터펌프 물채움
  "port": 0,        // LED 번호 0~7
  "value": 1,       // 0->off, 1->on
  "ts": 1737412345678 // timestamp
}

제어 응답 (Server → Client)

응답(Ack) 토픽으로 수신됩니다:

// Echo confirmation
{
  "action": "set",
  "port": 0,
  "value": 1
}

3. 시스템 메타데이터 (System Metadata)

장치 검색 및 이름 관리 서비스입니다.

장치 목록 요청

{ "action": "deviceNames" }

응답 (Response)

{
  "event": "deviceNames",
  "data": {
    "0": "Main Pump",
    "1": "Valve A"
  }
}

4. 밸브 그룹 자동화 (Valve Group Automation)

펌프 연동 자동 밸브 설정을 구성합니다. 포트 매핑(0-15)을 엄격하게 따릅니다.

그룹 설정 (추가/수정)

{
  "action": "valveGroup",
  "port": 0,         // Master Pump Port
  "valves": [1, 2],  // Member Valve Ports
  "match": "set"
}

삭제하려면 비어있는 valves: [] 배열을 전송하세요.

설정 조회

// Request
{ "action": "valveGroup", "command": "info" }

// Response
{
  "command": "getValveGroups",
  "valveGroups": [
    { "pumpPort": 0, "valvePorts": [1, 2] }
  ]
}

5. CCTV 관제 (WebRTC Signaling)

시그널링 메시지는 MQTT 브로커를 통과하기 위해 JSON으로 래핑됩니다.

Client Offer (시작 요청)

{
  "action": "cctvs",
  "command": "createOffer",  
  "cameraId": "uuid-string...",
  "payload": {
    "type": "offer",
    "sdp": "v=0\r\n..."
  }
}

Server Answer (서버 응답)

{
  "action": "cctvs",
  "command": "answer",  
  "cameraId": "uuid-string...",
  "payload": {
    "type": "answer",
    "sdp": "v=0\r\n..."
  }
}
참고: ICE Candidates 메시지도 동일한 구조를 따르며, command: "candidate"를 사용합니다.

6. 백엔드 개선 요청 사항 (RFC)

대상: 백엔드 개발팀

프론트엔드 팀은 시스템 안정성과 동기화 개선을 위해 다음 프로토콜 확장을 요청합니다.

6.1 일괄 제어 (Atomic Batch)

요구사항: 펌프/밸브 그룹의 동시 제어를 보장하여 압력 스파이크를 방지합니다.

{
  "action": "setBatch",
  "operations": [
    { "port": 0, "value": 1 },
    { "port": 1, "value": 1 }
  ]
}

6.2 에러 피드백 채널

요구사항: 실패한 명령(포트 오류, 하드웨어 타임아웃 등)에 대한 명시적 에러 응답이 필요합니다.

{
  "event": "error",
  "code": 503,
  "msg": "Device Timeout",
  "ref": "set"
}

6.3 시스템 상태 텔레메트리

요구사항: 백엔드 서비스의 상태 및 가동 시간(Uptime)을 모니터링하기 위한 전용 토픽입니다.

Topic: theIMC/{field_id}/status/health { "cpu": 45, "mem": "1024MB", "uptime": 86400 }

7. 고객용 앱 UI 구현 가이드 (Customer App Implementation)

고객용 앱에서 장치 제어 UI를 구현하는 예시입니다.

미리보기 (Preview)

관수 펌프 1
포트 0
Manual Control

구현 코드 (HTML/CSS Structure)

<!-- 장치 카드 컨테이너 -->
<div class="control-card">
  <!-- 헤더: 이름 및 상태 표시등 -->
  <div class="control-header">
    <span>관수 펌프 1</span>
    <!-- 상태 표시등: .on 클래스로 켜짐/꺼짐 토글 -->
    <div class="indicator-lamp on"></div>
  </div>

  <!-- 제어 버튼 그룹 -->
  <div class="btn-group">
    <button class="btn-on" onclick="sendCmd(0, 1)">켜기</button>
    <button class="btn-off" onclick="sendCmd(0, 0)">끄기</button>
  </div>
</div>

핵심 로직:
1. indicator-lamp는 수신된 Ack/Data 메시지의 value: 1 값에 따라 .on 클래스를 추가/제거합니다.
2. 버튼 클릭 시 { action: "set", port: 0, value: 1 } JSON을 발행합니다.