# 코콤 홈넷 서버 듀얼 전송(이중화 전송) 구현 결과 ## 1. 구현 개요 `Kocom_Homenet.INI`의 `[IP]` 섹션에 기존 `IP` 외에 두 번째 서버 IP인 `IP2`를 설정할 수 있도록 확장하고, 프로그램 실행 시 **두 대의 코콤 홈넷 서버로 동시에 동일한 미세먼지 측정 데이터를 전송(Dual Push)**하도록 구현을 완료했습니다. --- ## 2. 변경된 파일 목록 1. **[`Kocom_Homenet.INI`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/EXE/Kocom_Homenet.INI)** (및 프로젝트 루트 INI) - `[IP]` 섹션에 `IP2=` 항목 추가 (미설정 시 기존 단일 서버 모드로 동작). 2. **[`kocomHomenet.dfm`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/kocomHomenet.dfm)** - 두 번째 코콤 홈넷 서버 연결을 위한 독립 비동기 소켓 컴포넌트 `csHome2: TClientSocket` 추가. 3. **[`kocomHomenet.pas`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/kocomHomenet.pas)** - 두 서버에 대한 독립적인 연결(`ConnectServer1`, `ConnectServer2`), 세션 관리(`FIsBound`, `FIsBound2`), 생존 확인(`SendAlivePacket`), 데이터 전송(`addBtnClick`), 자동 재연결 로직 구현. --- ## 3. 핵심 동작 구조 ### A. INI 설정 및 단일/듀얼 모드 자동 감지 ```ini [IP] IP=10.254.254.1 IP2=10.254.254.2 ; 2번째 서버 IP (미사용 시 비워둠) ``` - `IP2`가 비어있거나 `0.0.0.0`이면 기존 단일 서버 모드로 완벽하게 동작합니다. - `IP2`에 유효한 IP가 입력되면 자동으로 듀얼 전송 모드가 활성화됩니다. ### B. 독립적인 소켓 통신 및 장애 격리 - **개별 BIND(로그인)**: 서버1과 서버2가 각각 접속할 때 개별적으로 BIND 패킷(132 바이트)을 전송하고 개별 인증 상태(`FIsBound`, `FIsBound2`)를 관리합니다. - **개별 ALIVE(생존 신호)**: 30초 주기마다 각 서버가 BIND 상태인 경우에만 ALIVE 패킷(64 바이트)을 전송합니다. - **장애 격리 & 백그라운드 자동 복구**: - 한쪽 서버가 다운되거나 네트워크가 끊겨도 정상 연결된 다른 서버로의 데이터 전송은 중단 없이 계속됩니다. - 연결이 끊긴 서버는 데이터 수집 주기 타이머(`tmrUpIntervalTimer`)에서 백그라운드로 자동 재연결을 시도합니다. ### C. 센서 데이터 동시 전송 (Dual Push) - 미세먼지 데이터 수집 시(`readBtnClick` -> `addBtnClick`): - 서버1이 정상 인증 상태(`FIsBound = True`)인 경우 -> 서버1로 ADD 패킷(140 바이트) 전송 - 서버2가 정상 인증 상태(`FIsBound2 = True`)인 경우 -> 서버2로 ADD 패킷(140 바이트) 전송 --- ## 4. 검증 결과 - **설정 파일 파싱**: `IP` 및 `IP2` 키가 정상 로드되며 듀얼 모드 활성화 플래그가 정확히 반영됨. - **예외 격리**: 소켓 에러 이벤트(`csError`, `csHome2Error`) 발생 시 상대 소켓의 타이머나 연결 상태에 간섭 없이 안전하게 격리 처리됨. - **인코딩 및 소스 호환성**: Delphi 10.4 표준 UTF-8(with BOM)으로 구성되어 한글 로그 및 주석이 깨짐 없이 처리됨.