Dust/SOURCE/kocom_Homenet_D10.4/Docs/20260831_0_코콤 홈넷 서버 듀얼 전송(이중화 전송) 구현 계획.txt
2026-09-04 10:15:33 +09:00

95 lines
5.4 KiB
Plaintext

# 코콤 홈넷 서버 듀얼 전송(이중화 전송) 구현 계획
## 개요
현재 프로그램은 `Kocom_Homenet.INI` 파일의 `[IP]` 섹션에 정의된 단일 서버 IP(`IP=10.254.254.1`, 포트 15010)에 접속하여 로그인(BIND), 생존 신호(ALIVE), 미세먼지 센서 데이터(ADD)를 전송하고 있습니다.
동일한 구성의 보조/신규 서버가 추가됨에 따라, 수집된 데이터를 **두 대의 서버에 독립적이고 안정적으로 동시 전송(듀얼 전송)**할 수 있도록 프로그램을 확장하는 구현 계획입니다.
---
## 핵심 요구사항 및 분석
1. **설정 파일 (`Kocom_Homenet.INI`) 확장**:
- 기존 설정과의 하위 호환성을 유지하면서 2번째 서버 IP를 설정할 수 있도록 지원 (`IP` 또는 `IP1`, 그리고 `IP2`).
- `IP2`가 비어있거나 설정되지 않은 경우 기존처럼 단일 서버 모드로 안전하게 동작.
2. **독립적인 소켓 통신 세션 (ClientSocket 분리)**:
- 두 서버의 네트워크 지연, 장애, 재부팅 등이 서로에게 영향을 주지 않도록 각각의 소켓(`cs1`, `cs2_server`)과 상태 변수(`FIsBound1`, `FIsBound2` 등)를 완전 분리.
3. **독립적인 인증 및 생존 주기 관리**:
- 각 서버별로 독립적으로 BIND(로그인) 및 30초 ALIVE 전송 수행.
- 한쪽 서버가 끊어지더라도 정상 연결된 서버로는 데이터 전송이 계속되며, 끊어진 서버는 백그라운드에서 자동 재연결 시도.
4. **센서 데이터(ADD) 동시 전송**:
- DB/MODBUS에서 미세먼지 데이터를 읽어올 때, BIND 완료 상태인 모든 서버(서버1, 서버2)로 동일한 패킷을 전송.
---
## User Review Required
> [!IMPORTANT]
> **1. 서버 접속 정보 (포트 및 계정)**
> - 두 번째 서버도 **동일한 포트(15010)** 및 **동일한 로그인 ID/PW**(`[Login]` 섹션)를 사용하는지 확인이 필요합니다. (다를 경우 INI에 `Port2`, `ID2`, `PW2` 추가 지원 가능)
>
> **2. INI 설정 키 명칭 표준화**
> - 권장안: 하위 호환성을 위해 `IP` (또는 `IP1`)를 1번 서버로 사용하고, `IP2`를 2번 서버로 사용하는 방식입니다.
> ```ini
> [IP]
> IP=10.254.254.1
> IP2=10.254.254.2
> ```
---
## Proposed Changes
### 1. 설정 파일 및 UI/컴포넌트 레이어
#### [MODIFY] [`Kocom_Homenet.INI`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/EXE/Kocom_Homenet.INI)
- `[IP]` 섹션에 `IP2` 항목 추가 예시 명시.
#### [MODIFY] [`kocomHomenet.dfm`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/kocomHomenet.dfm)
- 2번째 홈넷 서버 연결을 위한 `TClientSocket` 컴포넌트 추가 (`csHome2: TClientSocket`).
- (선택) 화면에 두 서버의 접속/인증 상태를 시각적으로 확인할 수 있는 UI 라벨 또는 상태 표시 영역 추가.
---
### 2. 소스 코드 로직 변경
#### [MODIFY] [`kocomHomenet.pas`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/kocomHomenet.pas)
1. **상태 변수 및 프로퍼티 분리**:
- `ServerIP1`, `ServerIP2: string`
- `FIsBound1`, `FIsBound2: boolean`
- `FIsConnecting1`, `FIsConnecting2: boolean`
2. **`LoadINI` 수정**:
- `ServerIP` (또는 `IP1`) 및 `ServerIP2` (`IP2`) 읽기 로직 추가.
- `ServerIP2`가 설정되어 있으면 듀얼 모드 활성화 플래그 설정.
3. **소켓 이벤트 핸들러 분리/통합**:
- `csHome1Connect` / `csHome2Connect`: 각 소켓 연결 시 해당 소켓으로 독립적인 BIND(로그인) 패킷 송신.
- `csHome1Read` / `csHome2Read`: 각 소켓별 BIND ACK, ALIVE ACK, ADD ACK 응답 처리 및 `FIsBound1`/`FIsBound2` 상태 갱신.
- `csHome1Disconnect` / `csHome2Disconnect`, `csHome1Error` / `csHome2Error`: 개별 에러 처리 및 자동 재연결 플래그 초기화.
4. **생존 신호 (`aliveTimerTimer`) 수정**:
- 서버1이 Bound 상태면 서버1로 ALIVE 패킷 전송.
- 서버2가 Bound 상태면 서버2로 ALIVE 패킷 전송.
5. **정기 데이터 전송 (`tmrUpIntervalTimer` / `addBtnClick`) 수정**:
- 주기 타이머(`tmrUpIntervalTimer`)에서 서버1과 서버2 중 연결이 끊어진 소켓이 있다면 개별 재연결 시도.
- `addBtnClick`에서 패킷 생성 후:
- `if cs1.Active and FIsBound1 then cs1.Socket.SendBuf(pk, 140);`
- `if csHome2.Active and FIsBound2 then csHome2.Socket.SendBuf(pk, 140);`
- 로그에 `[서버1 전송]`, `[서버2 전송]` 구분 기록.
---
## Verification Plan
### 1. 설정 로딩 및 비활성화 테스트
- `IP2`가 비어있을 때 기존 1개 서버로만 정상 동작하는지 확인 (하위 호환성).
- `IP2`에 유효한 IP가 설정되었을 때 두 소켓이 모두 정상 초기화되는지 확인.
### 2. 단일 장애 격리 테스트
- 1번 서버가 정상이고 2번 서버가 꺼져 있거나 연결 불가능한 경우:
- 1번 서버로의 미세먼지 데이터 전송이 지연이나 끊김 없이 정상 전송되는지 확인.
- 2번 서버 에러 로그가 적절히 기록되고 1번 통신에 영향을 주지 않는지 확인.
- 2번 서버가 다시 켜졌을 때 백그라운드 자동 재연결 및 BIND가 성공하는지 확인.
### 3. 정상 이중 전송 검증
- 두 서버 모두 연결된 상태에서 타이머 주기에 맞춰 패킷(140 Bytes)이 양쪽 서버로 동시에 송신되고 응답이 정상 수신되는지 로그 확인.