feat: stream monitor updates over websocket

This commit is contained in:
seo committed 2026-10-22 14:48:55 +09:00
1 parent 5aac4bc208
commit 629e9c5dc5
3 files changed
+344 -21

No files matched your search

+8 -3
View File
@@ -13,7 +13,7 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
- 차량 상태 수집과 저장
- 차량 상태 API
- 허용된 차량 명령 TCP 전송
- monitor 화면과 AJAX 상태 갱신
- monitor 화면과 WebSocket 실시간 상태 갱신
- monitor 화면 WakeLock, 언어, 테마 토글
- monitor 좌측 상단 이전 페이지 복귀 링크
- 모바일 및 좁은 카드 폭에 맞춘 사용량 2줄 배치, 로그 가로 스크롤, 시간 문구 축약
@@ -23,7 +23,7 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
- 수집 공백을 반영한 차량 상태 경과 시간 표시
- 도어/경계/시동/공조 상태 해석
- 실시간 차량 도어/트렁크 열림 표시
- Gen5W 헤드유닛의 약 2,000개 MQTT 지표를 5초 snapshot으로 결합한 실시간 텔레메트리 패널
- Gen5W MQTT retained snapshot과 변경 이벤트를 결합한 실시간 텔레메트리 패널
- 주행·전원, HEV·12V, 도어·안전, 공조, 내비 안내, 헤드유닛·미디어 상태의 반응형 요약
- PWA icon 제공
@@ -34,6 +34,7 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
- `monitor.php?mode=ajax`: monitor 상태 AJAX
- `monitor.php?mode=usage`: 데이터 사용량 AJAX
- `monitor.php?mode=telemetry`: 인증된 브라우저용 Gen5W MQTT 텔레메트리 요약
- `monitor.php?mode=ws-ticket`: `seo.chaegeon.com` WebSocket용 30초 서명 티켓
- `monitor.php?mode=usage-calibration`: 관리자 전용 데이터 사용량 보정 기준점 조회/저장
- `monitor.php?mode=auth-login`: 브라우저 직접 접근 비밀번호 화면용 공통 암호 검증
@@ -78,6 +79,7 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
- `/volume1/web/config/car.php`: TCP, DB, token, 허용 IP 설정
- `/volume1/web/config/car-mqtt.php`: 읽기 전용 MQTT 계정과 Tailscale 연결 설정
- `/volume1/web/config/car-cache/telemetry.json`: 웹 계정만 읽는 retained snapshot 단기 캐시
- `/volume1/web/config/car-ws-ticket.php`: 직접 요청 시 내용이 출력되지 않는 WebSocket 서명 키
## Gen5W MQTT 텔레메트리
@@ -116,6 +118,8 @@ return [
`car_dashboard` MQTT 계정은 `niro/gen5w/state`, `niro/gen5w/state/#`와 `niro/gen5w/status`만 읽을 수 있습니다. `NiroTelemetrySnapshot.php`는 같은 웹 요청이 반복돼도 broker snapshot은 최대 4초 동안 웹 전용 캐시에서 재사용합니다. 새 수집이 실패하면 직전 cache를 표시하되 `stale`과 cache fallback 상태를 함께 반환하며, availability가 offline이면 마지막 값을 보존하되 즉시 stale로 판정합니다.
정상 경로에서는 `car-monitor-ws.service`가 MQTT 연결 하나를 유지합니다. 접속 직후 retained 전체와 최근 로그 300건을 한 번 보내고 이후 변경된 MQTT 항목과 새 로그만 전송합니다. WS 연결 또는 인증이 실패한 동안에만 `mode=ajax`와 `mode=telemetry`를 5초마다 호출하며, `mode=ajax`는 `after_seq` 이후 로그만 반환합니다. 사용량은 별도 60초 주기로 조회합니다.
요약 계약 회귀시험은 CLI에서만 실행됩니다.
```bash
@@ -125,7 +129,7 @@ php tests/NiroTelemetrySnapshotTest.php
## 처리 흐름
1. `collector_se.php`가 차량 상태를 수집해 DB에 저장합니다.
2. `monitor.php`는 상태 AJAX와 사용량 AJAX를 분리해 갱신합니다.
2. `monitor.php`는 WebSocket을 우선 사용하고 장애 시 HTTP 증분 조회로 전환합니다.
3. 제어 요청은 token/IP 정책을 검증합니다.
4. 명령 코드를 허용 목록과 대조합니다.
5. 요청을 `car_tcp_request_queue`에 저장합니다.
@@ -172,6 +176,7 @@ Worker 교체나 예외 종료로 `processing`, `ui_timeout_pending` 상태가
- 차량 API는 API token 또는 허용 IP 정책을 사용합니다.
- 차량 모니터 화면과 `monitor.php?mode=ajax`, `monitor.php?mode=usage`는 런처 공통 인증 쿠키 또는 사이트 관리자 세션이 유효할 때만 응답합니다.
- `monitor.php?mode=ws-ticket`도 같은 인증을 요구하며 티켓은 30초 후 만료되고 한 번만 사용할 수 있습니다.
- `monitor.php?mode=telemetry`도 동일한 브라우저 인증을 통과해야 하며 원시 MQTT snapshot과 broker 비밀번호는 응답하지 않습니다.
- MQTT 계정은 표시 topic 두 개만 읽을 수 있고 publish 권한이 없습니다. 비밀 파일과 snapshot cache는 저장소 밖에 두고 웹 실행 계정만 읽도록 유지합니다.
- `monitor.php?mode=usage-calibration`은 사이트 관리자 세션이 확인될 때만 응답합니다. 일반 PIN 쿠키로 들어온 사용자는 화면에서 설정 아이콘이 보이지 않고, 직접 API를 호출해도 차단됩니다.