# 코콤 홈넷 서버 듀얼 전송(이중화 전송) 구현 계획 ## 개요 현재 프로그램은 `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)이 양쪽 서버로 동시에 송신되고 응답이 정상 수신되는지 로그 확인.