{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://dpworld/schemas/device_v2.json", "title": "Device configuration (schema v2 — flat 정규화)", "description": "Web Configurator ↔ dpworldapp 합의 schema. 옵션 B (Medium): type 정규화 + naming 일관성 + enum 명시, flat 구조 유지. 본 schema 는 협의용 (안) — 채택 후 양측 동시 도입 예정.", "type": "object", "required": [ "schema_version", "wifi_static", "eth_ip", "protocol_server_ip", "protocol_server_port" ], "additionalProperties": false, "properties": { "schema_version": { "type": "integer", "const": 2, "description": "본 schema 버전. v1 (legacy on/off string) ↔ v2 호환 정책은 spec §5.1 참조." }, "wifi_static": { "type": "boolean", "default": false, "description": "WiFi 정적 IP 사용 여부. v1 의 \"on\"/\"off\" → v2 의 true/false. Reader 측 deserializer 는 v1 형식도 관용 수용." }, "wifi_ip": { "type": "string", "format": "ipv4", "description": "WiFi 인터페이스 IP 주소 (정적 모드 시 사용)." }, "wifi_netmask": { "type": "string", "format": "ipv4", "description": "WiFi 서브넷 마스크." }, "wifi_gateway": { "type": "string", "format": "ipv4", "description": "WiFi 게이트웨이." }, "wifi_dns1": { "type": "string", "format": "ipv4", "description": "WiFi DNS 1." }, "wifi_dns2": { "type": "string", "format": "ipv4", "description": "WiFi DNS 2." }, "wifi_country_code": { "type": "string", "pattern": "^[A-Z]{2}$", "default": "KR", "description": "WiFi 국가 코드 (ISO 3166-1 alpha-2)." }, "eth_ip": { "type": "string", "format": "ipv4", "description": "Ethernet IP 주소 (관리 인터페이스)." }, "eth_netmask": { "type": "string", "format": "ipv4", "description": "Ethernet 서브넷 마스크." }, "eth_gateway": { "type": "string", "format": "ipv4", "description": "Ethernet 게이트웨이." }, "lte_ip": { "type": "string", "format": "ipv4", "description": "LTE 인터페이스 IP." }, "lte_netmask": { "type": "string", "format": "ipv4", "description": "LTE 서브넷 마스크." }, "lte_gateway": { "type": "string", "format": "ipv4", "description": "LTE 게이트웨이." }, "lte_port": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "LTE 모뎀 포트. v1 의 string \"534\" → v2 의 integer 534." }, "lte_server_ip": { "type": "string", "format": "ipv4", "description": "LTE 서버 IP." }, "lte_server_port": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "LTE 서버 포트. v1 의 string \"20111\" → v2 의 integer 20111." }, "protocol_server_ip": { "type": "string", "format": "ipv4", "description": "Protocol 서버 IP (RTLS 데이터 송신 대상)." }, "protocol_server_port": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "Protocol 서버 포트." }, "update_server_ip": { "type": "string", "format": "ipv4", "description": "Firmware/Config 업데이트 서버 IP." }, "update_server_port": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "업데이트 서버 포트." }, "rtcm_server_ip": { "type": "string", "format": "ipv4", "description": "RTCM 보정 서버 IP (GNSS RTK)." }, "rtcm_server_port": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "RTCM 서버 포트." }, "opc_ua_server_ip": { "type": "string", "format": "ipv4", "description": "OPC-UA 서버 IP." }, "opc_ua_server_port": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "OPC-UA 서버 포트." }, "modbus_server_ip": { "type": "string", "format": "ipv4", "description": "Modbus 서버 IP." }, "modbus_server_port": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "Modbus 서버 포트." }, "can_bus_type": { "type": "string", "enum": ["extended", "standard"], "default": "extended", "description": "CAN bus 타입." }, "can_baudrate": { "type": "integer", "enum": [100, 250, 500, 1000], "description": "CAN 통신 속도 (kbps). 운영 ground truth 일치." }, "rs485_mode": { "type": "string", "enum": ["half", "full"], "default": "half", "description": "RS-485 통신 모드." }, "rs485_baudrate": { "type": "integer", "enum": [1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200], "default": 9600, "description": "RS-485 통신 속도 (bps)." }, "rs485_databits": { "type": "integer", "enum": [5, 6, 7, 8, 9], "default": 8, "description": "RS-485 데이터 비트." }, "rs485_parity": { "type": "string", "enum": ["no", "even", "odd"], "default": "no", "description": "RS-485 패리티." }, "rs485_stopbits": { "type": "integer", "enum": [0, 1, 2], "default": 1, "description": "RS-485 정지 비트." }, "imu_remap_x": { "type": "string", "enum": ["x", "y", "z"], "default": "x", "description": "IMU X 축 매핑." }, "imu_remap_y": { "type": "string", "enum": ["x", "y", "z"], "default": "y", "description": "IMU Y 축 매핑." }, "imu_remap_z": { "type": "string", "enum": ["x", "y", "z"], "default": "z", "description": "IMU Z 축 매핑." }, "imu_remap_x_sign": { "type": "string", "enum": ["plus", "minus"], "default": "plus", "description": "IMU X 축 부호." }, "imu_remap_y_sign": { "type": "string", "enum": ["plus", "minus"], "default": "plus", "description": "IMU Y 축 부호." }, "imu_remap_z_sign": { "type": "string", "enum": ["plus", "minus"], "default": "plus", "description": "IMU Z 축 부호." }, "log_save": { "type": "boolean", "default": true, "description": "로그 저장 여부. v1 의 \"on\"/\"off\" → v2 의 true/false." }, "log_max_size": { "type": "integer", "minimum": 1, "description": "로그 파일 최대 크기 (MB)." }, "log_max_duration": { "type": "integer", "minimum": 1, "description": "로그 파일 최대 보관 기간 (일)." }, "ssid_list": { "type": "array", "description": "WiFi 연결 후보 SSID 목록 (우선순위 순). v1 의 'WIFI_SSID' upper-case → v2 의 ssid_list snake_case.", "items": { "type": "object", "required": ["wifi_ssid", "wifi_security"], "additionalProperties": false, "properties": { "wifi_ssid": { "type": "string", "description": "SSID 이름." }, "wifi_passwd": { "type": "string", "description": "WiFi 비밀번호. security 가 'none' 이면 빈 string 가능." }, "wifi_security": { "type": "string", "enum": ["wpa/wpa2", "wpa3", "wep", "none"], "description": "WiFi 보안 방식." } } } } } }