diff --git a/.Notebook/Configuration 파일 생성.md b/.Notebook/Configuration 파일 생성.md
new file mode 100644
index 0000000..4f8c495
--- /dev/null
+++ b/.Notebook/Configuration 파일 생성.md
@@ -0,0 +1,55 @@
+cat > OpcTestClient.Config.xml << 'EOF'
+
+
+
+ OPC Test Client
+ urn:localhost:OpcTestClient
+ Client_1
+
+
+
+ Directory
+ %CommonApplicationData%/OPC Foundation/pki/own
+ CN=OPC Test Client
+
+
+
+ Directory
+ %CommonApplicationData%/OPC Foundation/pki/trusted
+
+
+
+ Directory
+ %CommonApplicationData%/OPC Foundation/pki/rejected
+
+
+ true
+
+
+
+ 600000
+ 1048576
+ 1048576
+ 65536
+ 4194304
+ 65536
+ 300000
+ 3600000
+
+
+
+ 60000
+ 10000
+
+
+
+ OpcTest.log
+ true
+
+
+EOF
+
+echo "✅ Config file created!"
\ No newline at end of file
diff --git a/.Notebook/ubuntu 서버 기본명령어.md b/.Notebook/ubuntu 서버 기본명령어.md
index 0fe3976..4e2e594 100644
--- a/.Notebook/ubuntu 서버 기본명령어.md
+++ b/.Notebook/ubuntu 서버 기본명령어.md
@@ -1 +1 @@
-셧다운 : sudo shutdown now
\ No newline at end of file
+셧다운 : sudo shutdown now
diff --git a/OpcConnectionTest/OpcConnectionTest.sln b/OpcConnectionTest/OpcConnectionTest.sln
new file mode 100644
index 0000000..daeb19b
--- /dev/null
+++ b/OpcConnectionTest/OpcConnectionTest.sln
@@ -0,0 +1,24 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.5.2.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpcConnectionTest", "OpcConnectionTest.csproj", "{C5537E83-BE41-3CD8-A6DF-DAE381FC5D5C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C5537E83-BE41-3CD8-A6DF-DAE381FC5D5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C5537E83-BE41-3CD8-A6DF-DAE381FC5D5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C5537E83-BE41-3CD8-A6DF-DAE381FC5D5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C5537E83-BE41-3CD8-A6DF-DAE381FC5D5C}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {382A4C92-79E5-4684-B03A-688BC4DC21D3}
+ EndGlobalSection
+EndGlobal
diff --git a/OpcConnectionTest/Program copy.cs.no1 b/OpcConnectionTest/Program copy.cs.no1
new file mode 100644
index 0000000..4f1255c
--- /dev/null
+++ b/OpcConnectionTest/Program copy.cs.no1
@@ -0,0 +1,358 @@
+using Opc.Ua;
+using Opc.Ua.Client;
+using Opc.Ua.Configuration;
+using System.Security.Cryptography.X509Certificates;
+using System.Text.Json;
+
+
+
+
+namespace OpcConnectionTest
+{
+ public class StatusCodeInfo
+ {
+ public string Name { get; set; } = "";
+ public string Hex { get; set; } = "";
+ public ulong Decimal { get; set; }
+ public string Description { get; set; } = "";
+ }
+
+ class Program
+ {
+ [Obsolete]
+
+ static Dictionary _statusCodeMap = new();
+
+ static void LoadStatusCodes()
+ {
+ try
+ {
+ string path = Path.Combine(Directory.GetCurrentDirectory(), "statuscode.json");
+
+ if (!File.Exists(path))
+ {
+ Console.WriteLine("⚠️ statuscode.json 파일을 찾을 수 없습니다.");
+ return;
+ }
+
+ var json = File.ReadAllText(path);
+ var list = JsonSerializer.Deserialize>(json);
+
+ if (list != null)
+ {
+ foreach (var item in list)
+ {
+ _statusCodeMap[(uint)item.Decimal] = item;
+ }
+ }
+
+ Console.WriteLine($"✅ StatusCode { _statusCodeMap.Count }개 로드 완료\n");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"❌ statuscode.json 로드 실패: {ex.Message}");
+ }
+ }
+
+
+ static async Task Main(string[] args)
+ {
+ Console.WriteLine("=== Experion OPC UA Connection Test ===\n");
+ LoadStatusCodes();
+
+
+ // ⚠️ Experion 서버 IP 주소 수정
+ string endpoint = "opc.tcp://192.168.0.20:4840";
+
+ // ⚠️ Honeywell CA로 서명된 클라이언트 인증서 경로 및 비밀번호
+ string pfxPath = Path.Combine(Directory.GetCurrentDirectory(), "pki/own/certs/OpcTestClient.pfx");
+ string pfxPassword = ""; // ⚠️ PFX 비밀번호 (없으면 빈 문자열)
+
+ // ⚠️ Experion Windows 계정 정보
+ string userName = "mngr"; // 예: "DOMAIN\\user" 또는 "localuser"
+ string password = "mngr";
+
+ Console.WriteLine($"Server: {endpoint}");
+ Console.WriteLine($"User: {userName}\n");
+
+ // PFX 파일 존재 여부 확인
+ if (!File.Exists(pfxPath))
+ {
+ Console.WriteLine($"❌ PFX 파일을 찾을 수 없습니다: {pfxPath}");
+ Console.WriteLine("\nPress Enter to exit...");
+ Console.ReadLine();
+ return;
+ }
+
+ // Honeywell CA 서명 인증서 로드
+ // Exportable: OPC UA 채널 서명 시 개인키 접근 필요
+ X509Certificate2 clientCertificate = new X509Certificate2(
+ pfxPath,
+ pfxPassword,
+ X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
+
+ Console.WriteLine($"✅ 인증서 로드: {clientCertificate.Subject}");
+ Console.WriteLine($" 유효기간: {clientCertificate.NotBefore:yyyy-MM-dd} ~ {clientCertificate.NotAfter:yyyy-MM-dd}");
+ Console.WriteLine($" 개인키 포함: {clientCertificate.HasPrivateKey}\n");
+
+ if (!clientCertificate.HasPrivateKey)
+ {
+ Console.WriteLine("❌ 개인키가 없습니다. PFX 파일을 확인하세요.");
+ Console.WriteLine("\nPress Enter to exit...");
+ Console.ReadLine();
+ return;
+ }
+
+ ISession? session = null;
+
+ try
+ {
+ // 1. Configuration 생성
+ var config = new ApplicationConfiguration()
+ {
+ ApplicationName = "OPC Test Client",
+ ApplicationType = ApplicationType.Client,
+ ApplicationUri = "urn:OpcTestClient",
+
+ SecurityConfiguration = new SecurityConfiguration
+ {
+ ApplicationCertificate = new CertificateIdentifier
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/own"),
+ SubjectName = clientCertificate.Subject,
+ // Honeywell CA 서명 인증서를 직접 주입
+ Certificate = clientCertificate
+ },
+
+ TrustedPeerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/trusted")
+ },
+
+ TrustedIssuerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ // ⚠️ Honeywell 내부 CA 인증서를 이 폴더에 배치해야 합니다
+ // Experion Station에서 CA 인증서를 내보내어 pki/issuers/certs/ 에 복사
+ StorePath = Path.GetFullPath("pki/issuers")
+ },
+
+ RejectedCertificateStore = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/rejected")
+ },
+
+ // Honeywell CA 서명 인증서이므로 자동 수락 불필요 — false 권장
+ // 테스트 중 서버 인증서 검증 실패 시 true로 임시 변경 가능
+ AutoAcceptUntrustedCertificates = false,
+ RejectSHA1SignedCertificates = false,
+ AddAppCertToTrustedStore = false
+ },
+
+ TransportConfigurations = new TransportConfigurationCollection(),
+ TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
+ ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
+ };
+
+ // 서버 인증서 검증 실패 시 로그만 출력하는 핸들러
+ // Honeywell CA를 pki/issuers/에 제대로 넣으면 이 핸들러까지 오지 않아야 정상
+ // 불가피한 경우 e.Accept = true; 주석 해제 (운영 환경에서는 사용 금지)
+ config.CertificateValidator.CertificateValidation += (validator, e) =>
+ {
+ Console.WriteLine($" ⚠️ 서버 인증서 검증 이슈: {e.Error.StatusCode} — {e.Certificate.Subject}");
+ // e.Accept = true;
+ };
+
+ await config.ValidateAsync(ApplicationType.Client);
+
+ Console.WriteLine("Step 1: Discovering endpoints...");
+
+ // 2. Endpoint 검색
+ var endpointConfig = EndpointConfiguration.Create(config);
+ endpointConfig.OperationTimeout = 10000;
+
+ var discoveryClient = await DiscoveryClient.CreateAsync(
+ new Uri(endpoint),
+ endpointConfig,
+ config,
+ DiagnosticsMasks.None,
+ CancellationToken.None);
+
+ var endpoints = await discoveryClient.GetEndpointsAsync(null);
+ discoveryClient.Dispose();
+
+ if (endpoints == null || endpoints.Count == 0)
+ {
+ Console.WriteLine("❌ No endpoints found!");
+ return;
+ }
+
+ Console.WriteLine($"✅ Found {endpoints.Count} endpoint(s)");
+ foreach (var ep in endpoints)
+ {
+ Console.WriteLine($" - {ep.EndpointUrl} | Security: {ep.SecurityMode} | Policy: {ep.SecurityPolicyUri?.Split('#').Last()}");
+ }
+
+ // SignAndEncrypt 엔드포인트 우선 선택, 없으면 Sign, 없으면 첫 번째
+ var selectedEndpoint =
+ endpoints.FirstOrDefault(e => e.SecurityMode == MessageSecurityMode.SignAndEncrypt)
+ ?? endpoints.FirstOrDefault(e => e.SecurityMode == MessageSecurityMode.Sign)
+ ?? endpoints[0];
+
+ Console.WriteLine($"\n선택된 엔드포인트: {selectedEndpoint.EndpointUrl} ({selectedEndpoint.SecurityMode})");
+
+ Console.WriteLine("\nStep 2: Creating session...");
+
+ // 3. ConfiguredEndpoint 생성
+ var configuredEndpoint = new ConfiguredEndpoint(
+ null,
+ selectedEndpoint,
+ EndpointConfiguration.Create(config));
+
+ // 4. Session 생성 — UserIdentity에 Windows 계정 사용
+ // Experion R530은 Windows 계정을 OPC UA UserNameIdentityToken으로 인증
+ var userIdentity = new UserIdentity(new UserNameIdentityToken
+ {
+ UserName = userName,
+ DecryptedPassword = System.Text.Encoding.UTF8.GetBytes(password)
+ });
+
+ session = await Session.Create(
+ config,
+ configuredEndpoint,
+ false,
+ "OPC Test Session",
+ 60000,
+ userIdentity,
+ null);
+
+ Console.WriteLine($"✅ Connected!");
+ Console.WriteLine($" Session ID: {session.SessionId}");
+
+ Console.WriteLine("\nStep 3: Reading server info...");
+ await ReadServerInfoAsync(session);
+
+ Console.WriteLine("\nStep 4: Checking redundancy...");
+ await CheckRedundancyAsync(session);
+
+ Console.WriteLine("\nStep 5: Browsing nodes...");
+ await BrowseNodesAsync(session);
+
+ Console.WriteLine("\n✅ All tests completed!");
+ }
+ catch (ServiceResultException sre)
+ {
+ uint code = (uint)sre.StatusCode;
+
+ // Console.WriteLine($"\n❌ OPC UA 오류: {sre.Message}");
+ Console.WriteLine($" StatusCode: 0x{code:X8} ({code})");
+
+ if (_statusCodeMap.TryGetValue(code, out var info))
+ {
+ Console.WriteLine($" Name: {info.Name}");
+ Console.WriteLine($" Description: {info.Description}");
+ }
+ else
+ {
+ Console.WriteLine(" ⚠️ statuscode.json에 정의되지 않은 코드입니다.");
+ }
+ }
+
+
+ finally
+ {
+ if (session != null)
+ {
+ try
+ {
+ Console.WriteLine("\nClosing session...");
+ await session.CloseAsync();
+ session.Dispose();
+ Console.WriteLine("✅ Session closed");
+ }
+ catch { }
+ }
+ }
+
+ Console.WriteLine("\nPress Enter to exit...");
+ Console.ReadLine();
+ }
+
+ static async Task ReadServerInfoAsync(ISession session)
+ {
+ try
+ {
+ var state = await session.ReadValueAsync(
+ new NodeId(Variables.Server_ServerStatus_State));
+ Console.WriteLine($" State: {state.Value}");
+
+ var time = await session.ReadValueAsync(
+ new NodeId(Variables.Server_ServerStatus_CurrentTime));
+ Console.WriteLine($" Time: {time.Value}");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($" Error: {ex.Message}");
+ }
+ }
+
+ static async Task CheckRedundancyAsync(ISession session)
+ {
+ try
+ {
+ var serviceLevel = await session.ReadValueAsync(
+ new NodeId(Variables.Server_ServiceLevel));
+
+ byte level = Convert.ToByte(serviceLevel.Value);
+ Console.WriteLine($" Service Level: {level}");
+
+ if (level >= 200)
+ Console.WriteLine(" ✅ PRIMARY server");
+ else if (level > 0)
+ Console.WriteLine(" ⚠️ SECONDARY server");
+ else
+ Console.WriteLine(" ℹ️ STANDALONE");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($" Error: {ex.Message}");
+ }
+ }
+
+ static async Task BrowseNodesAsync(ISession session)
+ {
+ try
+ {
+ var browser = new Browser(session)
+ {
+ BrowseDirection = BrowseDirection.Forward,
+ ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences,
+ IncludeSubtypes = true,
+ NodeClassMask = (int)(NodeClass.Object | NodeClass.Variable)
+ };
+
+ var references = await browser.BrowseAsync(ObjectIds.ObjectsFolder);
+
+ Console.WriteLine($" Found {references.Count} top-level nodes:");
+
+ int count = 0;
+ foreach (var r in references)
+ {
+ Console.WriteLine($" {r.DisplayName} ({r.NodeClass})");
+ if (++count >= 5)
+ {
+ Console.WriteLine($" ... and {references.Count - 5} more");
+ break;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($" Error: {ex.Message}");
+ }
+ }
+ }
+}
diff --git a/OpcConnectionTest/Program copy.cs.org b/OpcConnectionTest/Program copy.cs.org
new file mode 100644
index 0000000..f875c38
--- /dev/null
+++ b/OpcConnectionTest/Program copy.cs.org
@@ -0,0 +1,253 @@
+using Opc.Ua;
+using Opc.Ua.Client;
+using Opc.Ua.Configuration;
+using System.Security.Cryptography.X509Certificates;
+
+
+
+namespace OpcConnectionTest
+{
+ class Program
+ {
+ [Obsolete]
+ static async Task Main(string[] args)
+ {
+ Console.WriteLine("=== Experion OPC UA Connection Test ===\n");
+
+ // ⚠️ Experion 서버 IP 주소 수정
+ string endpoint = "opc.tcp://192.168.0.20:4840";
+ string pfxPath = Path.Combine(Directory.GetCurrentDirectory(), "pki/own/certs/OpcTestClient.pfx");
+ X509Certificate2 clientCertificate = new X509Certificate2(pfxPath, "");
+
+ Console.WriteLine($"Server: {endpoint}\n");
+
+ ISession? session = null;
+
+ try
+ {
+ // 1. Configuration 생성
+ var config = new ApplicationConfiguration()
+ {
+ ApplicationName = "OPC Test Client",
+ ApplicationType = ApplicationType.Client,
+ ApplicationUri = "urn:OpcTestClient",
+
+ SecurityConfiguration = new SecurityConfiguration
+ {
+ ApplicationCertificate = new CertificateIdentifier
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/own"),
+ SubjectName = "CN=OpcTestClient"
+ },
+
+ TrustedPeerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/trusted")
+ },
+
+ TrustedIssuerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/issuers")
+ },
+
+ RejectedCertificateStore = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/rejected")
+ },
+
+ AutoAcceptUntrustedCertificates = true,
+ RejectSHA1SignedCertificates = false,
+ AddAppCertToTrustedStore = true
+ },
+
+ TransportConfigurations = new TransportConfigurationCollection(),
+ TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
+ ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
+ };
+
+ await config.ValidateAsync(ApplicationType.Client);
+
+ Console.WriteLine("Step 1: Discovering endpoints...");
+
+ // 2. Endpoint 검색
+ var endpointConfig = EndpointConfiguration.Create(config);
+ endpointConfig.OperationTimeout = 10000;
+
+ var discoveryClient = await DiscoveryClient.CreateAsync(
+ new Uri(endpoint),
+ endpointConfig,
+ config,
+ DiagnosticsMasks.None,
+ CancellationToken.None);
+
+ var endpoints = await discoveryClient.GetEndpointsAsync(null);
+ discoveryClient.Dispose();
+
+ if (endpoints == null || endpoints.Count == 0)
+ {
+ Console.WriteLine("❌ No endpoints found!");
+ return;
+ }
+
+ Console.WriteLine($"✅ Found {endpoints.Count} endpoint(s)");
+ foreach (var ep in endpoints)
+ {
+ Console.WriteLine($" - {ep.EndpointUrl} ({ep.SecurityMode})");
+ }
+
+ Console.WriteLine("\nStep 2: Creating session...");
+
+ // 3. ConfiguredEndpoint 생성
+ var selectedEndpoint = endpoints[0];
+ var configuredEndpoint = new ConfiguredEndpoint(
+ null,
+ selectedEndpoint,
+ EndpointConfiguration.Create(config));
+
+ // Session.Create 호출 직전에 추가
+ var cert = await config.SecurityConfiguration.ApplicationCertificate.Find(true);
+ if (cert == null)
+ {
+ Console.WriteLine("❌ [Internal Error] 코드가 인증서 파일을 찾지 못했습니다!");
+ Console.WriteLine($"확인 경로: {Path.GetFullPath(config.SecurityConfiguration.ApplicationCertificate.StorePath)}");
+ return;
+ }
+ else
+ {
+ Console.WriteLine($"✅ 인증서 로드 성공: {cert.Subject}");
+ }
+
+ // 4. Session 생성 (최신 API)
+ session = await Session.Create(
+ config,
+ configuredEndpoint,
+ false,
+ "OPC Test Session",
+ 60000,
+ new UserIdentity(new AnonymousIdentityToken()),
+ null);
+
+ Console.WriteLine($"✅ Connected!");
+ Console.WriteLine($" Session ID: {session.SessionId}");
+
+ Console.WriteLine("\nStep 3: Reading server info...");
+ await ReadServerInfoAsync(session);
+
+ Console.WriteLine("\nStep 4: Checking redundancy...");
+ await CheckRedundancyAsync(session);
+
+ Console.WriteLine("\nStep 5: Browsing nodes...");
+ await BrowseNodesAsync(session);
+
+ Console.WriteLine("\n✅ All tests completed!");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"\n❌ Error: {ex.Message}");
+ Console.WriteLine($"Type: {ex.GetType().Name}");
+
+ if (ex.InnerException != null)
+ {
+ Console.WriteLine($"Inner: {ex.InnerException.Message}");
+ }
+ }
+ finally
+ {
+ if (session != null)
+ {
+ try
+ {
+ Console.WriteLine("\nClosing session...");
+ await session.CloseAsync();
+ session.Dispose();
+ Console.WriteLine("✅ Session closed");
+ }
+ catch { }
+ }
+ }
+
+ Console.WriteLine("\nPress Enter to exit...");
+ Console.ReadLine();
+ }
+
+ static async Task ReadServerInfoAsync(ISession session)
+ {
+ try
+ {
+ // Server State
+ var state = await session.ReadValueAsync(
+ new NodeId(Variables.Server_ServerStatus_State));
+ Console.WriteLine($" State: {state.Value}");
+
+ // Server Time
+ var time = await session.ReadValueAsync(
+ new NodeId(Variables.Server_ServerStatus_CurrentTime));
+ Console.WriteLine($" Time: {time.Value}");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($" Error: {ex.Message}");
+ }
+ }
+
+ static async Task CheckRedundancyAsync(ISession session)
+ {
+ try
+ {
+ var serviceLevel = await session.ReadValueAsync(
+ new NodeId(Variables.Server_ServiceLevel));
+
+ byte level = Convert.ToByte(serviceLevel.Value);
+ Console.WriteLine($" Service Level: {level}");
+
+ if (level >= 200)
+ Console.WriteLine(" ✅ PRIMARY server");
+ else if (level > 0)
+ Console.WriteLine(" ⚠️ SECONDARY server");
+ else
+ Console.WriteLine(" ℹ️ STANDALONE");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($" Error: {ex.Message}");
+ }
+ }
+
+ static async Task BrowseNodesAsync(ISession session)
+ {
+ try
+ {
+ var browser = new Browser(session)
+ {
+ BrowseDirection = BrowseDirection.Forward,
+ ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences,
+ IncludeSubtypes = true,
+ NodeClassMask = (int)(NodeClass.Object | NodeClass.Variable)
+ };
+
+ var references = await browser.BrowseAsync(ObjectIds.ObjectsFolder);
+
+ Console.WriteLine($" Found {references.Count} top-level nodes:");
+
+ int count = 0;
+ foreach (var r in references)
+ {
+ Console.WriteLine($" {r.DisplayName} ({r.NodeClass})");
+ if (++count >= 5)
+ {
+ Console.WriteLine($" ... and {references.Count - 5} more");
+ break;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($" Error: {ex.Message}");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpcConnectionTest/Program copy.csno2 b/OpcConnectionTest/Program copy.csno2
new file mode 100644
index 0000000..abcdf78
--- /dev/null
+++ b/OpcConnectionTest/Program copy.csno2
@@ -0,0 +1,212 @@
+using Opc.Ua;
+using Opc.Ua.Client;
+using Opc.Ua.Configuration;
+using System.Security.Cryptography.X509Certificates;
+using System.Text.Json;
+using System.Text;
+
+namespace OpcConnectionTest
+{
+ public class StatusCodeInfo
+ {
+ public string Name { get; set; } = "";
+ public string Hex { get; set; } = "";
+ public ulong Decimal { get; set; }
+ public string Description { get; set; } = "";
+ }
+
+ class Program
+ {
+ static Dictionary _statusCodeMap = new();
+
+ // statuscode.json 로드 로직
+ static void LoadStatusCodes()
+ {
+ string path = Path.Combine(Directory.GetCurrentDirectory(), "statuscode.json");
+ if (!File.Exists(path))
+ {
+ Console.WriteLine("⚠️ statuscode.json 파일을 찾을 수 없습니다. (에러 분석 기능 제한)");
+ return;
+ }
+
+ try
+ {
+ var json = File.ReadAllText(path);
+ var list = JsonSerializer.Deserialize>(json);
+ if (list != null)
+ foreach (var item in list)
+ _statusCodeMap[(uint)item.Decimal] = item;
+
+ Console.WriteLine($"✅ StatusCode {_statusCodeMap.Count}개 로드 완료\n");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"❌ statuscode.json 로드 실패: {ex.Message}");
+ }
+ }
+
+ static async Task Main(string[] args)
+ {
+ LoadStatusCodes();
+
+ // 1. 설정 정보 (UaExpert 정보 기반)
+ string endpointUrl = "opc.tcp://DESKTOP-8VS6SD2:4840";
+ string pfxPath = Path.Combine(Directory.GetCurrentDirectory(), "pki/own/certs/OpcTestClient.pfx");
+ string pfxPassword = ""; // 저장된 정보 기반 공백 유지
+ string userName = "mngr";
+ string password = "mngr";
+
+ if (!File.Exists(pfxPath))
+ {
+ Console.WriteLine($"❌ PFX 파일 없음: {pfxPath}");
+ return;
+ }
+
+ // 2. 인증서 로드 및 애플리케이션 설정
+ var clientCert = new X509Certificate2(
+ pfxPath,
+ pfxPassword,
+ X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet
+ );
+
+ var config = new ApplicationConfiguration
+ {
+ ApplicationName = "OpcTestClient",
+ ApplicationType = ApplicationType.Client,
+ ApplicationUri = "urn:OpcTestClient",
+ SecurityConfiguration = new SecurityConfiguration
+ {
+ ApplicationCertificate = new CertificateIdentifier { Certificate = clientCert },
+ TrustedPeerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = Path.GetFullPath("pki/trusted") },
+ TrustedIssuerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = Path.GetFullPath("pki/issuers") },
+ RejectedCertificateStore = new CertificateTrustList { StoreType = "Directory", StorePath = Path.GetFullPath("pki/rejected") },
+ AutoAcceptUntrustedCertificates = true,
+ AddAppCertToTrustedStore = true
+ },
+ TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
+ ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
+ };
+
+ config.CertificateValidator.CertificateValidation += (validator, e) =>
+ {
+ if (e.Error != null && e.Error.StatusCode != StatusCodes.Good)
+ {
+ Console.WriteLine($"인증서 보안 경고 무시(Ignore): {e.Error.StatusCode}");
+ e.Accept = true;
+ }
+ };
+
+ await config.ValidateAsync(ApplicationType.Client);
+
+ ISession? session = null;
+
+ try
+ {
+ // 3. 엔드포인트 탐색 및 선택 (UaExpert 보안 정책 반영)
+ Console.WriteLine("Step 1: Discovering endpoints...");
+ using (var discovery = DiscoveryClient.Create(new Uri(endpointUrl), EndpointConfiguration.Create(config)))
+ {
+ var endpoints = discovery.GetEndpoints(null);
+ Console.WriteLine($"✅ {endpoints.Count} 엔드포인트 발견");
+
+ // 가장 높은 보안 수준을 가진 엔드포인트 중 Aes256_Sha256_RsaPss 우선 선택
+ var selected = endpoints.OrderByDescending(e => e.SecurityLevel)
+ .FirstOrDefault(e => e.SecurityPolicyUri.Contains("Basic256Sha256"))
+ ?? endpoints.OrderByDescending(e => e.SecurityLevel).First();
+
+ Console.WriteLine($"👉 선택된 엔드포인트: {selected.SecurityMode} | {selected.SecurityPolicyUri.Split('#').Last()}");
+
+ var configured = new ConfiguredEndpoint(null, selected, EndpointConfiguration.Create(config));
+
+ // 4. 세션 생성 (mngr 계정)
+ Console.WriteLine("\nStep 2: Creating session with user identity...");
+
+ // 패스워드를 byte[]로 요구하는 최신 SDK 방식 적용
+ var identity = new UserIdentity(userName, Encoding.UTF8.GetBytes(password));
+
+ session = await Session.Create(
+ config,
+ configured,
+ false, // updateBeforeConnect
+ "OPC Test Session",
+ 60000,
+ identity,
+ null
+ );
+ }
+
+ Console.WriteLine($"✅ Connected! SessionID: {session.SessionId}");
+
+ // 5. 서버 상태 확인
+ await ReadServerInfoAsync(session);
+
+ // 6. UaExpert에서 확인한 하니웰 실제 태그 데이터 읽기
+ await ReadHoneywellTagAsync(session);
+
+ }
+ catch (ServiceResultException sre)
+ {
+ uint code = (uint)sre.StatusCode;
+ Console.WriteLine($"\n❌ OPC UA 오류: {sre.Message}");
+ Console.WriteLine($" StatusCode: 0x{code:X8}");
+
+ if (_statusCodeMap.TryGetValue(code, out var info))
+ Console.WriteLine($" Name: {info.Name}\n Description: {info.Description}");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"\n❌ 일반 오류 발생: {ex.Message}");
+ }
+ finally
+ {
+ if (session != null)
+ {
+ await session.CloseAsync();
+ session.Dispose();
+ Console.WriteLine("\n✅ Session closed");
+ }
+ }
+
+ Console.WriteLine("\nPress Enter to exit...");
+ Console.ReadLine();
+ }
+
+ // 서버 기본 정보 읽기
+ static async Task ReadServerInfoAsync(ISession session)
+ {
+ var state = await session.ReadValueAsync(Variables.Server_ServerStatus_State);
+ var time = await session.ReadValueAsync(Variables.Server_ServerStatus_CurrentTime);
+ Console.WriteLine($"\n[Server Status]\n - State: {state.Value}\n - Time: {time.Value}");
+ }
+
+ // 🎯 하니웰 특정 태그 읽기 (UaExpert 데이터 기반)
+ static async Task ReadHoneywellTagAsync(ISession session)
+ {
+ string nodeId = "ns=1;s=shinam:p-6102.hzset.fieldvalue";
+ Console.WriteLine($"\nStep 3: Reading Honeywell Tag [{nodeId}]...");
+
+ try
+ {
+ var result = await session.ReadValueAsync(nodeId);
+
+ if (StatusCode.IsGood(result.StatusCode))
+ {
+ Console.WriteLine("========================================");
+ Console.WriteLine($"🟢 TAG VALUE : {result.Value}");
+ Console.WriteLine($"🟡 DATATYPE : {result.WrappedValue.TypeInfo.BuiltInType}");
+ Console.WriteLine($"🔵 TIMESTAMP : {result.SourceTimestamp.ToLocalTime()}");
+ Console.WriteLine($"⚪️ STATUS : {result.StatusCode}");
+ Console.WriteLine("========================================");
+ }
+ else
+ {
+ Console.WriteLine($"❌ 읽기 실패: {result.StatusCode}");
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"❌ 태그 읽기 중 예외 발생: {ex.Message}");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpcConnectionTest/Program.cs b/OpcConnectionTest/Program.cs
index ed51819..aea33bc 100644
--- a/OpcConnectionTest/Program.cs
+++ b/OpcConnectionTest/Program.cs
@@ -1,191 +1,145 @@
-// cd ~/projects/OpcConnectionTest
-
-// 기존 파일 삭제
-// rm Program.cs
-
-// # 새 파일 생성
-//cat > Program.cs << 'EOF'
-
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Security.Cryptography.X509Certificates;
+using System.Text.Json;
using Opc.Ua;
using Opc.Ua.Client;
-using Opc.Ua.Configuration;
namespace OpcConnectionTest
{
+ public class StatusCodeInfo
+ {
+ public string Name { get; set; } = "";
+ public string Hex { get; set; } = "";
+ public ulong Decimal { get; set; }
+ public string Description { get; set; } = "";
+ }
+
class Program
{
+ static Dictionary _statusCodeMap = new(StringComparer.OrdinalIgnoreCase);
+
+ static void LoadStatusCodes()
+ {
+ string path = Path.Combine(Directory.GetCurrentDirectory(), "statuscode.json");
+ if (File.Exists(path))
+ {
+ try {
+ var json = File.ReadAllText(path);
+ var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
+ var list = JsonSerializer.Deserialize>(json, options);
+ if (list != null) {
+ foreach (var item in list) _statusCodeMap[item.Hex] = item;
+ Console.WriteLine($"✅ {_statusCodeMap.Count}개의 에러 코드 정의 로드 완료.");
+ }
+ } catch { }
+ }
+ }
+
static async Task Main(string[] args)
{
- Console.WriteLine("=== Experion OPC UA Connection Test ===\n");
+ LoadStatusCodes();
- // ⚠️ Experion 서버 IP 주소 수정
- string primaryEndpoint = "opc.tcp://192.168.0.20:4840";
- string secondaryEndpoint = "opc.tcp://192.168.1.20:4840";
+ // 1. 핵심 변수 (서버 이름 사칭 방지)
+ string serverHostName = "192.168.0.20"; //DESKTOP-8VS6SD2
+ string clientHostName = "dbsvr";
+ string endpointUrl = $"opc.tcp://{serverHostName}:4840";
+ string applicationUri = $"urn:{clientHostName}:OpcTestClient";
+
+ string pfxPath = Path.Combine(Directory.GetCurrentDirectory(), "pki/own/certs/OpcTestClient.pfx");
+ string pfxPassword = "";
+ string userName = "mngr";
+ string password = "mngr";
- Console.WriteLine($"Primary: {primaryEndpoint}");
- Console.WriteLine($"Secondary: {secondaryEndpoint}\n");
+ // 필수 폴더들 생성 (TrustedIssuer 포함)
+ Directory.CreateDirectory(Path.GetDirectoryName(pfxPath)!);
+ Directory.CreateDirectory("pki/trusted/certs");
+ Directory.CreateDirectory("pki/issuers/certs"); // ← 이 경로가 필요함
+ Directory.CreateDirectory("pki/rejected/certs");
+
+ X509Certificate2? clientCert = null;
+ if (!File.Exists(pfxPath))
+ {
+ var builder = CertificateFactory.CreateCertificate(
+ applicationUri, "OpcTestClient", $"CN=OpcTestClient, O=MyCompany",
+ new List { "localhost", clientHostName, "192.168.0.5", "192.168.0.102" }
+ );
+ clientCert = builder.CreateForRSA();
+ File.WriteAllBytes(pfxPath, clientCert.Export(X509ContentType.Pfx, pfxPassword));
+ Console.WriteLine($"✨ 새 인증서 생성됨: {applicationUri}");
+ }
+ else
+ {
+ clientCert = new X509Certificate2(pfxPath, pfxPassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
+ }
+
+ var config = new ApplicationConfiguration
+ {
+ ApplicationName = "OpcTestClient",
+ ApplicationType = ApplicationType.Client,
+ ApplicationUri = applicationUri,
+ SecurityConfiguration = new SecurityConfiguration
+ {
+ ApplicationCertificate = new CertificateIdentifier { Certificate = clientCert },
+ // ⚠️ 에러 발생했던 지점: 아래 3개 경로가 모두 명시되어야 함
+ TrustedPeerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = Path.GetFullPath("pki/trusted") },
+ TrustedIssuerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = Path.GetFullPath("pki/issuers") },
+ RejectedCertificateStore = new CertificateTrustList { StoreType = "Directory", StorePath = Path.GetFullPath("pki/rejected") },
+ AutoAcceptUntrustedCertificates = true,
+ AddAppCertToTrustedStore = true
+ },
+ TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
+ ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
+ };
+
+ await config.ValidateAsync(ApplicationType.Client);
+ config.CertificateValidator.CertificateValidation += (v, e) => { if (e.Error.StatusCode != StatusCodes.Good) e.Accept = true; };
ISession? session = null;
-
try
{
- var config = new ApplicationConfiguration()
+ Console.WriteLine($"Step 1: Connecting to {endpointUrl}...");
+ var endpointConfig = EndpointConfiguration.Create(config);
+ using (var discovery = await DiscoveryClient.CreateAsync(config, new Uri(endpointUrl), DiagnosticsMasks.All, CancellationToken.None))
{
- ApplicationName = "OPC Test",
- ApplicationType = ApplicationType.Client,
- ApplicationUri = "urn:OpcTest",
- SecurityConfiguration = new SecurityConfiguration
- {
- ApplicationCertificate = new CertificateIdentifier
- {
- StoreType = "Directory",
- StorePath = "OPC Foundation/CertificateStores/MachineDefault"
- },
- AutoAcceptUntrustedCertificates = true,
- RejectSHA1SignedCertificates = false
- },
- TransportConfigurations = new TransportConfigurationCollection(),
- TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
- ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
- };
+ var endpoints = await discovery.GetEndpointsAsync(null);
+ var selected = endpoints.OrderByDescending(e => e.SecurityLevel)
+ .FirstOrDefault(e => e.SecurityPolicyUri.Contains("Basic256Sha256")) ?? endpoints[0];
+
+ Console.WriteLine($"🔍 정책 선택됨: {selected.SecurityPolicyUri}");
+ var endpoint = new ConfiguredEndpoint(null, selected, endpointConfig);
- await config.ValidateAsync(ApplicationType.Client);
-
- Console.WriteLine("Step 1: Discovering endpoints...");
- var endpoints = await DiscoverAsync(config, primaryEndpoint);
-
- if (endpoints.Count == 0)
- {
- Console.WriteLine("❌ No endpoints found!");
- return;
+ Console.WriteLine("Step 2: Creating session...");
+ var identity = new UserIdentity(userName, Encoding.UTF8.GetBytes(password));
+#pragma warning disable CS0618
+ session = await Session.Create(config, endpoint, false, "OpcTestSession", 60000, identity, null);
+#pragma warning restore CS0618
}
-
- Console.WriteLine($"✅ Found {endpoints.Count} endpoint(s)");
-
- Console.WriteLine("\nStep 2: Connecting...");
- session = await ConnectAsync(config, endpoints[0]);
-
- if (session == null)
- {
- Console.WriteLine("❌ Connection failed!");
- return;
- }
-
- Console.WriteLine($"✅ Connected! ID: {session.SessionId}");
-
- Console.WriteLine("\nStep 3: Reading server info...");
- await ReadInfoAsync(session);
-
- Console.WriteLine("\nStep 4: Checking redundancy...");
- await CheckRedundancyAsync(session);
-
- Console.WriteLine("\n✅ Test completed!");
+ Console.WriteLine($"✅ Connected! SessionID: {session.SessionId}");
+ var result = await session.ReadValueAsync("ns=1;s=shinam:p-6102.hzset.fieldvalue");
+ Console.WriteLine($"🟢 TAG VALUE: {result.Value}");
}
catch (Exception ex)
{
- Console.WriteLine($"\n❌ Error: {ex.Message}");
- }
- finally
- {
- if (session != null)
+ if (ex is ServiceResultException sre)
{
- await session.CloseAsync();
- session.Dispose();
+ string hexCode = $"0x{((uint)sre.StatusCode):X8}";
+ Console.WriteLine($"\n❌ OPC UA 서비스 오류: {hexCode}");
+ if (_statusCodeMap.TryGetValue(hexCode, out var info)) {
+ Console.WriteLine($"👉 에러명: {info.Name}");
+ Console.WriteLine($"👉 설 명: {info.Description}");
+ }
}
+ else Console.WriteLine($"❌ 오류: {ex.Message}");
}
-
- Console.WriteLine("\nPress Enter to exit...");
+ finally { if (session != null) { await session.CloseAsync(); session.Dispose(); } }
+ Console.WriteLine("\n엔터를 누르면 종료됩니다...");
Console.ReadLine();
}
-
- static async Task DiscoverAsync(
- ApplicationConfiguration config, string url)
- {
- try
- {
- var epConfig = EndpointConfiguration.Create(config);
- epConfig.OperationTimeout = 10000;
-
- var client = await DiscoveryClient.CreateAsync(
- new Uri(url), epConfig, config,
- DiagnosticsMasks.None, CancellationToken.None);
-
- var eps = await client.GetEndpointsAsync(null);
- client.Dispose();
- return eps;
- }
- catch
- {
- return new EndpointDescriptionCollection();
- }
- }
-
- static async Task ConnectAsync(
- ApplicationConfiguration config, EndpointDescription ep)
- {
- try
- {
- var epConfig = EndpointConfiguration.Create(config);
- var configEp = new ConfiguredEndpoint(null, ep, epConfig);
-
- var channel = SessionChannel.Create(
- config,
- configEp.Description,
- configEp.Configuration,
- X509CertificateValidator.TolerateAll,
- null);
-
- var sess = new Session(channel, config, configEp, null);
-
- await sess.OpenAsync(
- config.ApplicationName, 60000,
- new UserIdentity(new AnonymousIdentityToken()),
- null, CancellationToken.None);
-
- return sess;
- }
- catch
- {
- return null;
- }
- }
-
- static async Task ReadInfoAsync(ISession s)
- {
- try
- {
- var v1 = await s.ReadValueAsync(new NodeId(Variables.Server_ServerStatus_State));
- Console.WriteLine($" State: {v1.Value}");
-
- var v2 = await s.ReadValueAsync(new NodeId(Variables.Server_ServerStatus_CurrentTime));
- Console.WriteLine($" Time: {v2.Value}");
- }
- catch (Exception ex)
- {
- Console.WriteLine($" Failed: {ex.Message}");
- }
- }
-
- static async Task CheckRedundancyAsync(ISession s)
- {
- try
- {
- var v = await s.ReadValueAsync(new NodeId(Variables.Server_ServiceLevel));
- byte level = Convert.ToByte(v.Value);
- Console.WriteLine($" Service Level: {level}");
-
- if (level >= 200)
- Console.WriteLine(" ✅ PRIMARY server");
- else if (level > 0)
- Console.WriteLine(" ⚠️ SECONDARY server");
- else
- Console.WriteLine(" ℹ️ STANDALONE");
- }
- catch (Exception ex)
- {
- Console.WriteLine($" Failed: {ex.Message}");
- }
- }
}
-}
-
+}
\ No newline at end of file
diff --git a/OpcConnectionTest/Program.cs.3wNoError b/OpcConnectionTest/Program.cs.3wNoError
new file mode 100644
index 0000000..2b6d239
--- /dev/null
+++ b/OpcConnectionTest/Program.cs.3wNoError
@@ -0,0 +1,187 @@
+using Opc.Ua;
+using Opc.Ua.Client;
+using Opc.Ua.Configuration;
+using System.Security.Cryptography.X509Certificates;
+using System.Text.Json;
+using System.Text;
+
+namespace OpcConnectionTest
+{
+ public class StatusCodeInfo
+ {
+ public string Name { get; set; } = "";
+ public string Hex { get; set; } = "";
+ public ulong Decimal { get; set; }
+ public string Description { get; set; } = "";
+ }
+
+ class Program
+ {
+ static Dictionary _statusCodeMap = new();
+
+ static void LoadStatusCodes()
+ {
+ string path = Path.Combine(Directory.GetCurrentDirectory(), "statuscode.json");
+ if (!File.Exists(path))
+ {
+ Console.WriteLine("⚠️ statuscode.json 파일을 찾을 수 없습니다.");
+ return;
+ }
+
+ try
+ {
+ var json = File.ReadAllText(path);
+ var list = JsonSerializer.Deserialize>(json);
+ if (list != null)
+ foreach (var item in list)
+ _statusCodeMap[(uint)item.Decimal] = item;
+
+ Console.WriteLine($"✅ StatusCode {_statusCodeMap.Count}개 로드 완료\n");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"❌ statuscode.json 로드 실패: {ex.Message}");
+ }
+ }
+
+ static async Task Main(string[] args)
+ {
+ LoadStatusCodes();
+
+ string endpointUrl = "opc.tcp://192.168.0.20:4840";
+ string pfxPath = Path.Combine(Directory.GetCurrentDirectory(), "pki/own/certs/OpcTestClient.pfx");
+ string pfxPassword = "";
+ string userName = "mngr";
+ string password = "mngr";
+
+ if (!File.Exists(pfxPath))
+ {
+ Console.WriteLine($"❌ PFX 파일 없음: {pfxPath}");
+ return;
+ }
+
+ var clientCert = new X509Certificate2(
+ pfxPath,
+ pfxPassword,
+ X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet
+ );
+
+ if (!clientCert.HasPrivateKey)
+ {
+ Console.WriteLine("❌ 인증서에 개인키 없음");
+ return;
+ }
+
+ var config = new ApplicationConfiguration
+ {
+ ApplicationName = "OPC Test Client",
+ ApplicationType = ApplicationType.Client,
+ SecurityConfiguration = new SecurityConfiguration
+ {
+ ApplicationCertificate = new CertificateIdentifier
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/own"),
+ Certificate = clientCert
+ },
+ TrustedPeerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/trusted")
+ },
+ TrustedIssuerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/issuers")
+ },
+ RejectedCertificateStore = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/rejected")
+ },
+ AutoAcceptUntrustedCertificates = true
+ },
+ TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
+ ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
+ };
+
+ config.CertificateValidator.CertificateValidation += (s, e) =>
+ {
+ Console.WriteLine($"⚠️ 서버 인증서 검증 실패: {e.Error.StatusCode} - {e.Certificate.Subject}");
+ };
+
+ await config.ValidateAsync(ApplicationType.Client);
+
+ ISession? session = null;
+
+ try
+ {
+ Console.WriteLine("Step 1: Discovering endpoints...");
+ var discovery = DiscoveryClient.Create(new Uri(endpointUrl));
+ var endpoints = discovery.GetEndpoints(null);
+
+ Console.WriteLine($"✅ {endpoints.Count} 엔드포인트 발견");
+
+ foreach (var ep in endpoints)
+ Console.WriteLine($" - {ep.EndpointUrl} | {ep.SecurityMode} | {ep.SecurityPolicyUri?.Split('#').Last()}");
+
+ // AES256/SHA256 우선 선택
+ var selected = endpoints.FirstOrDefault(ep =>
+ ep.SecurityMode == MessageSecurityMode.SignAndEncrypt &&
+ ep.SecurityPolicyUri.EndsWith("Basic256Sha256"))
+ ?? endpoints.First();
+
+ Console.WriteLine($"\n선택된 엔드포인트: {selected.EndpointUrl} ({selected.SecurityMode})");
+
+ var configured = new ConfiguredEndpoint(null, selected, EndpointConfiguration.Create(config));
+
+ // ✅ Session.CreateAsync 사용
+ session = await Session.Create(
+ config,
+ configured,
+ false,
+ "OPC Test Session",
+ 60000,
+ new UserIdentity(userName, Encoding.UTF8.GetBytes(password)),
+ null
+ );
+
+ Console.WriteLine($"✅ Connected! SessionID: {session.SessionId}");
+
+ await ReadServerInfoAsync(session);
+ }
+ catch (ServiceResultException sre)
+ {
+ uint code = (uint)sre.StatusCode;
+ Console.WriteLine($"❌ OPC UA 오류: {sre.Message}");
+ Console.WriteLine($" StatusCode: 0x{code:X8}");
+
+ if (_statusCodeMap.TryGetValue(code, out var info))
+ Console.WriteLine($" Name: {info.Name}\n Description: {info.Description}");
+ else
+ Console.WriteLine(" ⚠️ statuscode.json에 정의되지 않은 코드입니다.");
+ }
+ finally
+ {
+ if (session != null)
+ {
+ await session.CloseAsync();
+ session.Dispose();
+ Console.WriteLine("✅ Session closed");
+ }
+ }
+
+ Console.WriteLine("\nPress Enter to exit...");
+ Console.ReadLine();
+ }
+
+ static async Task ReadServerInfoAsync(ISession session)
+ {
+ var state = await session.ReadValueAsync(Variables.Server_ServerStatus_State);
+ var time = await session.ReadValueAsync(Variables.Server_ServerStatus_CurrentTime);
+
+ Console.WriteLine($"Server State: {state.Value}");
+ Console.WriteLine($"Current Time: {time.Value}");
+ }
+ }
+}
diff --git a/OpcConnectionTest/Program.cs.fail1 b/OpcConnectionTest/Program.cs.fail1
new file mode 100644
index 0000000..d4c206e
--- /dev/null
+++ b/OpcConnectionTest/Program.cs.fail1
@@ -0,0 +1,274 @@
+using Opc.Ua;
+using Opc.Ua.Client;
+using Opc.Ua.Configuration;
+using System.Security.Cryptography.X509Certificates;
+
+
+
+namespace OpcConnectionTest
+{
+ class Program
+ {
+ [Obsolete]
+ static async Task Main(string[] args)
+ {
+ Console.WriteLine("=== Experion OPC UA Connection Test ===\n");
+
+ // ⚠️ Experion 서버 IP 주소 수정
+ string endpoint = "opc.tcp://192.168.0.20:4840";
+ string pfxPath = Path.Combine(Directory.GetCurrentDirectory(), "pki/own/certs/OpcTestClient.pfx");
+
+ // PFX 파일 존재 여부 먼저 확인
+ if (!File.Exists(pfxPath))
+ {
+ Console.WriteLine($"❌ PFX 파일을 찾을 수 없습니다: {pfxPath}");
+ Console.WriteLine("\nPress Enter to exit...");
+ Console.ReadLine();
+ return;
+ }
+
+ // PFX를 직접 로드 (Exportable 플래그 필수 — OPC UA 서명에 개인키 접근 필요)
+ X509Certificate2 clientCertificate = new X509Certificate2(
+ pfxPath,
+ "",
+ X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
+
+ Console.WriteLine($"Server: {endpoint}");
+ Console.WriteLine($"Certificate: {clientCertificate.Subject}\n");
+
+ ISession? session = null;
+
+ try
+ {
+ // 1. Configuration 생성
+ var config = new ApplicationConfiguration()
+ {
+ ApplicationName = "OPC Test Client",
+ ApplicationType = ApplicationType.Client,
+ ApplicationUri = "urn:OpcTestClient",
+
+ SecurityConfiguration = new SecurityConfiguration
+ {
+ ApplicationCertificate = new CertificateIdentifier
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/own"),
+ SubjectName = "CN=OpcTestClient",
+ // PFX를 직접 주입 — Directory Store 탐색 없이 이 인증서를 사용
+ Certificate = clientCertificate
+ },
+
+ TrustedPeerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/trusted")
+ },
+
+ TrustedIssuerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/issuers")
+ },
+
+ RejectedCertificateStore = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.GetFullPath("pki/rejected")
+ },
+
+ AutoAcceptUntrustedCertificates = true,
+ RejectSHA1SignedCertificates = false,
+ AddAppCertToTrustedStore = true
+ },
+
+ TransportConfigurations = new TransportConfigurationCollection(),
+ TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
+ ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
+ };
+
+ await config.ValidateAsync(ApplicationType.Client);
+
+ // 인증서 로드 확인 (Find 대신 직접 참조)
+ var cert = config.SecurityConfiguration.ApplicationCertificate.Certificate;
+ if (cert == null)
+ {
+ Console.WriteLine("❌ [Internal Error] 인증서 주입에 실패했습니다!");
+ return;
+ }
+ Console.WriteLine($"✅ 인증서 로드 성공: {cert.Subject}");
+ Console.WriteLine($" 유효기간: {cert.NotBefore:yyyy-MM-dd} ~ {cert.NotAfter:yyyy-MM-dd}");
+ Console.WriteLine($" 개인키 포함: {cert.HasPrivateKey}");
+
+ if (!cert.HasPrivateKey)
+ {
+ Console.WriteLine("❌ 개인키가 없습니다. PFX 파일 또는 KeyStorageFlags를 확인하세요.");
+ return;
+ }
+
+ Console.WriteLine("\nStep 1: Discovering endpoints...");
+
+ // 2. Endpoint 검색
+ var endpointConfig = EndpointConfiguration.Create(config);
+ endpointConfig.OperationTimeout = 10000;
+
+ var discoveryClient = await DiscoveryClient.CreateAsync(
+ new Uri(endpoint),
+ endpointConfig,
+ config,
+ DiagnosticsMasks.None,
+ CancellationToken.None);
+
+ var endpoints = await discoveryClient.GetEndpointsAsync(null);
+ discoveryClient.Dispose();
+
+ if (endpoints == null || endpoints.Count == 0)
+ {
+ Console.WriteLine("❌ No endpoints found!");
+ return;
+ }
+
+ Console.WriteLine($"✅ Found {endpoints.Count} endpoint(s)");
+ foreach (var ep in endpoints)
+ {
+ Console.WriteLine($" - {ep.EndpointUrl} ({ep.SecurityMode})");
+ }
+
+ Console.WriteLine("\nStep 2: Creating session...");
+
+ // 3. ConfiguredEndpoint 생성
+ var selectedEndpoint = endpoints[0];
+ var configuredEndpoint = new ConfiguredEndpoint(
+ null,
+ selectedEndpoint,
+ EndpointConfiguration.Create(config));
+
+ // 4. Session 생성
+ session = await Session.Create(
+ config,
+ configuredEndpoint,
+ false,
+ "OPC Test Session",
+ 60000,
+ new UserIdentity(new AnonymousIdentityToken()),
+ null);
+
+ Console.WriteLine($"✅ Connected!");
+ Console.WriteLine($" Session ID: {session.SessionId}");
+
+ Console.WriteLine("\nStep 3: Reading server info...");
+ await ReadServerInfoAsync(session);
+
+ Console.WriteLine("\nStep 4: Checking redundancy...");
+ await CheckRedundancyAsync(session);
+
+ Console.WriteLine("\nStep 5: Browsing nodes...");
+ await BrowseNodesAsync(session);
+
+ Console.WriteLine("\n✅ All tests completed!");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"\n❌ Error: {ex.Message}");
+ Console.WriteLine($"Type: {ex.GetType().Name}");
+
+ if (ex.InnerException != null)
+ {
+ Console.WriteLine($"Inner: {ex.InnerException.Message}");
+ }
+ }
+ finally
+ {
+ if (session != null)
+ {
+ try
+ {
+ Console.WriteLine("\nClosing session...");
+ await session.CloseAsync();
+ session.Dispose();
+ Console.WriteLine("✅ Session closed");
+ }
+ catch { }
+ }
+ }
+
+ Console.WriteLine("\nPress Enter to exit...");
+ Console.ReadLine();
+ }
+
+ static async Task ReadServerInfoAsync(ISession session)
+ {
+ try
+ {
+ // Server State
+ var state = await session.ReadValueAsync(
+ new NodeId(Variables.Server_ServerStatus_State));
+ Console.WriteLine($" State: {state.Value}");
+
+ // Server Time
+ var time = await session.ReadValueAsync(
+ new NodeId(Variables.Server_ServerStatus_CurrentTime));
+ Console.WriteLine($" Time: {time.Value}");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($" Error: {ex.Message}");
+ }
+ }
+
+ static async Task CheckRedundancyAsync(ISession session)
+ {
+ try
+ {
+ var serviceLevel = await session.ReadValueAsync(
+ new NodeId(Variables.Server_ServiceLevel));
+
+ byte level = Convert.ToByte(serviceLevel.Value);
+ Console.WriteLine($" Service Level: {level}");
+
+ if (level >= 200)
+ Console.WriteLine(" ✅ PRIMARY server");
+ else if (level > 0)
+ Console.WriteLine(" ⚠️ SECONDARY server");
+ else
+ Console.WriteLine(" ℹ️ STANDALONE");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($" Error: {ex.Message}");
+ }
+ }
+
+ static async Task BrowseNodesAsync(ISession session)
+ {
+ try
+ {
+ var browser = new Browser(session)
+ {
+ BrowseDirection = BrowseDirection.Forward,
+ ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences,
+ IncludeSubtypes = true,
+ NodeClassMask = (int)(NodeClass.Object | NodeClass.Variable)
+ };
+
+ var references = await browser.BrowseAsync(ObjectIds.ObjectsFolder);
+
+ Console.WriteLine($" Found {references.Count} top-level nodes:");
+
+ int count = 0;
+ foreach (var r in references)
+ {
+ Console.WriteLine($" {r.DisplayName} ({r.NodeClass})");
+ if (++count >= 5)
+ {
+ Console.WriteLine($" ... and {references.Count - 5} more");
+ break;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($" Error: {ex.Message}");
+ }
+ }
+ }
+}
diff --git a/OpcConnectionTest/Program.cs.problem3 b/OpcConnectionTest/Program.cs.problem3
new file mode 100644
index 0000000..fa38247
--- /dev/null
+++ b/OpcConnectionTest/Program.cs.problem3
@@ -0,0 +1,196 @@
+using Opc.Ua;
+using Opc.Ua.Client;
+using Opc.Ua.Configuration;
+using System.Security.Cryptography.X509Certificates;
+
+namespace OpcConnectionTest
+{
+ class Program
+ {
+ static async Task Main(string[] args)
+ {
+ Console.WriteLine("=== Experion OPC UA Connection Test ===\n");
+
+ // 1. 기본 경로 및 설정 정보
+ string serverUrl = "opc.tcp://192.168.0.20:4840";
+ string basePkiPath = Path.GetFullPath("pki");
+ string pfxPath = Path.Combine(basePkiPath, "own/certs/OpcTestClient.pfx");
+
+ // 필수 폴더 자동 생성 (Issuer/Rejected 저장소 에러 방지)
+ Directory.CreateDirectory(Path.Combine(basePkiPath, "issuers/certs"));
+ Directory.CreateDirectory(Path.Combine(basePkiPath, "rejected/certs"));
+ Directory.CreateDirectory(Path.Combine(basePkiPath, "trusted/certs"));
+
+ Console.WriteLine($"Server: {serverUrl}");
+ Console.WriteLine($"PKI Root: {basePkiPath}\n");
+
+ ISession? session = null;
+
+ try
+ {
+ // 2. Application Configuration 설정
+ var config = new ApplicationConfiguration()
+ {
+ ApplicationName = "OpcTestClient",
+ ApplicationType = ApplicationType.Client,
+ ApplicationUri = "urn:OpcTestClient",
+
+ SecurityConfiguration = new SecurityConfiguration
+ {
+ ApplicationCertificate = new CertificateIdentifier
+ {
+ StoreType = "Directory",
+ StorePath = Path.Combine(basePkiPath, "own"),
+ SubjectName = "CN=OpcTestClient"
+ },
+ TrustedPeerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.Combine(basePkiPath, "trusted")
+ },
+ // 💡 중요: Issuer와 Rejected 경로를 명시해야 에러가 나지 않습니다.
+ TrustedIssuerCertificates = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.Combine(basePkiPath, "issuers")
+ },
+ RejectedCertificateStore = new CertificateTrustList
+ {
+ StoreType = "Directory",
+ StorePath = Path.Combine(basePkiPath, "rejected")
+ },
+ AutoAcceptUntrustedCertificates = true,
+ RejectSHA1SignedCertificates = false,
+ AddAppCertToTrustedStore = true
+ },
+ TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
+ ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
+ };
+
+ // 설정 검증
+ await config.ValidateAsync(ApplicationType.Client);
+
+ // 3. 인증서 수동 주입 (리눅스 PFX 인식 해결)
+ if (File.Exists(pfxPath))
+ {
+ X509Certificate2 clientCertificate = new X509Certificate2(pfxPath, "");
+ config.SecurityConfiguration.ApplicationCertificate.Certificate = clientCertificate;
+ Console.WriteLine($"✅ 인증서 수동 로드 성공: {clientCertificate.Subject}");
+ }
+ else
+ {
+ Console.WriteLine($"❌ PFX 파일을 찾을 수 없습니다! 경로 확인: {pfxPath}");
+ return;
+ }
+
+ // 4. Endpoint 검색
+ Console.WriteLine("\nStep 1: Discovering endpoints...");
+ var endpointConfig = EndpointConfiguration.Create(config);
+
+ using (var discoveryClient = DiscoveryClient.Create(new Uri(serverUrl), endpointConfig))
+ {
+ var endpoints = discoveryClient.GetEndpoints(null);
+
+ if (endpoints == null || endpoints.Count == 0)
+ {
+ Console.WriteLine("❌ No endpoints found!");
+ return;
+ }
+
+ Console.WriteLine($"✅ Found {endpoints.Count} endpoint(s)");
+
+ // 가장 높은 보안 수준의 엔드포인트 선택
+ var selectedEndpoint = endpoints.OrderByDescending(e => e.SecurityLevel).First();
+ Console.WriteLine($"👉 Selected: {selectedEndpoint.SecurityMode} | {selectedEndpoint.SecurityPolicyUri}");
+
+ // 5. Session 생성 (mngr 계정)
+ Console.WriteLine("\nStep 2: Creating session with mngr account...");
+
+ var token = new UserNameIdentityToken
+ {
+ UserName = "mngr",
+ DecryptedPassword = System.Text.Encoding.UTF8.GetBytes("mngr")
+ };
+
+ var userIdentity = new UserIdentity(token);
+ var configuredEndpoint = new ConfiguredEndpoint(null, selectedEndpoint, endpointConfig);
+
+ session = await Session.Create(
+ config,
+ configuredEndpoint,
+ updateBeforeConnect: true,
+ "OPC Test Session",
+ 60000,
+ userIdentity,
+ null);
+ }
+
+ Console.WriteLine($"✅ Connected! Session ID: {session.SessionId}");
+
+ // 6. 데이터 읽기 및 브라우징 테스트
+ Console.WriteLine("\nStep 3: Reading server info...");
+ await ReadServerInfoAsync(session);
+
+ Console.WriteLine("\nStep 4: Checking redundancy...");
+ await CheckRedundancyAsync(session);
+
+ Console.WriteLine("\nStep 5: Browsing nodes...");
+ await BrowseNodesAsync(session);
+
+ Console.WriteLine("\n✅ All tests completed successfully!");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"\n❌ Error: {ex.Message}");
+ if (ex.InnerException != null)
+ Console.WriteLine($" Inner: {ex.InnerException.Message}");
+ }
+ finally
+ {
+ if (session != null)
+ {
+ await session.CloseAsync();
+ Console.WriteLine("\nSession closed.");
+ }
+ }
+
+ Console.WriteLine("\nPress Enter to exit...");
+ Console.ReadLine();
+ }
+
+ // --- 헬퍼 메서드들 ---
+ static async Task ReadServerInfoAsync(ISession session)
+ {
+ var state = await session.ReadValueAsync(new NodeId(Variables.Server_ServerStatus_State));
+ var time = await session.ReadValueAsync(new NodeId(Variables.Server_ServerStatus_CurrentTime));
+ Console.WriteLine($" Server State: {state.Value}");
+ Console.WriteLine($" Server Time: {time.Value}");
+ }
+
+ static async Task CheckRedundancyAsync(ISession session)
+ {
+ var serviceLevel = await session.ReadValueAsync(new NodeId(Variables.Server_ServiceLevel));
+ byte level = Convert.ToByte(serviceLevel.Value);
+ string status = level >= 200 ? "PRIMARY" : (level > 0 ? "SECONDARY" : "STANDALONE");
+ Console.WriteLine($" Service Level: {level} ({status})");
+ }
+
+ static async Task BrowseNodesAsync(ISession session)
+ {
+ var browser = new Browser(session)
+ {
+ BrowseDirection = BrowseDirection.Forward,
+ ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences,
+ IncludeSubtypes = true,
+ NodeClassMask = (int)(NodeClass.Object | NodeClass.Variable)
+ };
+
+ var references = await browser.BrowseAsync(ObjectIds.ObjectsFolder);
+ Console.WriteLine($" Found {references.Count} nodes in Objects folder. Top 5:");
+ foreach (var r in references.Take(5))
+ {
+ Console.WriteLine($" - {r.DisplayName} ({r.NodeClass})");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpcConnectionTest/bin/Debug/net8.0/BitFaster.Caching.dll b/OpcConnectionTest/bin/Debug/net8.0/BitFaster.Caching.dll
new file mode 100755
index 0000000..a2597b7
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/BitFaster.Caching.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll
new file mode 100755
index 0000000..7c48cd8
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.dll b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.dll
new file mode 100755
index 0000000..5524cb1
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Logging.Abstractions.dll b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Logging.Abstractions.dll
new file mode 100755
index 0000000..12bf8a2
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Logging.Abstractions.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Logging.dll b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Logging.dll
new file mode 100755
index 0000000..81a7c3c
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Logging.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Options.dll b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Options.dll
new file mode 100755
index 0000000..fd101a7
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Options.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Primitives.dll b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Primitives.dll
new file mode 100755
index 0000000..b3ded80
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Primitives.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Newtonsoft.Json.dll b/OpcConnectionTest/bin/Debug/net8.0/Newtonsoft.Json.dll
new file mode 100755
index 0000000..5813d8c
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Newtonsoft.Json.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Client.dll b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Client.dll
new file mode 100755
index 0000000..4f58b64
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Client.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Configuration.dll b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Configuration.dll
new file mode 100755
index 0000000..4e0b556
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Configuration.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Core.dll b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Core.dll
new file mode 100755
index 0000000..97ffb77
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Core.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Gds.Client.Common.dll b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Gds.Client.Common.dll
new file mode 100755
index 0000000..e630e15
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Gds.Client.Common.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Gds.Server.Common.dll b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Gds.Server.Common.dll
new file mode 100755
index 0000000..43adac4
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Gds.Server.Common.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Security.Certificates.dll b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Security.Certificates.dll
new file mode 100755
index 0000000..12b9d6b
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Security.Certificates.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Server.dll b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Server.dll
new file mode 100755
index 0000000..5c5a838
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Server.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Types.dll b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Types.dll
new file mode 100755
index 0000000..4dda380
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Types.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest
new file mode 100755
index 0000000..cd59bca
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.deps.json b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.deps.json
new file mode 100644
index 0000000..9e55bcc
--- /dev/null
+++ b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.deps.json
@@ -0,0 +1,442 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "OpcConnectionTest/1.0.0": {
+ "dependencies": {
+ "OPCFoundation.NetStandard.Opc.Ua": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Client": "1.5.378.106"
+ },
+ "runtime": {
+ "OpcConnectionTest.dll": {}
+ }
+ },
+ "BitFaster.Caching/2.5.4": {
+ "runtime": {
+ "lib/net6.0/BitFaster.Caching.dll": {
+ "assemblyVersion": "2.5.4.0",
+ "fileVersion": "2.5.4.0"
+ }
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection/10.0.2": {
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2"
+ },
+ "runtime": {
+ "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions/10.0.2": {
+ "runtime": {
+ "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "Microsoft.Extensions.Logging/10.0.2": {
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "10.0.2",
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.2",
+ "Microsoft.Extensions.Options": "10.0.2"
+ },
+ "runtime": {
+ "lib/net8.0/Microsoft.Extensions.Logging.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions/10.0.2": {
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2",
+ "System.Diagnostics.DiagnosticSource": "10.0.2"
+ },
+ "runtime": {
+ "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "Microsoft.Extensions.Options/10.0.2": {
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2",
+ "Microsoft.Extensions.Primitives": "10.0.2"
+ },
+ "runtime": {
+ "lib/net8.0/Microsoft.Extensions.Options.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "Microsoft.Extensions.Primitives/10.0.2": {
+ "runtime": {
+ "lib/net8.0/Microsoft.Extensions.Primitives.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "Newtonsoft.Json/13.0.4": {
+ "runtime": {
+ "lib/net6.0/Newtonsoft.Json.dll": {
+ "assemblyVersion": "13.0.0.0",
+ "fileVersion": "13.0.4.30916"
+ }
+ }
+ },
+ "OPCFoundation.NetStandard.Opc.Ua/1.5.378.106": {
+ "dependencies": {
+ "OPCFoundation.NetStandard.Opc.Ua.Client": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Configuration": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Core": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Gds.Client.Common": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Gds.Server.Common": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Security.Certificates": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Server": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Types": "1.5.378.106"
+ }
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Client/1.5.378.106": {
+ "dependencies": {
+ "BitFaster.Caching": "2.5.4",
+ "OPCFoundation.NetStandard.Opc.Ua.Configuration": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Core": "1.5.378.106"
+ },
+ "runtime": {
+ "lib/net8.0/Opc.Ua.Client.dll": {
+ "assemblyVersion": "1.5.378.0",
+ "fileVersion": "1.5.378.106"
+ }
+ }
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Configuration/1.5.378.106": {
+ "dependencies": {
+ "OPCFoundation.NetStandard.Opc.Ua.Core": "1.5.378.106"
+ },
+ "runtime": {
+ "lib/net8.0/Opc.Ua.Configuration.dll": {
+ "assemblyVersion": "1.5.378.0",
+ "fileVersion": "1.5.378.106"
+ }
+ }
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Core/1.5.378.106": {
+ "dependencies": {
+ "Microsoft.Extensions.Logging": "10.0.2",
+ "Newtonsoft.Json": "13.0.4",
+ "OPCFoundation.NetStandard.Opc.Ua.Security.Certificates": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Types": "1.5.378.106"
+ },
+ "runtime": {
+ "lib/net8.0/Opc.Ua.Core.dll": {
+ "assemblyVersion": "1.5.378.0",
+ "fileVersion": "1.5.378.106"
+ }
+ }
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Gds.Client.Common/1.5.378.106": {
+ "dependencies": {
+ "OPCFoundation.NetStandard.Opc.Ua.Client": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Core": "1.5.378.106"
+ },
+ "runtime": {
+ "lib/net8.0/Opc.Ua.Gds.Client.Common.dll": {
+ "assemblyVersion": "1.5.378.0",
+ "fileVersion": "1.5.378.106"
+ }
+ }
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Gds.Server.Common/1.5.378.106": {
+ "dependencies": {
+ "OPCFoundation.NetStandard.Opc.Ua.Core": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Security.Certificates": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Server": "1.5.378.106"
+ },
+ "runtime": {
+ "lib/net8.0/Opc.Ua.Gds.Server.Common.dll": {
+ "assemblyVersion": "1.5.378.0",
+ "fileVersion": "1.5.378.106"
+ }
+ }
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Security.Certificates/1.5.378.106": {
+ "dependencies": {
+ "OPCFoundation.NetStandard.Opc.Ua.Types": "1.5.378.106",
+ "System.Collections.Immutable": "10.0.2",
+ "System.Diagnostics.DiagnosticSource": "10.0.2",
+ "System.Formats.Asn1": "10.0.2",
+ "System.Text.Json": "10.0.2"
+ },
+ "runtime": {
+ "lib/net8.0/Opc.Ua.Security.Certificates.dll": {
+ "assemblyVersion": "1.5.378.0",
+ "fileVersion": "1.5.378.106"
+ }
+ }
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Server/1.5.378.106": {
+ "dependencies": {
+ "OPCFoundation.NetStandard.Opc.Ua.Configuration": "1.5.378.106",
+ "OPCFoundation.NetStandard.Opc.Ua.Core": "1.5.378.106"
+ },
+ "runtime": {
+ "lib/net8.0/Opc.Ua.Server.dll": {
+ "assemblyVersion": "1.5.378.0",
+ "fileVersion": "1.5.378.106"
+ }
+ }
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Types/1.5.378.106": {
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.2",
+ "System.Collections.Immutable": "10.0.2"
+ },
+ "runtime": {
+ "lib/net8.0/Opc.Ua.Types.dll": {
+ "assemblyVersion": "1.5.378.0",
+ "fileVersion": "1.5.378.106"
+ }
+ }
+ },
+ "System.Collections.Immutable/10.0.2": {
+ "runtime": {
+ "lib/net8.0/System.Collections.Immutable.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "System.Diagnostics.DiagnosticSource/10.0.2": {
+ "runtime": {
+ "lib/net8.0/System.Diagnostics.DiagnosticSource.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "System.Formats.Asn1/10.0.2": {
+ "runtime": {
+ "lib/net8.0/System.Formats.Asn1.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "System.IO.Pipelines/10.0.2": {
+ "runtime": {
+ "lib/net8.0/System.IO.Pipelines.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "System.Text.Encodings.Web/10.0.2": {
+ "runtime": {
+ "lib/net8.0/System.Text.Encodings.Web.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ },
+ "runtimeTargets": {
+ "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll": {
+ "rid": "browser",
+ "assetType": "runtime",
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ },
+ "System.Text.Json/10.0.2": {
+ "dependencies": {
+ "System.IO.Pipelines": "10.0.2",
+ "System.Text.Encodings.Web": "10.0.2"
+ },
+ "runtime": {
+ "lib/net8.0/System.Text.Json.dll": {
+ "assemblyVersion": "10.0.0.0",
+ "fileVersion": "10.0.225.61305"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "OpcConnectionTest/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "BitFaster.Caching/2.5.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-1QroTY1PVCZOSG9FnkkCrmCKk/+bZCgI/YXq376HnYwUDJ4Ho0EaV4YaA/5v5WYLnwIwIO7RZkdWbg9pxIpueQ==",
+ "path": "bitfaster.caching/2.5.4",
+ "hashPath": "bitfaster.caching.2.5.4.nupkg.sha512"
+ },
+ "Microsoft.Extensions.DependencyInjection/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-J/Zmp6fY93JbaiZ11ckWvcyxMPjD6XVwIHQXBjryTBgn7O6O20HYg9uVLFcZlNfgH78MnreE/7EH+hjfzn7VyA==",
+ "path": "microsoft.extensions.dependencyinjection/10.0.2",
+ "hashPath": "microsoft.extensions.dependencyinjection.10.0.2.nupkg.sha512"
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zOIurr59+kUf9vNcsUkCvKWZv+fPosUZXURZesYkJCvl0EzTc9F7maAO4Cd2WEV7ZJJ0AZrFQvuH6Npph9wdBw==",
+ "path": "microsoft.extensions.dependencyinjection.abstractions/10.0.2",
+ "hashPath": "microsoft.extensions.dependencyinjection.abstractions.10.0.2.nupkg.sha512"
+ },
+ "Microsoft.Extensions.Logging/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-a0EWuBs6D3d7XMGroDXm+WsAi5CVVfjOJvyxurzWnuhBN9CO+1qHKcrKV1JK7H/T4ZtHIoVCOX/YyWM8K87qtw==",
+ "path": "microsoft.extensions.logging/10.0.2",
+ "hashPath": "microsoft.extensions.logging.10.0.2.nupkg.sha512"
+ },
+ "Microsoft.Extensions.Logging.Abstractions/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-RZkez/JjpnO+MZ6efKkSynN6ZztLpw3WbxNzjLCPBd97wWj1S9ZYPWi0nmT4kWBRa6atHsdM1ydGkUr8GudyDQ==",
+ "path": "microsoft.extensions.logging.abstractions/10.0.2",
+ "hashPath": "microsoft.extensions.logging.abstractions.10.0.2.nupkg.sha512"
+ },
+ "Microsoft.Extensions.Options/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-1De2LJjmxdqopI5AYC5dIhoZQ79AR5ayywxNF1rXrXFtKQfbQOV9+n/IsZBa7qWlr0MqoGpW8+OY2v/57udZOA==",
+ "path": "microsoft.extensions.options/10.0.2",
+ "hashPath": "microsoft.extensions.options.10.0.2.nupkg.sha512"
+ },
+ "Microsoft.Extensions.Primitives/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-QmSiO+oLBEooGgB3i0GRXyeYRDHjllqt3k365jwfZlYWhvSHA3UL2NEVV5m8aZa041eIlblo6KMI5txvTMpTwA==",
+ "path": "microsoft.extensions.primitives/10.0.2",
+ "hashPath": "microsoft.extensions.primitives.10.0.2.nupkg.sha512"
+ },
+ "Newtonsoft.Json/13.0.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==",
+ "path": "newtonsoft.json/13.0.4",
+ "hashPath": "newtonsoft.json.13.0.4.nupkg.sha512"
+ },
+ "OPCFoundation.NetStandard.Opc.Ua/1.5.378.106": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-9s7VfRmWRp2W/mrBpCxUe8SCDQCWBPgMsdz9gy3Z19ZCfigukBQj5DoluPz1758lzZpnp/ZJ2eN4mhTNfprwUA==",
+ "path": "opcfoundation.netstandard.opc.ua/1.5.378.106",
+ "hashPath": "opcfoundation.netstandard.opc.ua.1.5.378.106.nupkg.sha512"
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Client/1.5.378.106": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jawIdE5meywuxkwy1pQvyxnVhnjYKmZNYH9vWvRo9FTAUIrvtOMMnpsnS9IVBKJ+h+0U7S5R93uWqAOqhHOjrQ==",
+ "path": "opcfoundation.netstandard.opc.ua.client/1.5.378.106",
+ "hashPath": "opcfoundation.netstandard.opc.ua.client.1.5.378.106.nupkg.sha512"
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Configuration/1.5.378.106": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-XLduk2Y05TC1tND6mJON9g1IcX0B9MsxNPbTHM11jyoOgFFoz+GMqh1EoN0uYFHNGRA/hbSFf87nBB6sqm/6nw==",
+ "path": "opcfoundation.netstandard.opc.ua.configuration/1.5.378.106",
+ "hashPath": "opcfoundation.netstandard.opc.ua.configuration.1.5.378.106.nupkg.sha512"
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Core/1.5.378.106": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bHcrfu60PGJWiU4YI2pn0rOpeZCtThHMRGMC9Wv5bP1Fk2zlxTz/QYOxR2Kj17bXmGlu0lUQA1iZDtDUxA1uXg==",
+ "path": "opcfoundation.netstandard.opc.ua.core/1.5.378.106",
+ "hashPath": "opcfoundation.netstandard.opc.ua.core.1.5.378.106.nupkg.sha512"
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Gds.Client.Common/1.5.378.106": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-O5QD1seSIh6G7wdVbS/FDpVG7T5Ih6zyBDNNFYzA0epfvKeaCOSicVosT+mQXDEqpg4vS6HDCQuJ0q3cB6KC/A==",
+ "path": "opcfoundation.netstandard.opc.ua.gds.client.common/1.5.378.106",
+ "hashPath": "opcfoundation.netstandard.opc.ua.gds.client.common.1.5.378.106.nupkg.sha512"
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Gds.Server.Common/1.5.378.106": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CWPtco6KEGL/Av3tzgdcTv9QSkmeWwnvwuDG1PgEtP6Qpb9hHk2GteC2NA6AVvE4fgiCpZZl7s+ikeH2koeCLw==",
+ "path": "opcfoundation.netstandard.opc.ua.gds.server.common/1.5.378.106",
+ "hashPath": "opcfoundation.netstandard.opc.ua.gds.server.common.1.5.378.106.nupkg.sha512"
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Security.Certificates/1.5.378.106": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vS6x1lRJtBgElpPyBZ0/rPfaw3r4gMK4TJwoGAGw4IhQg1rVzv370tIvgNlnfnbReBLs9W7N8FzDstq117Jagw==",
+ "path": "opcfoundation.netstandard.opc.ua.security.certificates/1.5.378.106",
+ "hashPath": "opcfoundation.netstandard.opc.ua.security.certificates.1.5.378.106.nupkg.sha512"
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Server/1.5.378.106": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-EprIRVCEcUBoxpUiTG26bImbo9meHEp8Cak4VzkPN3xX9UFZwbZh/rnwu1nmBngsH/QhuBS9QSrsjn0udpJLpw==",
+ "path": "opcfoundation.netstandard.opc.ua.server/1.5.378.106",
+ "hashPath": "opcfoundation.netstandard.opc.ua.server.1.5.378.106.nupkg.sha512"
+ },
+ "OPCFoundation.NetStandard.Opc.Ua.Types/1.5.378.106": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-9WPEMvW7zJSGvfN7vwjXqC9bCoF4WVm+SCk6IAvDz5fLZmnbb37o8mTrHfwsSkDNFWhal6Aszzre8AmNQnW9/g==",
+ "path": "opcfoundation.netstandard.opc.ua.types/1.5.378.106",
+ "hashPath": "opcfoundation.netstandard.opc.ua.types.1.5.378.106.nupkg.sha512"
+ },
+ "System.Collections.Immutable/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-ty6kCaqyoh/M/jKV5yojgta+nf7T8zkkjpRI1beLQkrTC+9R6LS1eCEc+3ED2YUlRyA0g0PXExESnxnW3HcVVQ==",
+ "path": "system.collections.immutable/10.0.2",
+ "hashPath": "system.collections.immutable.10.0.2.nupkg.sha512"
+ },
+ "System.Diagnostics.DiagnosticSource/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-lYWBy8fKkJHaRcOuw30d67PrtVjR5754sz5Wl76s8P+vJ9FSThh9b7LIcTSODx1LY7NB3Srvg+JMnzd67qNZOw==",
+ "path": "system.diagnostics.diagnosticsource/10.0.2",
+ "hashPath": "system.diagnostics.diagnosticsource.10.0.2.nupkg.sha512"
+ },
+ "System.Formats.Asn1/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-9Hee6iQ74pDgdRNIL6lO8Vlx2onVWd5aDnqwk4Pvo0h5FklBd7QwcQDKgxeLuhiy0o3ibzUVO0KFQe0/hPXU+Q==",
+ "path": "system.formats.asn1/10.0.2",
+ "hashPath": "system.formats.asn1.10.0.2.nupkg.sha512"
+ },
+ "System.IO.Pipelines/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-EqMsn9r18ABvTDxrDce4OWDhBE3y+rR23ilG7Y3BudDKrDKrLG/hkD/JmeFZbctAPxSkCjyJ/Ddwbn/g7ufRJA==",
+ "path": "system.io.pipelines/10.0.2",
+ "hashPath": "system.io.pipelines.10.0.2.nupkg.sha512"
+ },
+ "System.Text.Encodings.Web/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ro4cLT4qpRy64crfLAy3ekihtXckeXrD5eI6qb6NDSEVyHcHsmH7KgN4dbnIuiBmXIoaCslx4SynLYxag1SLSQ==",
+ "path": "system.text.encodings.web/10.0.2",
+ "hashPath": "system.text.encodings.web.10.0.2.nupkg.sha512"
+ },
+ "System.Text.Json/10.0.2": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zy8ey7I16G9neZ6uzxrnYwS7pidElzN8XarsBjGu7lE2m7afTKMEe18KbY3ZSmh/z/bR40oxjd6hlUcmOEaMHw==",
+ "path": "system.text.json/10.0.2",
+ "hashPath": "system.text.json.10.0.2.nupkg.sha512"
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.dll b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.dll
new file mode 100644
index 0000000..a7e0139
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.pdb b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.pdb
new file mode 100644
index 0000000..3343e23
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.pdb differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.runtimeconfig.json b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.runtimeconfig.json
new file mode 100644
index 0000000..becfaea
--- /dev/null
+++ b/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.runtimeconfig.json
@@ -0,0 +1,12 @@
+{
+ "runtimeOptions": {
+ "tfm": "net8.0",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "8.0.0"
+ },
+ "configProperties": {
+ "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpcConnectionTest/bin/Debug/net8.0/System.Collections.Immutable.dll b/OpcConnectionTest/bin/Debug/net8.0/System.Collections.Immutable.dll
new file mode 100755
index 0000000..b029dd2
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/System.Collections.Immutable.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/System.Diagnostics.DiagnosticSource.dll b/OpcConnectionTest/bin/Debug/net8.0/System.Diagnostics.DiagnosticSource.dll
new file mode 100755
index 0000000..ef5af86
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/System.Diagnostics.DiagnosticSource.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/System.Formats.Asn1.dll b/OpcConnectionTest/bin/Debug/net8.0/System.Formats.Asn1.dll
new file mode 100755
index 0000000..280256c
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/System.Formats.Asn1.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/System.IO.Pipelines.dll b/OpcConnectionTest/bin/Debug/net8.0/System.IO.Pipelines.dll
new file mode 100755
index 0000000..ba5d482
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/System.IO.Pipelines.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/System.Text.Encodings.Web.dll b/OpcConnectionTest/bin/Debug/net8.0/System.Text.Encodings.Web.dll
new file mode 100755
index 0000000..af14793
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/System.Text.Encodings.Web.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/System.Text.Json.dll b/OpcConnectionTest/bin/Debug/net8.0/System.Text.Json.dll
new file mode 100755
index 0000000..64e4277
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/System.Text.Json.dll differ
diff --git a/OpcConnectionTest/bin/Debug/net8.0/runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll b/OpcConnectionTest/bin/Debug/net8.0/runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll
new file mode 100755
index 0000000..216bd5f
Binary files /dev/null and b/OpcConnectionTest/bin/Debug/net8.0/runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll differ
diff --git a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfo.cs b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfo.cs
index e7848fe..aca18c0 100644
--- a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfo.cs
+++ b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfo.cs
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpcConnectionTest")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3181052619700dceeeef81a9a0851130498f177e")]
[assembly: System.Reflection.AssemblyProductAttribute("OpcConnectionTest")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpcConnectionTest")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
diff --git a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfoInputs.cache b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfoInputs.cache
index 808d68e..4a371eb 100644
--- a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfoInputs.cache
+++ b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfoInputs.cache
@@ -1 +1 @@
-934b875e72b64b90c5572e45c51a754c2d824022123ba85dea23cfc05669d35b
+c2e941992237f396c84fee88bc09bdecf79f725598c8300136293f3ac50e6b79
diff --git a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.csproj.CopyComplete b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.csproj.FileListAbsolute.txt b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.csproj.FileListAbsolute.txt
index 06ebdc7..ce5f2d0 100644
--- a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.csproj.FileListAbsolute.txt
+++ b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.csproj.FileListAbsolute.txt
@@ -1,5 +1,39 @@
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.deps.json
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.runtimeconfig.json
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/OpcConnectionTest.pdb
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/BitFaster.Caching.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Logging.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Logging.Abstractions.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Options.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Microsoft.Extensions.Primitives.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Newtonsoft.Json.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Client.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Configuration.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Core.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Gds.Client.Common.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Gds.Server.Common.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Security.Certificates.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Server.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/Opc.Ua.Types.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/System.Collections.Immutable.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/System.Diagnostics.DiagnosticSource.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/System.Formats.Asn1.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/System.IO.Pipelines.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/System.Text.Encodings.Web.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/System.Text.Json.dll
+/home/pacer/projects/OpcConnectionTest/bin/Debug/net8.0/runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll
/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.csproj.AssemblyReference.cache
/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.GeneratedMSBuildEditorConfig.editorconfig
/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfoInputs.cache
/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.AssemblyInfo.cs
/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.csproj.CoreCompileInputs.cache
+/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.csproj.CopyComplete
+/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.dll
+/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/refint/OpcConnectionTest.dll
+/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.pdb
+/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.genruntimeconfig.cache
+/home/pacer/projects/OpcConnectionTest/obj/Debug/net8.0/ref/OpcConnectionTest.dll
diff --git a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.dll b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.dll
new file mode 100644
index 0000000..a7e0139
Binary files /dev/null and b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.dll differ
diff --git a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.genruntimeconfig.cache b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.genruntimeconfig.cache
new file mode 100644
index 0000000..a04706a
--- /dev/null
+++ b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.genruntimeconfig.cache
@@ -0,0 +1 @@
+985ad1f23ff5bf15b24f32d665951935d354064a61d300c10a97a85bb842ecaf
diff --git a/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.pdb b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.pdb
new file mode 100644
index 0000000..3343e23
Binary files /dev/null and b/OpcConnectionTest/obj/Debug/net8.0/OpcConnectionTest.pdb differ
diff --git a/OpcConnectionTest/obj/Debug/net8.0/apphost b/OpcConnectionTest/obj/Debug/net8.0/apphost
new file mode 100755
index 0000000..cd59bca
Binary files /dev/null and b/OpcConnectionTest/obj/Debug/net8.0/apphost differ
diff --git a/OpcConnectionTest/obj/Debug/net8.0/ref/OpcConnectionTest.dll b/OpcConnectionTest/obj/Debug/net8.0/ref/OpcConnectionTest.dll
new file mode 100644
index 0000000..e2176f6
Binary files /dev/null and b/OpcConnectionTest/obj/Debug/net8.0/ref/OpcConnectionTest.dll differ
diff --git a/OpcConnectionTest/obj/Debug/net8.0/refint/OpcConnectionTest.dll b/OpcConnectionTest/obj/Debug/net8.0/refint/OpcConnectionTest.dll
new file mode 100644
index 0000000..e2176f6
Binary files /dev/null and b/OpcConnectionTest/obj/Debug/net8.0/refint/OpcConnectionTest.dll differ
diff --git a/OpcConnectionTest/pki/own/certs/OpcTestClient.pfx b/OpcConnectionTest/pki/own/certs/OpcTestClient.pfx
new file mode 100644
index 0000000..a166ddc
Binary files /dev/null and b/OpcConnectionTest/pki/own/certs/OpcTestClient.pfx differ
diff --git a/OpcConnectionTest/pki/trusted/certs/application_rsa_sha256.der b/OpcConnectionTest/pki/trusted/certs/application_rsa_sha256.der
new file mode 100755
index 0000000..61c6722
Binary files /dev/null and b/OpcConnectionTest/pki/trusted/certs/application_rsa_sha256.der differ
diff --git a/OpcConnectionTest/pki/trusted/certs/rootCA.der b/OpcConnectionTest/pki/trusted/certs/rootCA.der
new file mode 100755
index 0000000..16ffe69
Binary files /dev/null and b/OpcConnectionTest/pki/trusted/certs/rootCA.der differ
diff --git a/OpcConnectionTest/statuscode.json b/OpcConnectionTest/statuscode.json
new file mode 100644
index 0000000..516f4dd
--- /dev/null
+++ b/OpcConnectionTest/statuscode.json
@@ -0,0 +1,1430 @@
+[
+ {
+ "name": "Bad",
+ "hex": "0x80000000",
+ "decimal": 2147483648,
+ "description": "The value is bad but no specific reason is known"
+ },
+ {
+ "name": "BadAggregateConfigurationRejected",
+ "hex": "0x80da0000",
+ "decimal": 2161770496,
+ "description": "The aggregate configuration is not valid for specified node"
+ },
+ {
+ "name": "BadAggregateInvalidInputs",
+ "hex": "0x80d60000",
+ "decimal": 2161508352,
+ "description": "The aggregate value could not be derived due to invalid data inputs"
+ },
+ {
+ "name": "BadAggregateListMismatch",
+ "hex": "0x80d40000",
+ "decimal": 2161377280,
+ "description": "The requested number of Aggregates does not match the requested number of NodeIds"
+ },
+ {
+ "name": "BadAggregateNotSupported",
+ "hex": "0x80d50000",
+ "decimal": 2161442816,
+ "description": "The requested Aggregate is not support by the server"
+ },
+ {
+ "name": "BadAlreadyExists",
+ "hex": "0x81150000",
+ "decimal": 2165637120,
+ "description": "An equivalent rule already exists"
+ },
+ {
+ "name": "BadApplicationSignatureInvalid",
+ "hex": "0x80580000",
+ "decimal": 2153250816,
+ "description": "The signature generated with the client certificate is missing or invalid"
+ },
+ {
+ "name": "BadArgumentsMissing",
+ "hex": "0x80760000",
+ "decimal": 2155216896,
+ "description": "The client did not specify all of the input arguments for the method"
+ },
+ {
+ "name": "BadAttributeIdInvalid",
+ "hex": "0x80350000",
+ "decimal": 2150957056,
+ "description": "The attribute is not supported for the specified Node"
+ },
+ {
+ "name": "BadBoundNotFound",
+ "hex": "0x80d70000",
+ "decimal": 2161573888,
+ "description": "No data found to provide upper or lower bound value"
+ },
+ {
+ "name": "BadBoundNotSupported",
+ "hex": "0x80d80000",
+ "decimal": 2161639424,
+ "description": "The server cannot retrieve a bound for the variable"
+ },
+ {
+ "name": "BadBrowseDirectionInvalid",
+ "hex": "0x804d0000",
+ "decimal": 2152529920,
+ "description": "The browse direction is not valid"
+ },
+ {
+ "name": "BadBrowseNameDuplicated",
+ "hex": "0x80610000",
+ "decimal": 2153840640,
+ "description": "The browse name is not unique among nodes that share the same relationship with the parent"
+ },
+ {
+ "name": "BadBrowseNameInvalid",
+ "hex": "0x80600000",
+ "decimal": 2153775104,
+ "description": "The browse name is invalid"
+ },
+ {
+ "name": "BadCertificateChainIncomplete",
+ "hex": "0x810d0000",
+ "decimal": 2165112832,
+ "description": "The certificate chain is incomplete"
+ },
+ {
+ "name": "BadCertificateHostNameInvalid",
+ "hex": "0x80160000",
+ "decimal": 2148925440,
+ "description": "The HostName used to connect to a server does not match a HostName in the certificate"
+ },
+ {
+ "name": "BadCertificateInvalid",
+ "hex": "0x80120000",
+ "decimal": 2148663296,
+ "description": "The certificate provided as a parameter is not valid"
+ },
+ {
+ "name": "BadCertificateIssuerRevocationUnknown",
+ "hex": "0x801c0000",
+ "decimal": 2149318656,
+ "description": "It was not possible to determine if the issuer certificate has been revoked"
+ },
+ {
+ "name": "BadCertificateIssuerRevoked",
+ "hex": "0x801e0000",
+ "decimal": 2049,
+ "description": "The issuer certificate has been revoked"
+ },
+ {
+ "name": "BadCertificateIssuerTimeInvalid",
+ "hex": "0x80150000",
+ "decimal": 2148859904,
+ "description": "An issuer certificate has expired or is not yet valid"
+ },
+ {
+ "name": "BadCertificateIssuerUseNotAllowed",
+ "hex": "0x80190000",
+ "decimal": 2149122048,
+ "description": "The issuer certificate may not be used for the requested operation"
+ },
+ {
+ "name": "BadCertificatePolicyCheckFailed",
+ "hex": "0x81140000",
+ "decimal": 2165571584,
+ "description": "The certificate does not meet the requirements of the security policy"
+ },
+ {
+ "name": "BadCertificateRevocationUnknown",
+ "hex": "0x801b0000",
+ "decimal": 2149253120,
+ "description": "It was not possible to determine if the certificate has been revoked"
+ },
+ {
+ "name": "BadCertificateRevoked",
+ "hex": "0x801d0000",
+ "decimal": 2149384192,
+ "description": "The certificate has been revoked"
+ },
+ {
+ "name": "BadCertificateTimeInvalid",
+ "hex": "0x80140000",
+ "decimal": 2148794368,
+ "description": "The certificate has expired or is not yet valid"
+ },
+ {
+ "name": "BadCertificateUntrusted",
+ "hex": "0x801a0000",
+ "decimal": 2149187584,
+ "description": "The certificate is not trusted"
+ },
+ {
+ "name": "BadCertificateUriInvalid",
+ "hex": "0x80170000",
+ "decimal": 2148990976,
+ "description": "The URI specified in the ApplicationDescription does not match the URI in the certificate"
+ },
+ {
+ "name": "BadCertificateUseNotAllowed",
+ "hex": "0x80180000",
+ "decimal": 2149056512,
+ "description": "The certificate may not be used for the requested operation"
+ },
+ {
+ "name": "BadCommunicationError",
+ "hex": "0x80050000",
+ "decimal": 2147811328,
+ "description": "A low level communication error occurred"
+ },
+ {
+ "name": "BadConditionAlreadyDisabled",
+ "hex": "0x80980000",
+ "decimal": 2157445120,
+ "description": "This condition has already been disabled"
+ },
+ {
+ "name": "BadConditionAlreadyEnabled",
+ "hex": "0x80cc0000",
+ "decimal": 2160852992,
+ "description": "This condition has already been enabled"
+ },
+ {
+ "name": "BadConditionAlreadyShelved",
+ "hex": "0x80d10000",
+ "decimal": 2161180672,
+ "description": "The condition has already been shelved"
+ },
+ {
+ "name": "BadConditionBranchAlreadyAcked",
+ "hex": "0x80cf0000",
+ "decimal": 2161049600,
+ "description": "The condition branch has already been acknowledged"
+ },
+ {
+ "name": "BadConditionBranchAlreadyConfirmed",
+ "hex": "0x80d00000",
+ "decimal": 2161115136,
+ "description": "The condition branch has already been confirmed"
+ },
+ {
+ "name": "BadConditionDisabled",
+ "hex": "0x80990000",
+ "decimal": 2157510656,
+ "description": "Property not available, this condition is disabled"
+ },
+ {
+ "name": "BadConditionNotShelved",
+ "hex": "0x80d20000",
+ "decimal": 2161246208,
+ "description": "The condition is not currently shelved"
+ },
+ {
+ "name": "BadConfigurationError",
+ "hex": "0x80890000",
+ "decimal": 2156462080,
+ "description": "There is a problem with the configuration that affects the usefulness of the value"
+ },
+ {
+ "name": "BadConnectionClosed",
+ "hex": "0x80ae0000",
+ "decimal": 2158886912,
+ "description": "The network connection has been closed"
+ },
+ {
+ "name": "BadConnectionRejected",
+ "hex": "0x80ac0000",
+ "decimal": 2158755840,
+ "description": "Could not establish a network connection to remote server"
+ },
+ {
+ "name": "BadContentFilterInvalid",
+ "hex": "0x80480000",
+ "decimal": 2152202240,
+ "description": "The content filter is not valid"
+ },
+ {
+ "name": "BadContinuationPointInvalid",
+ "hex": "0x804a0000",
+ "decimal": 2152333312,
+ "description": "The continuation point provide is longer valid"
+ },
+ {
+ "name": "BadDataEncodingInvalid",
+ "hex": "0x80380000",
+ "decimal": 2151153664,
+ "description": "The data encoding is invalid"
+ },
+ {
+ "name": "BadDataEncodingUnsupported",
+ "hex": "0x80390000",
+ "decimal": 2151219200,
+ "description": "The server does not support the requested data encoding for the node"
+ },
+ {
+ "name": "BadDataLost",
+ "hex": "0x809d0000",
+ "decimal": 2157772800,
+ "description": "Data is missing due to collection started/stopped/lost"
+ },
+ {
+ "name": "BadDataTypeIdUnknown",
+ "hex": "0x80110000",
+ "decimal": 2148597760,
+ "description": "The extension object cannot be (de)serialized because the data type id is not recognized"
+ },
+ {
+ "name": "BadDataUnavailable",
+ "hex": "0x809e0000",
+ "decimal": 2057,
+ "description": "Expected data is unavailable for the requested time range due to an un-mounted volume, an off-line archive or tape, or similar reason for temporary unavailability"
+ },
+ {
+ "name": "BadDeadbandFilterInvalid",
+ "hex": "0x808e0000",
+ "decimal": 2056,
+ "description": "The deadband filter is not valid"
+ },
+ {
+ "name": "BadDecodingError",
+ "hex": "0x80070000",
+ "decimal": 2147942400,
+ "description": "Decoding halted because of invalid data in the stream"
+ },
+ {
+ "name": "BadDependentValueChanged",
+ "hex": "0x80e30000",
+ "decimal": 2162360320,
+ "description": "A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is Bad"
+ },
+ {
+ "name": "BadDeviceFailure",
+ "hex": "0x808b0000",
+ "decimal": 2156593152,
+ "description": "There has been a failure in the device/data source that generates the value that has affected the value"
+ },
+ {
+ "name": "BadDialogNotActive",
+ "hex": "0x80cd0000",
+ "decimal": 2160918528,
+ "description": "The dialog condition is not active"
+ },
+ {
+ "name": "BadDialogResponseInvalid",
+ "hex": "0x80ce0000",
+ "decimal": 2160984064,
+ "description": "The response is not valid for the dialog"
+ },
+ {
+ "name": "BadDisconnect",
+ "hex": "0x80ad0000",
+ "decimal": 2158821376,
+ "description": "The server has disconnected from the client"
+ },
+ {
+ "name": "BadDiscoveryUrlMissing",
+ "hex": "0x80510000",
+ "decimal": 2152792064,
+ "description": "No DiscoveryUrl was specified"
+ },
+ {
+ "name": "BadDominantValueChanged",
+ "hex": "0x80e10000",
+ "decimal": 2162229248,
+ "description": "The related EngineeringUnit has been changed but this change has not been applied to the device. The Variable Value is still dependent on the previous unit but its status is currently Bad"
+ },
+ {
+ "name": "BadDuplicateReferenceNotAllowed",
+ "hex": "0x80660000",
+ "decimal": 2154168320,
+ "description": "The reference type between the nodes is already defined"
+ },
+ {
+ "name": "BadEncodingError",
+ "hex": "0x80060000",
+ "decimal": 2147876864,
+ "description": "Encoding halted because of invalid data in the objects being serialized"
+ },
+ {
+ "name": "BadEncodingLimitsExceeded",
+ "hex": "0x80080000",
+ "decimal": 2148007936,
+ "description": "The message encoding/decoding limits imposed by the stack have been exceeded"
+ },
+ {
+ "name": "BadEndOfStream",
+ "hex": "0x80b00000",
+ "decimal": 2159017984,
+ "description": "Cannot move beyond end of the stream"
+ },
+ {
+ "name": "BadEntryExists",
+ "hex": "0x809f0000",
+ "decimal": 2157903872,
+ "description": "The data or event was not successfully inserted because a matching entry exists"
+ },
+ {
+ "name": "BadEventFilterInvalid",
+ "hex": "0x80470000",
+ "decimal": 2152136704,
+ "description": "The event filter is not valid"
+ },
+ {
+ "name": "BadEventIdUnknown",
+ "hex": "0x809a0000",
+ "decimal": 2157576192,
+ "description": "The specified event id is not recognized"
+ },
+ {
+ "name": "BadEventNotAcknowledgeable",
+ "hex": "0x80bb0000",
+ "decimal": 2159738880,
+ "description": "The event cannot be acknowledged"
+ },
+ {
+ "name": "BadExpectedStreamToBlock",
+ "hex": "0x80b40000",
+ "decimal": 2159280128,
+ "description": "The stream did not return all data requested (possibly because it is a non-blocking stream)"
+ },
+ {
+ "name": "BadFilterElementInvalid",
+ "hex": "0x80c40000",
+ "decimal": 2160328704,
+ "description": "The referenced element is not a valid element in the content filter"
+ },
+ {
+ "name": "BadFilterLiteralInvalid",
+ "hex": "0x80c50000",
+ "decimal": 2160394240,
+ "description": "The referenced literal is not a valid value"
+ },
+ {
+ "name": "BadFilterNotAllowed",
+ "hex": "0x80450000",
+ "decimal": 2152005632,
+ "description": "A monitoring filter cannot be used in combination with the attribute specified"
+ },
+ {
+ "name": "BadFilterOperandCountMismatch",
+ "hex": "0x80c30000",
+ "decimal": 2160263168,
+ "description": "The number of operands provided for the filter operator was less then expected for the operand provided"
+ },
+ {
+ "name": "BadFilterOperandInvalid",
+ "hex": "0x80490000",
+ "decimal": 2152267776,
+ "description": "The operand used in a content filter is not valid"
+ },
+ {
+ "name": "BadFilterOperatorInvalid",
+ "hex": "0x80c10000",
+ "decimal": 2160132096,
+ "description": "An unrecognized operator was provided in a filter"
+ },
+ {
+ "name": "BadFilterOperatorUnsupported",
+ "hex": "0x80c20000",
+ "decimal": 2160197632,
+ "description": "A valid operator was provided, but the server does not provide support for this filter operator"
+ },
+ {
+ "name": "BadHistoryOperationInvalid",
+ "hex": "0x80710000",
+ "decimal": 2154889216,
+ "description": "The history details parameter is not valid"
+ },
+ {
+ "name": "BadHistoryOperationUnsupported",
+ "hex": "0x80720000",
+ "decimal": 2154954752,
+ "description": "The server does not support the requested operation"
+ },
+ {
+ "name": "BadIdentityChangeNotSupported",
+ "hex": "0x80c60000",
+ "decimal": 2160459776,
+ "description": "The server does not support changing the user identity assigned to the session"
+ },
+ {
+ "name": "BadIdentityTokenInvalid",
+ "hex": "0x80200000",
+ "decimal": 2149580800,
+ "description": "The user identity token is not valid"
+ },
+ {
+ "name": "BadIdentityTokenRejected",
+ "hex": "0x80210000",
+ "decimal": 2149646336,
+ "description": "The user identity token is valid but the server has rejected it"
+ },
+ {
+ "name": "BadIndexRangeInvalid",
+ "hex": "0x80360000",
+ "decimal": 2151022592,
+ "description": "The syntax of the index range parameter is invalid"
+ },
+ {
+ "name": "BadIndexRangeNoData",
+ "hex": "0x80370000",
+ "decimal": 2151088128,
+ "description": "No data exists within the range of indexes specified"
+ },
+ {
+ "name": "BadInsufficientClientProfile",
+ "hex": "0x807c0000",
+ "decimal": 2155610112,
+ "description": "The client of the current session does not support one or more Profiles that are necessary for the subscription"
+ },
+ {
+ "name": "BadInternalError",
+ "hex": "0x80020000",
+ "decimal": 2147614720,
+ "description": "An internal error occurred as a result of a programming or configuration error"
+ },
+ {
+ "name": "BadInvalidArgument",
+ "hex": "0x80ab0000",
+ "decimal": 2158690304,
+ "description": "One or more arguments are invalid"
+ },
+ {
+ "name": "BadInvalidSelfReference",
+ "hex": "0x80670000",
+ "decimal": 2154233856,
+ "description": "The server does not allow this type of self reference on this node"
+ },
+ {
+ "name": "BadInvalidState",
+ "hex": "0x80af0000",
+ "decimal": 2158952448,
+ "description": "The operation cannot be completed because the object is closed, uninitialized or in some other invalid state"
+ },
+ {
+ "name": "BadInvalidTimestamp",
+ "hex": "0x80230000",
+ "decimal": 2149777408,
+ "description": "The timestamp is outside the range allowed by the server"
+ },
+ {
+ "name": "BadInvalidTimestampArgument",
+ "hex": "0x80bd0000",
+ "decimal": 2159869952,
+ "description": "The defined timestamp to return was invalid"
+ },
+ {
+ "name": "BadLicenseExpired",
+ "hex": "0x810e0000",
+ "decimal": 2064,
+ "description": "The server requires a license to operate in general or to perform a service or operation, but existing license is expired"
+ },
+ {
+ "name": "BadLicenseLimitsExceeded",
+ "hex": "0x810f0000",
+ "decimal": 2165243904,
+ "description": "The server has limits on number of allowed operations / objects, based on installed licenses, and these limits where exceeded"
+ },
+ {
+ "name": "BadLicenseNotAvailable",
+ "hex": "0x81100000",
+ "decimal": 2165309440,
+ "description": "The server does not have a license which is required to operate in general or to perform a service or operation"
+ },
+ {
+ "name": "BadMaxAgeInvalid",
+ "hex": "0x80700000",
+ "decimal": 2154823680,
+ "description": "The max age parameter is invalid"
+ },
+ {
+ "name": "BadMaxConnectionsReached",
+ "hex": "0x80b70000",
+ "decimal": 2159476736,
+ "description": "The operation could not be finished because all available connections are in use"
+ },
+ {
+ "name": "BadMessageNotAvailable",
+ "hex": "0x807b0000",
+ "decimal": 2155544576,
+ "description": "The requested notification message is no longer available"
+ },
+ {
+ "name": "BadMethodInvalid",
+ "hex": "0x80750000",
+ "decimal": 2155151360,
+ "description": "The method id does not refer to a method for the specified object"
+ },
+ {
+ "name": "BadMonitoredItemFilterInvalid",
+ "hex": "0x80430000",
+ "decimal": 2151874560,
+ "description": "The monitored item filter parameter is not valid"
+ },
+ {
+ "name": "BadMonitoredItemFilterUnsupported",
+ "hex": "0x80440000",
+ "decimal": 2151940096,
+ "description": "The server does not support the requested monitored item filter"
+ },
+ {
+ "name": "BadMonitoredItemIdInvalid",
+ "hex": "0x80420000",
+ "decimal": 2151809024,
+ "description": "The monitoring item id does not refer to a valid monitored item"
+ },
+ {
+ "name": "BadMonitoringModeInvalid",
+ "hex": "0x80410000",
+ "decimal": 2151743488,
+ "description": "The monitoring mode is invalid"
+ },
+ {
+ "name": "BadNoCommunication",
+ "hex": "0x80310000",
+ "decimal": 2150694912,
+ "description": "Communication with the data source is defined, but not established, and there is no last known value available"
+ },
+ {
+ "name": "BadNoContinuationPoints",
+ "hex": "0x804b0000",
+ "decimal": 2152398848,
+ "description": "The operation could not be processed because all continuation points have been allocated"
+ },
+ {
+ "name": "BadNoData",
+ "hex": "0x809b0000",
+ "decimal": 2157641728,
+ "description": "No data exists for the requested time range or event filter"
+ },
+ {
+ "name": "BadNoDataAvailable",
+ "hex": "0x80b10000",
+ "decimal": 2159083520,
+ "description": "No data is currently available for reading from a non-blocking stream"
+ },
+ {
+ "name": "BadNodeAttributesInvalid",
+ "hex": "0x80620000",
+ "decimal": 2153906176,
+ "description": "The node attributes are not valid for the node class"
+ },
+ {
+ "name": "BadNodeClassInvalid",
+ "hex": "0x805f0000",
+ "decimal": 2153709568,
+ "description": "The node class is not valid"
+ },
+ {
+ "name": "BadNodeIdExists",
+ "hex": "0x805e0000",
+ "decimal": 2053,
+ "description": "The requested node id is already used by another node"
+ },
+ {
+ "name": "BadNodeIdInvalid",
+ "hex": "0x80330000",
+ "decimal": 2150825984,
+ "description": "The syntax of the node id is not valid"
+ },
+ {
+ "name": "BadNodeIdRejected",
+ "hex": "0x805d0000",
+ "decimal": 2153578496,
+ "description": "The requested node id was reject because it was either invalid or server does not allow node ids to be specified by the client"
+ },
+ {
+ "name": "BadNodeIdUnknown",
+ "hex": "0x80340000",
+ "decimal": 2150891520,
+ "description": "The node id refers to a node that does not exist in the server address space"
+ },
+ {
+ "name": "BadNodeNotInView",
+ "hex": "0x804e0000",
+ "decimal": 2052,
+ "description": "The node is not part of the view"
+ },
+ {
+ "name": "BadNoDeleteRights",
+ "hex": "0x80690000",
+ "decimal": 2154364928,
+ "description": "The server will not allow the node to be deleted"
+ },
+ {
+ "name": "BadNoEntryExists",
+ "hex": "0x80a00000",
+ "decimal": 2157969408,
+ "description": "The data or event was not successfully updated because no matching entry exists"
+ },
+ {
+ "name": "BadNoMatch",
+ "hex": "0x806f0000",
+ "decimal": 2154758144,
+ "description": "The requested operation has no match to return"
+ },
+ {
+ "name": "BadNonceInvalid",
+ "hex": "0x80240000",
+ "decimal": 2149842944,
+ "description": "The nonce does appear to be not a random value or it is not the correct length"
+ },
+ {
+ "name": "BadNoSubscription",
+ "hex": "0x80790000",
+ "decimal": 2155413504,
+ "description": "There is no subscription available for this session"
+ },
+ {
+ "name": "BadNotConnected",
+ "hex": "0x808a0000",
+ "decimal": 2156527616,
+ "description": "The variable should receive its value from another variable, but has never been configured to do so"
+ },
+ {
+ "name": "BadNotExecutable",
+ "hex": "0x81110000",
+ "decimal": 2165374976,
+ "description": "The executable attribute does not allow the execution of the method"
+ },
+ {
+ "name": "BadNotFound",
+ "hex": "0x803e0000",
+ "decimal": 2051,
+ "description": "A requested item was not found or a search operation ended without success"
+ },
+ {
+ "name": "BadNotImplemented",
+ "hex": "0x80400000",
+ "decimal": 2151677952,
+ "description": "Requested operation is not implemented"
+ },
+ {
+ "name": "BadNotReadable",
+ "hex": "0x803a0000",
+ "decimal": 2151284736,
+ "description": "The access level does not allow reading or subscribing to the Node"
+ },
+ {
+ "name": "BadNotSupported",
+ "hex": "0x803d0000",
+ "decimal": 2151481344,
+ "description": "The requested operation is not supported"
+ },
+ {
+ "name": "BadNotTypeDefinition",
+ "hex": "0x80c80000",
+ "decimal": 2160590848,
+ "description": "The provided Nodeid was not a type definition nodeid"
+ },
+ {
+ "name": "BadNotWritable",
+ "hex": "0x803b0000",
+ "decimal": 2151350272,
+ "description": "The access level does not allow writing to the Node"
+ },
+ {
+ "name": "BadNothingToDo",
+ "hex": "0x800f0000",
+ "decimal": 2148466688,
+ "description": "There was nothing to do because the client passed a list of operations with no elements"
+ },
+ {
+ "name": "BadNoValidCertificates",
+ "hex": "0x80590000",
+ "decimal": 2153316352,
+ "description": "The client did not provide at least one software certificate that is valid and meets the profile requirements for the server"
+ },
+ {
+ "name": "BadNumericOverflow",
+ "hex": "0x81120000",
+ "decimal": 2165440512,
+ "description": "The number was not accepted because of a numeric overflow"
+ },
+ {
+ "name": "BadObjectDeleted",
+ "hex": "0x803f0000",
+ "decimal": 2151612416,
+ "description": "The object cannot be used because it has been deleted"
+ },
+ {
+ "name": "BadOperationAbandoned",
+ "hex": "0x80b30000",
+ "decimal": 2159214592,
+ "description": "The asynchronous operation was abandoned by the caller"
+ },
+ {
+ "name": "BadOutOfMemory",
+ "hex": "0x80030000",
+ "decimal": 2147680256,
+ "description": "Not enough memory to complete the operation"
+ },
+ {
+ "name": "BadOutOfRange",
+ "hex": "0x803c0000",
+ "decimal": 2151415808,
+ "description": "The value was out of range"
+ },
+ {
+ "name": "BadOutOfService",
+ "hex": "0x808d0000",
+ "decimal": 2156724224,
+ "description": "The source of the data is not operational"
+ },
+ {
+ "name": "BadParentNodeIdInvalid",
+ "hex": "0x805b0000",
+ "decimal": 2153447424,
+ "description": "The parent node id does not to refer to a valid node"
+ },
+ {
+ "name": "BadProtocolVersionUnsupported",
+ "hex": "0x80be0000",
+ "decimal": 2159935488,
+ "description": "The applications do not have compatible protocol versions"
+ },
+ {
+ "name": "BadQueryTooComplex",
+ "hex": "0x806e0000",
+ "decimal": 2054,
+ "description": "The requested operation requires too many resources in the server"
+ },
+ {
+ "name": "BadReferenceLocalOnly",
+ "hex": "0x80680000",
+ "decimal": 2154299392,
+ "description": "The reference type is not valid for a reference to a remote server"
+ },
+ {
+ "name": "BadReferenceNotAllowed",
+ "hex": "0x805c0000",
+ "decimal": 2153512960,
+ "description": "The reference could not be created because it violates constraints imposed by the data model"
+ },
+ {
+ "name": "BadReferenceTypeIdInvalid",
+ "hex": "0x804c0000",
+ "decimal": 2152464384,
+ "description": "The reference type id does not refer to a valid reference type node"
+ },
+ {
+ "name": "BadRefreshInProgress",
+ "hex": "0x80970000",
+ "decimal": 2157379584,
+ "description": "This Condition refresh failed, a Condition refresh operation is already in progress"
+ },
+ {
+ "name": "BadRequestCancelledByClient",
+ "hex": "0x802c0000",
+ "decimal": 2150367232,
+ "description": "The request was cancelled by the client"
+ },
+ {
+ "name": "BadRequestCancelledByRequest",
+ "hex": "0x805a0000",
+ "decimal": 2153381888,
+ "description": "The request was cancelled by the client with the Cancel service"
+ },
+ {
+ "name": "BadRequestHeaderInvalid",
+ "hex": "0x802a0000",
+ "decimal": 2150236160,
+ "description": "The header for the request is missing or invalid"
+ },
+ {
+ "name": "BadRequestInterrupted",
+ "hex": "0x80840000",
+ "decimal": 2156134400,
+ "description": "The request could not be sent because of a network interruption"
+ },
+ {
+ "name": "BadRequestNotAllowed",
+ "hex": "0x80e40000",
+ "decimal": 2162425856,
+ "description": "The request was rejected by the server because it did not meet the criteria set by the server"
+ },
+ {
+ "name": "BadRequestNotComplete",
+ "hex": "0x81130000",
+ "decimal": 2165506048,
+ "description": "The request has not been processed by the server yet"
+ },
+ {
+ "name": "BadRequestTimeout",
+ "hex": "0x80850000",
+ "decimal": 2156199936,
+ "description": "Timeout occurred while processing the request"
+ },
+ {
+ "name": "BadRequestTooLarge",
+ "hex": "0x80b80000",
+ "decimal": 2159542272,
+ "description": "The request message size exceeds limits set by the server"
+ },
+ {
+ "name": "BadRequestTypeInvalid",
+ "hex": "0x80530000",
+ "decimal": 2152923136,
+ "description": "The security token request type is not valid"
+ },
+ {
+ "name": "BadResourceUnavailable",
+ "hex": "0x80040000",
+ "decimal": 2147745792,
+ "description": "An operating system resource is not available"
+ },
+ {
+ "name": "BadResponseTooLarge",
+ "hex": "0x80b90000",
+ "decimal": 2159607808,
+ "description": "The response message size exceeds limits set by the client"
+ },
+ {
+ "name": "BadSecureChannelClosed",
+ "hex": "0x80860000",
+ "decimal": 2156265472,
+ "description": "The secure channel has been closed"
+ },
+ {
+ "name": "BadSecureChannelIdInvalid",
+ "hex": "0x80220000",
+ "decimal": 2149711872,
+ "description": "The specified secure channel is no longer valid"
+ },
+ {
+ "name": "BadSecureChannelTokenUnknown",
+ "hex": "0x80870000",
+ "decimal": 2156331008,
+ "description": "The token has expired or is not recognized"
+ },
+ {
+ "name": "BadSecurityChecksFailed",
+ "hex": "0x80130000",
+ "decimal": 2148728832,
+ "description": "An error occurred verifying security"
+ },
+ {
+ "name": "BadSecurityModeInsufficient",
+ "hex": "0x80e60000",
+ "decimal": 2162556928,
+ "description": "The operation is not permitted over the current secure channel"
+ },
+ {
+ "name": "BadSecurityModeRejected",
+ "hex": "0x80540000",
+ "decimal": 2152988672,
+ "description": "The security mode does not meet the requirements set by the server"
+ },
+ {
+ "name": "BadSecurityPolicyRejected",
+ "hex": "0x80550000",
+ "decimal": 2153054208,
+ "description": "The security policy does not meet the requirements set by the server"
+ },
+ {
+ "name": "BadSempahoreFileMissing",
+ "hex": "0x80520000",
+ "decimal": 2152857600,
+ "description": "The semaphore file specified by the client is not valid"
+ },
+ {
+ "name": "BadSensorFailure",
+ "hex": "0x808c0000",
+ "decimal": 2156658688,
+ "description": "There has been a failure in the sensor from which the value is derived by the device/data source"
+ },
+ {
+ "name": "BadSequenceNumberInvalid",
+ "hex": "0x80880000",
+ "decimal": 2156396544,
+ "description": "The sequence number is not valid"
+ },
+ {
+ "name": "BadSequenceNumberUnknown",
+ "hex": "0x807a0000",
+ "decimal": 2155479040,
+ "description": "The sequence number is unknown to the server"
+ },
+ {
+ "name": "BadServerHalted",
+ "hex": "0x800e0000",
+ "decimal": 2048,
+ "description": "The server has stopped and cannot process any requests"
+ },
+ {
+ "name": "BadServerIndexInvalid",
+ "hex": "0x806a0000",
+ "decimal": 2154430464,
+ "description": "The server index is not valid"
+ },
+ {
+ "name": "BadServerNameMissing",
+ "hex": "0x80500000",
+ "decimal": 2152726528,
+ "description": "No ServerName was specified"
+ },
+ {
+ "name": "BadServerNotConnected",
+ "hex": "0x800d0000",
+ "decimal": 2148335616,
+ "description": "The operation could not complete because the client is not connected to the server"
+ },
+ {
+ "name": "BadServerUriInvalid",
+ "hex": "0x804f0000",
+ "decimal": 2152660992,
+ "description": "The ServerUri is not a valid URI"
+ },
+ {
+ "name": "BadServiceUnsupported",
+ "hex": "0x800b0000",
+ "decimal": 2148204544,
+ "description": "The server does not support the requested service"
+ },
+ {
+ "name": "BadSessionClosed",
+ "hex": "0x80260000",
+ "decimal": 2149974016,
+ "description": "The session was closed by the client"
+ },
+ {
+ "name": "BadSessionIdInvalid",
+ "hex": "0x80250000",
+ "decimal": 2149908480,
+ "description": "The session id is not valid"
+ },
+ {
+ "name": "BadSessionNotActivated",
+ "hex": "0x80270000",
+ "decimal": 2150039552,
+ "description": "The session cannot be used because ActivateSession has not been called"
+ },
+ {
+ "name": "BadShelvingTimeOutOfRange",
+ "hex": "0x80d30000",
+ "decimal": 2161311744,
+ "description": "The shelving time not within an acceptable range"
+ },
+ {
+ "name": "BadShutdown",
+ "hex": "0x800c0000",
+ "decimal": 2148270080,
+ "description": "The operation was cancelled because the application is shutting down"
+ },
+ {
+ "name": "BadSourceNodeIdInvalid",
+ "hex": "0x80640000",
+ "decimal": 2154037248,
+ "description": "The source node id does not reference a valid node"
+ },
+ {
+ "name": "BadStateNotActive",
+ "hex": "0x80bf0000",
+ "decimal": 2160001024,
+ "description": "The sub-state machine is not currently active"
+ },
+ {
+ "name": "BadStructureMissing",
+ "hex": "0x80460000",
+ "decimal": 2152071168,
+ "description": "A mandatory structured parameter was missing or null"
+ },
+ {
+ "name": "BadSubscriptionIdInvalid",
+ "hex": "0x80280000",
+ "decimal": 2150105088,
+ "description": "The subscription id is not valid"
+ },
+ {
+ "name": "BadSyntaxError",
+ "hex": "0x80b60000",
+ "decimal": 2159411200,
+ "description": "A value had an invalid syntax"
+ },
+ {
+ "name": "BadTargetNodeIdInvalid",
+ "hex": "0x80650000",
+ "decimal": 2154102784,
+ "description": "The target node id does not reference a valid node"
+ },
+ {
+ "name": "BadTcpEndpointUrlInvalid",
+ "hex": "0x80830000",
+ "decimal": 2156068864,
+ "description": "The server does not recognize the QueryString specified"
+ },
+ {
+ "name": "BadTcpInternalError",
+ "hex": "0x80820000",
+ "decimal": 2156003328,
+ "description": "An internal error occurred"
+ },
+ {
+ "name": "BadTcpMessageTooLarge",
+ "hex": "0x80800000",
+ "decimal": 2155872256,
+ "description": "The size of the message specified in the header is too large"
+ },
+ {
+ "name": "BadTcpMessageTypeInvalid",
+ "hex": "0x807e0000",
+ "decimal": 2055,
+ "description": "The type of the message specified in the header invalid"
+ },
+ {
+ "name": "BadTcpNotEnoughResources",
+ "hex": "0x80810000",
+ "decimal": 2155937792,
+ "description": "There are not enough resources to process the request"
+ },
+ {
+ "name": "BadTcpSecureChannelUnknown",
+ "hex": "0x807f0000",
+ "decimal": 2155806720,
+ "description": "The SecureChannelId and/or TokenId are not currently in use"
+ },
+ {
+ "name": "BadTcpServerTooBusy",
+ "hex": "0x807d0000",
+ "decimal": 2155675648,
+ "description": "The server cannot process the request because it is too busy"
+ },
+ {
+ "name": "BadTimeout",
+ "hex": "0x800a0000",
+ "decimal": 2148139008,
+ "description": "The operation timed out"
+ },
+ {
+ "name": "BadTimestampNotSupported",
+ "hex": "0x80a10000",
+ "decimal": 2158034944,
+ "description": "The client requested history using a timestamp format the server does not support (i.e requested ServerTimestamp when server only supports SourceTimestamp)"
+ },
+ {
+ "name": "BadTimestampsToReturnInvalid",
+ "hex": "0x802b0000",
+ "decimal": 2150301696,
+ "description": "The timestamps to return parameter is invalid"
+ },
+ {
+ "name": "BadTooManyArguments",
+ "hex": "0x80e50000",
+ "decimal": 2162491392,
+ "description": "Too many arguments were provided"
+ },
+ {
+ "name": "BadTooManyMatches",
+ "hex": "0x806d0000",
+ "decimal": 2154627072,
+ "description": "The requested operation has too many matches to return"
+ },
+ {
+ "name": "BadTooManyMonitoredItems",
+ "hex": "0x80db0000",
+ "decimal": 2161836032,
+ "description": "The request could not be processed because there are too many monitored items in the subscription"
+ },
+ {
+ "name": "BadTooManyOperations",
+ "hex": "0x80100000",
+ "decimal": 2148532224,
+ "description": "The request could not be processed because it specified too many operations"
+ },
+ {
+ "name": "BadTooManyPublishRequests",
+ "hex": "0x80780000",
+ "decimal": 2155347968,
+ "description": "The server has reached the maximum number of queued publish requests"
+ },
+ {
+ "name": "BadTooManySessions",
+ "hex": "0x80560000",
+ "decimal": 2153119744,
+ "description": "The server has reached its maximum number of sessions"
+ },
+ {
+ "name": "BadTooManySubscriptions",
+ "hex": "0x80770000",
+ "decimal": 2155282432,
+ "description": "The server has reached its maximum number of subscriptions"
+ },
+ {
+ "name": "BadTypeDefinitionInvalid",
+ "hex": "0x80630000",
+ "decimal": 2153971712,
+ "description": "The type definition node id does not reference an appropriate type node"
+ },
+ {
+ "name": "BadTypeMismatch",
+ "hex": "0x80740000",
+ "decimal": 2155085824,
+ "description": "The value supplied for the attribute is not of the same type as the attribute's value"
+ },
+ {
+ "name": "BadUnexpectedError",
+ "hex": "0x80010000",
+ "decimal": 2147549184,
+ "description": "An unexpected error occurred"
+ },
+ {
+ "name": "BadUnknownResponse",
+ "hex": "0x80090000",
+ "decimal": 2148073472,
+ "description": "An unrecognized response was received from the server"
+ },
+ {
+ "name": "BadUserAccessDenied",
+ "hex": "0x801f0000",
+ "decimal": 2149515264,
+ "description": "User does not have permission to perform the requested operation"
+ },
+ {
+ "name": "BadUserSignatureInvalid",
+ "hex": "0x80570000",
+ "decimal": 2153185280,
+ "description": "The user token signature is missing or invalid"
+ },
+ {
+ "name": "BadViewIdUnknown",
+ "hex": "0x806b0000",
+ "decimal": 2154496000,
+ "description": "The view id does not refer to a valid view node"
+ },
+ {
+ "name": "BadViewParameterMismatch",
+ "hex": "0x80ca0000",
+ "decimal": 2160721920,
+ "description": "The view parameters are not consistent with each other"
+ },
+ {
+ "name": "BadViewTimestampInvalid",
+ "hex": "0x80c90000",
+ "decimal": 2160656384,
+ "description": "The view timestamp is not available or not supported"
+ },
+ {
+ "name": "BadViewVersionInvalid",
+ "hex": "0x80cb0000",
+ "decimal": 2160787456,
+ "description": "The view version is not available or not supported"
+ },
+ {
+ "name": "BadWaitingForInitialData",
+ "hex": "0x80320000",
+ "decimal": 2150760448,
+ "description": "Waiting for the server to obtain values from the underlying data source"
+ },
+ {
+ "name": "BadWaitingForResponse",
+ "hex": "0x80b20000",
+ "decimal": 2159149056,
+ "description": "The asynchronous operation is waiting for a response"
+ },
+ {
+ "name": "BadWouldBlock",
+ "hex": "0x80b50000",
+ "decimal": 2159345664,
+ "description": "Non blocking behaviour is required and the operation would block"
+ },
+ {
+ "name": "BadWriteNotSupported",
+ "hex": "0x80730000",
+ "decimal": 2155020288,
+ "description": "The server does not support writing the combination of value, status and timestamps provided"
+ },
+ {
+ "name": "Good",
+ "hex": "0x00000000",
+ "decimal": 0,
+ "description": "No Error"
+ },
+ {
+ "name": "GoodCallAgain",
+ "hex": "0xa90000",
+ "decimal": 11075584,
+ "description": "The operation is not finished and needs to be called again"
+ },
+ {
+ "name": "GoodClamped",
+ "hex": "0x300000",
+ "decimal": 3145728,
+ "description": "The value written was accepted but was clamped"
+ },
+ {
+ "name": "GoodCommunicationEvent",
+ "hex": "0xa70000",
+ "decimal": 10944512,
+ "description": "The communication layer has raised an event"
+ },
+ {
+ "name": "GoodCompletesAsynchronously",
+ "hex": "0x2e0000",
+ "decimal": 2,
+ "description": "The processing will complete asynchronously"
+ },
+ {
+ "name": "GoodDataIgnored",
+ "hex": "0xd90000",
+ "decimal": 14221312,
+ "description": "The request specifies fields which are not valid for the EventType or cannot be saved by the historian"
+ },
+ {
+ "name": "GoodDependentValueChanged",
+ "hex": "0xe00000",
+ "decimal": 14680064,
+ "description": "A dependent value has been changed but the change has not been applied to the device"
+ },
+ {
+ "name": "GoodEdited",
+ "hex": "0xdc0000",
+ "decimal": 14417920,
+ "description": "The value does not come from the real source and has been edited by the server"
+ },
+ {
+ "name": "GoodEntryInserted",
+ "hex": "0xa20000",
+ "decimal": 10616832,
+ "description": "The data or event was successfully inserted into the historical database"
+ },
+ {
+ "name": "GoodEntryReplaced",
+ "hex": "0xa30000",
+ "decimal": 10682368,
+ "description": "The data or event field was successfully replaced in the historical database"
+ },
+ {
+ "name": "GoodLocalOverride",
+ "hex": "0x960000",
+ "decimal": 9830400,
+ "description": "The value has been overridden"
+ },
+ {
+ "name": "GoodMoreData",
+ "hex": "0xa60000",
+ "decimal": 10878976,
+ "description": "The data or event field was successfully replaced in the historical database"
+ },
+ {
+ "name": "GoodNoData",
+ "hex": "0xa50000",
+ "decimal": 10813440,
+ "description": "No data exists for the requested time range or event filter"
+ },
+ {
+ "name": "GoodNonCriticalTimeout",
+ "hex": "0xaa0000",
+ "decimal": 11141120,
+ "description": "A non-critical timeout occurred"
+ },
+ {
+ "name": "GoodOverload",
+ "hex": "0x2f0000",
+ "decimal": 3080192,
+ "description": "Sampling has slowed down due to resource limitations"
+ },
+ {
+ "name": "GoodPostActionFailed",
+ "hex": "0xdd0000",
+ "decimal": 14483456,
+ "description": "There was an error in execution of these post-actions"
+ },
+ {
+ "name": "GoodResultsMayBeIncomplete",
+ "hex": "0xba0000",
+ "decimal": 12189696,
+ "description": "The server should have followed a reference to a node in a remote server but did not. The result set may be incomplete"
+ },
+ {
+ "name": "GoodShutdownEvent",
+ "hex": "0xa80000",
+ "decimal": 11010048,
+ "description": "The system is shutting down"
+ },
+ {
+ "name": "GoodSubscriptionTransferred",
+ "hex": "0x2d0000",
+ "decimal": 2949120,
+ "description": "The subscription was transferred to another session"
+ },
+ {
+ "name": "Uncertain",
+ "hex": "0x40000000",
+ "decimal": 1073741824,
+ "description": "The value is uncertain but no specific reason is known"
+ },
+ {
+ "name": "UncertainDataSubNormal",
+ "hex": "0x40a40000",
+ "decimal": 1084489728,
+ "description": "The value is derived from multiple values and has less than the required number of Good values"
+ },
+ {
+ "name": "UncertainDependentValueChanged",
+ "hex": "0x40e20000",
+ "decimal": 1088552960,
+ "description": "A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is uncertain"
+ },
+ {
+ "name": "UncertainDominantValueChanged",
+ "hex": "0x40de0000",
+ "decimal": 1088290816,
+ "description": "The related EngineeringUnit has been changed but the Variable Value is still provided based on the previous unit"
+ },
+ {
+ "name": "UncertainEngineeringUnitsExceeded",
+ "hex": "0x40940000",
+ "decimal": 1083441152,
+ "description": "The value is outside of the range of values defined for this parameter"
+ },
+ {
+ "name": "UncertainInitialValue",
+ "hex": "0x40920000",
+ "decimal": 1083310080,
+ "description": "The value is an initial value for a variable that normally receives its value from another variable"
+ },
+ {
+ "name": "UncertainLastUsableValue",
+ "hex": "0x40900000",
+ "decimal": 1083179008,
+ "description": "Whatever was updating this value has stopped doing so"
+ },
+ {
+ "name": "UncertainNoCommunicationLastUsableValue",
+ "hex": "0x408f0000",
+ "decimal": 1083113472,
+ "description": "Communication to the data source has failed. The variable value is the last value that had a good quality"
+ },
+ {
+ "name": "UncertainNotAllNodesAvailable",
+ "hex": "0x40c00000",
+ "decimal": 1086324736,
+ "description": "The list of references may not be complete because the underlying system is not available"
+ },
+ {
+ "name": "UncertainReferenceNotDeleted",
+ "hex": "0x40bc0000",
+ "decimal": 1086062592,
+ "description": "The server was not able to delete all target references"
+ },
+ {
+ "name": "UncertainReferenceOutOfServer",
+ "hex": "0x406c0000",
+ "decimal": 1080819712,
+ "description": "One of the references to follow in the relative path references to a node in the address space in another server"
+ },
+ {
+ "name": "UncertainSensorNotAccurate",
+ "hex": "0x40930000",
+ "decimal": 1083375616,
+ "description": "The value is at one of the sensor limits"
+ },
+ {
+ "name": "UncertainSubNormal",
+ "hex": "0x40950000",
+ "decimal": 1083506688,
+ "description": "The value is derived from multiple sources and has less than the required number of Good sources"
+ },
+ {
+ "name": "UncertainSubstituteValue",
+ "hex": "0x40910000",
+ "decimal": 1083244544,
+ "description": "The value is an operational value that was manually overwritten"
+ }
+]
\ No newline at end of file
diff --git a/OpcUaMinimal/OpcUaMinimal.sln b/OpcUaMinimal/OpcUaMinimal.sln
new file mode 100644
index 0000000..ad90a37
--- /dev/null
+++ b/OpcUaMinimal/OpcUaMinimal.sln
@@ -0,0 +1,30 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.5.2.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpcUaMinimal", "OpcUaMinimal.csproj", "{0C38AAFC-1916-357A-13AE-47F9174B60F1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestService", "TestService\TestService.csproj", "{17DA166F-4680-60B2-477D-380118444B5C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0C38AAFC-1916-357A-13AE-47F9174B60F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0C38AAFC-1916-357A-13AE-47F9174B60F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0C38AAFC-1916-357A-13AE-47F9174B60F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0C38AAFC-1916-357A-13AE-47F9174B60F1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {17DA166F-4680-60B2-477D-380118444B5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {17DA166F-4680-60B2-477D-380118444B5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {17DA166F-4680-60B2-477D-380118444B5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {17DA166F-4680-60B2-477D-380118444B5C}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {996D0811-5A91-4171-B40A-0692BA9BFEFB}
+ EndGlobalSection
+EndGlobal
diff --git a/OpcUaMinimal/TestService/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/OpcUaMinimal/TestService/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..2217181
--- /dev/null
+++ b/OpcUaMinimal/TestService/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
diff --git a/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.AssemblyInfo.cs b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.AssemblyInfo.cs
new file mode 100644
index 0000000..5b5d6b0
--- /dev/null
+++ b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.AssemblyInfo.cs
@@ -0,0 +1,23 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: Microsoft.Extensions.Configuration.UserSecrets.UserSecretsIdAttribute("dotnet-TestService-32e4174a-e341-449d-b4e8-ed95b86df201")]
+[assembly: System.Reflection.AssemblyCompanyAttribute("TestService")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3181052619700dceeeef81a9a0851130498f177e")]
+[assembly: System.Reflection.AssemblyProductAttribute("TestService")]
+[assembly: System.Reflection.AssemblyTitleAttribute("TestService")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// MSBuild WriteCodeFragment 클래스에서 생성되었습니다.
+
diff --git a/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.AssemblyInfoInputs.cache b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..7824559
--- /dev/null
+++ b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+2a508951ac49d144820195cb52e9872d0988d5c3e9bce16356203f7d2df9d3e9
diff --git a/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.GeneratedMSBuildEditorConfig.editorconfig b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..307e23d
--- /dev/null
+++ b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,13 @@
+is_global = true
+build_property.TargetFramework = net8.0
+build_property.TargetPlatformMinVersion =
+build_property.UsingMicrosoftNETSdkWeb =
+build_property.ProjectTypeGuids =
+build_property.InvariantGlobalization =
+build_property.PlatformNeutralAssembly =
+build_property.EnforceExtendedAnalyzerRules =
+build_property._SupportedPlatformList = Linux,macOS,Windows
+build_property.RootNamespace = TestService
+build_property.ProjectDir = /home/pacer/projects/OpcUaMinimal/TestService/
+build_property.EnableComHosting =
+build_property.EnableGeneratedComInterfaceComImportInterop =
diff --git a/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.GlobalUsings.g.cs b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.GlobalUsings.g.cs
new file mode 100644
index 0000000..bb1f653
--- /dev/null
+++ b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.GlobalUsings.g.cs
@@ -0,0 +1,12 @@
+//
+global using global::Microsoft.Extensions.Configuration;
+global using global::Microsoft.Extensions.DependencyInjection;
+global using global::Microsoft.Extensions.Hosting;
+global using global::Microsoft.Extensions.Logging;
+global using global::System;
+global using global::System.Collections.Generic;
+global using global::System.IO;
+global using global::System.Linq;
+global using global::System.Net.Http;
+global using global::System.Threading;
+global using global::System.Threading.Tasks;
diff --git a/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.assets.cache b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.assets.cache
new file mode 100644
index 0000000..dc2f1f7
Binary files /dev/null and b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.assets.cache differ
diff --git a/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.csproj.AssemblyReference.cache b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..b52dd26
Binary files /dev/null and b/OpcUaMinimal/TestService/obj/Debug/net8.0/TestService.csproj.AssemblyReference.cache differ
diff --git a/OpcUaMinimal/obj/Debug/net8.0/OpcUaMinimal.AssemblyInfo.cs b/OpcUaMinimal/obj/Debug/net8.0/OpcUaMinimal.AssemblyInfo.cs
index af43234..587a0b3 100644
--- a/OpcUaMinimal/obj/Debug/net8.0/OpcUaMinimal.AssemblyInfo.cs
+++ b/OpcUaMinimal/obj/Debug/net8.0/OpcUaMinimal.AssemblyInfo.cs
@@ -13,10 +13,10 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpcUaMinimal")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3181052619700dceeeef81a9a0851130498f177e")]
[assembly: System.Reflection.AssemblyProductAttribute("OpcUaMinimal")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpcUaMinimal")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
-// Generated by the MSBuild WriteCodeFragment class.
+// MSBuild WriteCodeFragment 클래스에서 생성되었습니다.
diff --git a/OpcUaMinimal/obj/Debug/net8.0/OpcUaMinimal.AssemblyInfoInputs.cache b/OpcUaMinimal/obj/Debug/net8.0/OpcUaMinimal.AssemblyInfoInputs.cache
index 67c4f55..55c2351 100644
--- a/OpcUaMinimal/obj/Debug/net8.0/OpcUaMinimal.AssemblyInfoInputs.cache
+++ b/OpcUaMinimal/obj/Debug/net8.0/OpcUaMinimal.AssemblyInfoInputs.cache
@@ -1 +1 @@
-a745e6c33a6ca21dfa6cf7051fa0dbadc3b703f8cbec423b33c723d2901630c9
+a4b50e92c292747ea871d774c25954cdd987abe055be5b9e494c7acb67fa4145