Files
dbserver/opcUaManager
..

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 초기화

createdb opcdb
psql -U postgres -d opcdb -f init_db.sql

2. 백엔드 실행

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         최근 레코드 조회

의존 패키지

OPCFoundation.NetStandard.Opc.Ua.Client  1.5.x
Npgsql                                    8.0.x
Swashbuckle.AspNetCore                   6.6.x