제로웍스 연동 API 문서

제로웍스 로봇이 비스캣 코어와 주고받는 채널·엔드포인트·페이로드·인증 규약입니다. 동작 흐름은 개발 시나리오를 함께 참조하세요.

1. 공통 규약

2. 인증 (REST)

POST /v1/robot/key — 비밀키 발급 (1회)

인증없음 (사전 등록된 robotId + 공개키)
요청
{ "robotId": "uuid", "publicKey": "base64-encoded PEM" }
200 응답
{
  "success": true,
  "data": {
    "secretKeyEncrypted": "base64",   // 로봇 공개키로 암호화된 HMAC 비밀키
    "issuedAt": "2026-05-21T10:00:00Z"
  }
}
에러404 ROBOT_NOT_REGISTERED, 409 ROBOT_ALREADY_ACTIVATED

POST /v1/robot/cert — X.509 인증서 발급 (1회용 URL)

인증HMAC (로봇)
200 응답
{ "success": true, "data": { "downloadUrl": "https://...", "expiresIn": 600 } }

HMAC 서명 방식

발급받은 비밀키로 요청을 서명합니다. X-Robot-Ts는 ±60초 윈도우를 벗어나면 ROBOT_TIMESTAMP_OUT_OF_WINDOW로 거절(replay 방지)됩니다. 서명 대상 문자열 구성(메서드·경로·timestamp·body 해시)은 결합 시 키 관리 가이드와 함께 확정합니다.

3. FMS 폴링·점유 (REST)

POST /v1/fms/command — 폴링·응답 단일 엔드포인트

인증HMAC (로봇)
레이트 리밋10 req/s per 로봇
요청 (요청 모드)
{
  "mode": "request",
  "robotMode": "none|serving|calling|charging|error",
  "battery": 85,
  "position": { "x": 0, "y": 0, "heading": 0 }
}
200 응답 (요청 모드)
{
  "success": true,
  "data": {
    "commands": [
      {
        "commandId": "uuid",
        "missionId": "uuid",
        "type": "anyone",
        "targetRobots": ["modelNoA", "modelNoB"],
        "missionType": "delivery|trash_pickup",
        "payload": { /* 미션별 — boxSlot 등 */ }
      }
    ]
  }
}
요청 (응답 모드)
{
  "mode": "response",
  "executions": [
    { "commandId": "uuid", "executionTime": 0 }   // 0 = 즉시 수행 → 점유
  ]
}
200 응답 (응답 모드)
{
  "success": true,
  "data": {
    "claimed": [ { "commandId": "uuid", "missionId": "uuid" } ],
    "rejected": [ { "commandId": "uuid", "reason": "already_claimed|expired|mode_mismatch" } ]
  }
}

4. 로봇 → 코어 인바운드 (SQS) 페이로드 협의 대기

주행 중 발생하는 이벤트는 AWS SQS로 코어에 전달됩니다. 공통 봉투(requestId·occurredAt·source="robot"·complexId·payload)에 담아 보냅니다.

kind의미payload 주요 필드
arrived매장·세대 도착위치, 도착 지점 구분
state상태·배터리·위치 보고robotMode, battery, position
error장애 보고오류 코드·상세 → 운영자 알림 생성
pin_verify_request점주/사용자 PIN 검증 요청boxSlot, pin(4자리), pinType: "owner"|"user"
box_closed비대면 상차 감지 (박스 닫힘)닫힘 센서 결과 — 배달 출발 트리거
// PIN 검증 요청 페이로드 (pin_verify_request)
{
  "robotId": "uuid",
  "boxSlot": 1,                // 1~4
  "pin": "7390",              // 입력된 4자리
  "pinType": "owner" | "user" // 점주(고정) / 사용자(랜덤)
}

pin_verify_request·box_closed의 구체 센서 페이로드 형식과 PIN 입력 채널(점주 KDS / 사용자 박스 키패드)은 제로웍스 펌웨어와 협의 후 확정합니다.

5. 코어 → 로봇 아웃바운드 (MQTT) 페이로드 협의 대기

코어의 응답·지시는 AWS IoT Core(MQTT)로 로봇에 전달됩니다. stream으로 종류를 구분합니다.

stream의미payload 주요 필드
pin_verify_resultPIN 검증 결과ok, boxSlot, reason?
box_assign적재함 칸 할당·개폐 지시boxSlot(1~4), action: "open"|"lock"
arrive / state / error응답 채널 ack·상태 동기화이벤트별
replan경로 수정 지시 (1차 자리만, 로그 적재)수정 경로 정보
// 칸 할당 지시 (box_assign)
{
  "robotId": "uuid",
  "missionId": "uuid",
  "boxSlot": 1,               // 코어가 주문 수량 기반으로 결정
  "action": "open" | "lock"
}

6. 에러 코드 (로봇 관련 발췌)

코드HTTP의미
ROBOT_SIGNATURE_INVALID401HMAC 서명 검증 실패
ROBOT_TIMESTAMP_OUT_OF_WINDOW401timestamp ±60s 윈도우 초과 (replay 의심)
ROBOT_CERT_REVOKED401인증서 폐기됨
ROBOT_NOT_REGISTERED404사전 등록되지 않은 robotId
ROBOT_ALREADY_ACTIVATED409비밀키 1회 발급 정책 위반
MISSION_ALREADY_CLAIMED409이미 다른 로봇이 점유
MISSION_EXPIRED409만료 미션 점유 시도
RATE_LIMIT_EXCEEDED429레이트 리밋 초과 — Retry-After 준수

전체 에러 카탈로그·멱등성·버전 정책은 비스캣 API 공통 규약을 따릅니다. 규약 상세는 비스캣 담당자를 통해 제공됩니다.