86 lines
4.3 KiB
Markdown
86 lines
4.3 KiB
Markdown
# Car
|
|
|
|
차량 상태 조회, TCP 명령 전송, 모니터링, 데이터 사용량 표시를 제공하는 PHP 기반 차량 서비스입니다.
|
|
|
|
## 프로젝트 성격
|
|
|
|
Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저장하고, 웹 화면과 API에서 최신 상태와 명령 실행 결과를 제공하는 내부 차량 관리 서비스입니다.
|
|
|
|
모뎀에서 제공되는 값의 한계가 있으므로 도어 잠김, 경계, 시동, 공조 상태는 여러 필드를 조합해 해석합니다. 통신사 사용량은 DB 수집값과 T world 기준 보정값을 함께 사용합니다.
|
|
|
|
## 주요 기능
|
|
|
|
- 차량 상태 수집과 저장
|
|
- 차량 상태 API
|
|
- 허용된 차량 명령 TCP 전송
|
|
- monitor 화면과 AJAX 상태 갱신
|
|
- 사용량/요금 표시와 보정 metadata
|
|
- 4.95초 UI timeout과 60초 사용량 정산 분리
|
|
- TCP 실패 reason과 마지막 수신 지연 표시
|
|
- 도어/경계/시동/공조 상태 해석
|
|
- service worker와 PWA icon 제공
|
|
|
|
## 주요 API
|
|
|
|
- `api.php?action=status`: 차량 상태 조회
|
|
- `api.php?action=command`: 차량 명령 전송
|
|
- `monitor.php?mode=ajax`: monitor 상태 AJAX
|
|
- `monitor.php?mode=usage`: 데이터 사용량 AJAX
|
|
|
|
## 구성
|
|
|
|
- `api.php`: 차량 상태/제어 API
|
|
- `monitor.php`: 모니터링 화면과 AJAX 응답
|
|
- `common.php`: 외부 secret 로드와 공통 DB/API 함수
|
|
- `collector_se.php`: 상태 수집 CLI/cron
|
|
- `sw.js`: service worker
|
|
- `assets/`: 아이콘과 정적 자산
|
|
|
|
## 데이터/저장소
|
|
|
|
- Car DB tables: 차량 상태, 로그, 차트용 기록
|
|
- 사용량 수집값과 월별 보정 기준
|
|
- `/home/seo/secret/car.php`: TCP, DB, token, 허용 IP 설정
|
|
|
|
## 처리 흐름
|
|
|
|
1. `collector_se.php`가 차량 상태를 수집해 DB에 저장합니다.
|
|
2. `monitor.php`는 상태 AJAX와 사용량 AJAX를 분리해 갱신합니다.
|
|
3. 제어 요청은 token/IP 정책을 검증합니다.
|
|
4. 명령 코드를 허용 목록과 대조합니다.
|
|
5. TCP 게이트웨이로 전송하고 결과와 실패 reason을 반환합니다.
|
|
|
|
## TCP timeout과 사용량 정산
|
|
|
|
차량 명령 성공/실패 판단은 UI 안정성을 위해 `TCP_TOTAL_TIMEOUT` 기본값인 4.95초를 사용합니다. 이 시간 안에 정상 응답이 없으면 API는 기존처럼 실패를 반환하므로 자동화와 UI는 즉시 재시도 여부를 판단할 수 있습니다.
|
|
|
|
단, 실제 모뎀이 4.95초 이후에 늦게 응답할 수 있으므로 사용량 기록은 별도로 정산합니다. 4.95초까지 정상 응답이 없고 송신이 완료된 요청은 `pcntl_fork()`로 자식 프로세스를 만들고, 같은 TCP 소켓을 최대 `TCP_USAGE_SETTLEMENT_TIMEOUT` 기본 60초까지 더 관찰합니다.
|
|
|
|
- 60초 안에 정상 응답이 완성되면 `late_response_after_ui_timeout`으로 송신량과 수신량을 함께 기록합니다.
|
|
- 60초까지 응답이 없으면 `late_total_timeout_60s_sent_only`로 송신 패킷만 사용량에 반영합니다.
|
|
- 60초 안에 일부 데이터만 오고 정상 포맷이 아니면 `late_invalid_or_partial_response`로 실제 수신된 바이트까지 기록합니다.
|
|
- 늦은 정상 응답이 차량 상태 포맷이면 상태 DB에도 저장합니다.
|
|
|
|
이 구조에서 `request_id`는 UI 응답과 늦은 사용량 정산 기록을 연결하는 기준입니다. 즉 명령 재시도 로직은 4.95초 기준을 유지하고, 데이터 사용량은 최대 60초까지 늦은 수신 패킷을 반영합니다.
|
|
|
|
## 주요 함수/모듈
|
|
|
|
- `common.php`: secret 로드와 공통 DB/API 함수
|
|
- `api.php`: 상태 조회와 명령 전송
|
|
- `monitor.php`: 화면 렌더링과 AJAX 응답
|
|
- `collector_se.php`: 상태 수집과 중복 실행 방지
|
|
|
|
## 보안
|
|
|
|
- 차량 API는 API token 또는 허용 IP 정책을 사용합니다.
|
|
- 차량 제어 명령은 허용된 명령 코드로 제한합니다.
|
|
- Secret 파일은 저장소 밖에서 제한된 권한으로 유지합니다.
|
|
- 실제 제어 명령은 최신 상태 조회와 명령 검증 이후에만 전송합니다.
|
|
|
|
## 운영 체크포인트
|
|
|
|
- 차량 TCP 실패 reason과 마지막 수신 지연을 확인합니다.
|
|
- 명령별 rate limit과 감사 로그를 유지합니다.
|
|
- 통신사 기준 데이터 사용량 보정값을 주기적으로 확인합니다.
|
|
- 4.95초 timeout 직후에는 사용량 기록이 즉시 생기지 않을 수 있으며, 최대 60초 뒤 늦은 정산 행이 추가될 수 있습니다.
|