# ExperionCrawler

Honeywell Experion OPC UA 서버를 위한 웹 기반 데이터 수집 도구.

## 아키텍처

```
ExperionCrawler/
└── src/
    ├── Core/
    │   ├── Domain/Entities/          # ExperionTag, ExperionRecord, ExperionServerConfig ...
    │   ├── Application/
    │   │   ├── Interfaces/           # IExperionCertificateService, IExperionOpcClient ...
    │   │   ├── Services/             # ExperionCrawlService
    │   │   └── DTOs/                 # ExperionServerConfigDto, ExperionCrawlRequestDto ...
    │   └── (Domain 은 Infrastructure 에 의존하지 않음)
    │
    ├── Infrastructure/
    │   ├── Certificates/             # ExperionCertificateService (pki/ 폴더 관리)
    │   ├── OpcUa/                    # ExperionOpcClient, ExperionStatusCodeService
    │   ├── Csv/                      # ExperionCsvService (CsvHelper)
    │   └── Database/                 # ExperionDbContext + ExperionDbService (EF Core / SQLite)
    │
    └── Web/
        ├── Controllers/              # ExperionCertificateController, ConnectionController ...
        ├── Program.cs                # DI 등록, 미들웨어
        └── wwwroot/                  # index.html + css/style.css + js/app.js
```

## 기능

| 메뉴 | 설명 |
|------|------|
| 01 인증서 관리 | OPC UA 클라이언트 X.509 인증서 생성 / 상태 확인 |
| 02 서버 접속 테스트 | OPC UA 서버 연결 테스트, 단일 태그 읽기, 노드 탐색 |
| 03 데이터 크롤링 | 복수 노드 주기 수집 → CSV 저장 |
| 04 DB 저장 | CSV 파일 → SQLite DB 임포트, 레코드 조회 |

## Ubuntu 서버 배포

### 사전 요구사항

```bash
# .NET 8 SDK (없으면 deploy.sh 가 자동 설치)
dotnet --version
```

### 한 번에 배포

```bash
git clone <repo> ExperionCrawler
cd ExperionCrawler
sudo bash deploy.sh
```

### 수동 실행 (개발/테스트)

```bash
cd src/Web
dotnet run
# → http://localhost:5000
```

### 서비스 관리

```bash
sudo systemctl status  experioncrawler
sudo systemctl restart experioncrawler
sudo systemctl stop    experioncrawler
sudo journalctl -u experioncrawler -f   # 실시간 로그
```

## PKI 디렉토리 구조 (원본 Program.cs 준수)

```
<실행 위치>/
└── pki/
    ├── own/certs/{clientHostName}.pfx   ← 생성된 클라이언트 인증서
    ├── trusted/certs/                    ← 신뢰 피어 인증서
    ├── issuers/certs/                    ← 신뢰 발급자 (필수 경로)
    └── rejected/certs/                   ← 거부된 인증서
```

## 데이터 저장 위치

```
<실행 위치>/
└── data/
    ├── experion.db      ← SQLite DB
    └── csv/             ← 크롤링 CSV 파일
```

## API 엔드포인트

```
GET  /api/certificate/status?clientHostName=dbsvr
POST /api/certificate/create       { clientHostName, subjectAltNames, pfxPassword }

POST /api/connection/test           { serverHostName, port, clientHostName, userName, password }
POST /api/connection/read           { serverConfig, nodeId }
POST /api/connection/browse         { serverConfig, startNodeId? }

POST /api/crawl/start               { serverConfig, nodeIds[], intervalSeconds, durationSeconds }

GET  /api/database/files
POST /api/database/import           { fileName }
GET  /api/database/records?limit=100&from=&to=
```

Swagger UI: `http://<서버IP>:5000/swagger` (Development 모드)

## 패키지 버전

| 패키지 | 버전 |
|--------|------|
| OPCFoundation.NetStandard.Opc.Ua.Client | 1.5.374.85 |
| OPCFoundation.NetStandard.Opc.Ua.Core   | 1.5.374.85 |
| CsvHelper | 33.0.1 |
| Microsoft.EntityFrameworkCore.Sqlite | 8.0.13 |
| Swashbuckle.AspNetCore | 6.8.1 |
