100 lines
3.6 KiB
Markdown
100 lines
3.6 KiB
Markdown
# OPC UA Manager
|
|
|
|
원본 `Program.cs` (단일 파일)를 **ASP.NET Core Web API + 프론트엔드** 프로젝트로 분리한 버전입니다.
|
|
|
|
## 프로젝트 구조
|
|
|
|
```
|
|
OpcUaManager/
|
|
├── OpcUaManager.csproj
|
|
├── Program.cs ← ASP.NET Core 진입점, DI 등록
|
|
├── appsettings.json
|
|
├── init_db.sql ← PostgreSQL 테이블 초기화
|
|
│
|
|
├── Models/
|
|
│ └── Models.cs ← DTO / 도메인 모델 전체
|
|
│
|
|
├── Services/
|
|
│ ├── CertService.cs ← X.509 인증서 생성 (pki/ 폴더 체계 유지)
|
|
│ ├── OpcSessionService.cs ← OPC UA 세션 관리 (Singleton)
|
|
│ ├── OpcCrawlerService.cs ← HoneywellCrawler 로직 → Service 분리
|
|
│ └── DatabaseService.cs ← PostgreSQL 저장/조회 (SaveToDatabase 패턴 유지)
|
|
│
|
|
├── Controllers/
|
|
│ ├── CertController.cs ← POST /api/cert/generate
|
|
│ ├── SessionController.cs ← POST /api/session/connect|disconnect
|
|
│ ├── CrawlerController.cs ← POST /api/crawler/start
|
|
│ └── DatabaseController.cs ← POST /api/database/write|query|test
|
|
│
|
|
└── wwwroot/
|
|
└── index.html ← 프론트엔드 (단일 HTML, 백엔드 API 연결)
|
|
```
|
|
|
|
## 원본 코드와의 대응 관계
|
|
|
|
| 원본 코드 위치 | 분리된 위치 |
|
|
|---|---|
|
|
| `Directory.CreateDirectory("pki/...")` | `CertService.EnsurePkiDirectories()` |
|
|
| `new X509Certificate2(pfxPath, ...)` | `CertService.LoadPfx()` |
|
|
| `ApplicationConfiguration { ... }` | `OpcSessionService.ConnectAsync()` |
|
|
| `DiscoveryClient → Session.Create` | `OpcSessionService.ConnectAsync()` |
|
|
| `HoneywellCrawler.BrowseRecursiveAsync` | `OpcCrawlerService.CrawlAsync()` |
|
|
| `HoneywellCrawler.SaveToCsv` | `OpcCrawlerService.SaveToCsvAsync()` |
|
|
| `SaveToDatabase(tagName, val, status)` | `DatabaseService.SaveToDatabaseAsync()` |
|
|
| `for (int i = 0; i < 5; i++) { ... }` | `DatabaseService.WriteLoopAsync()` |
|
|
|
|
**원본 인증서 체계 유지 항목:**
|
|
- `pki/own/certs/`, `pki/trusted/certs/`, `pki/issuers/certs/`, `pki/rejected/certs/` 폴더 구조
|
|
- `X509KeyStorageFlags.Exportable | MachineKeySet`
|
|
- `AutoAcceptUntrustedCertificates = true`, `AddAppCertToTrustedStore = true`
|
|
- OPC UA SAN(Subject Alternative Name) 에 `ApplicationUri` 포함 (필수 요구사항)
|
|
|
|
## 실행 방법
|
|
|
|
### 1. PostgreSQL 초기화
|
|
```bash
|
|
createdb opcdb
|
|
psql -U postgres -d opcdb -f init_db.sql
|
|
```
|
|
|
|
### 2. 백엔드 실행
|
|
```bash
|
|
cd OpcUaManager
|
|
dotnet restore
|
|
dotnet run
|
|
# → http://localhost:5000
|
|
# → Swagger: http://localhost:5000/swagger
|
|
```
|
|
|
|
### 3. 프론트엔드 접속
|
|
브라우저에서 `http://localhost:5000` 접속
|
|
(또는 `wwwroot/index.html` 을 별도 Live Server로 열고 API URL을 `http://localhost:5000` 으로 설정)
|
|
|
|
## API 엔드포인트 요약
|
|
|
|
```
|
|
POST /api/cert/generate 인증서 생성
|
|
GET /api/cert/list PFX 목록 조회
|
|
GET /api/cert/download/{name} PFX 다운로드
|
|
|
|
POST /api/session/connect OPC 연결
|
|
POST /api/session/disconnect OPC 연결 해제
|
|
GET /api/session/status 세션 상태
|
|
|
|
POST /api/crawler/start 노드 탐사 시작
|
|
GET /api/crawler/csv CSV 다운로드
|
|
|
|
POST /api/database/test DB 연결 테스트
|
|
POST /api/database/init 테이블 초기화
|
|
POST /api/database/write OPC 읽기 + DB 저장 (N회)
|
|
POST /api/database/query 최근 레코드 조회
|
|
```
|
|
|
|
## 의존 패키지
|
|
|
|
```xml
|
|
OPCFoundation.NetStandard.Opc.Ua.Client 1.5.x
|
|
Npgsql 8.0.x
|
|
Swashbuckle.AspNetCore 6.6.x
|
|
```
|