47 lines
3.2 KiB
Plaintext
47 lines
3.2 KiB
Plaintext
# 코콤 홈넷 서버 듀얼 전송(이중화 전송) 구현 결과
|
|
|
|
## 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)으로 구성되어 한글 로그 및 주석이 깨짐 없이 처리됨.
|