private async Task <Session> ConsoleSampleClient() { var application = new ApplicationInstance { ApplicationType = ApplicationType.Client }; #region Create an Application Configuration Console.WriteLine(" 1 - Create an Application Configuration."); ExitCode = ExitCode.ErrorCreateApplication; // Load the Application Configuration and use the specified config section "Technosoftware.ModelDesignClient" var config = await application.LoadConfigurationAsync("Technosoftware.ModelDesignClient"); // check the application certificate. var haveAppCertificate = await application.CheckApplicationInstanceCertificateAsync(false, CertificateFactory.DefaultKeySize, CertificateFactory.DefaultLifeTime); if (haveAppCertificate) { config.ApplicationUri = X509Utils.GetApplicationUriFromCertificate(config.SecurityConfiguration.ApplicationCertificate.Certificate); if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates) { autoAccept_ = true; } config.CertificateValidator.CertificateValidation += OnCertificateValidation; } else { Console.WriteLine(" WARN: missing application certificate, using unsecured connection."); } #endregion #region Discover endpoints Console.WriteLine(" 2 - Discover endpoints of {0}.", endpointUrl_); ExitCode = ExitCode.ErrorDiscoverEndpoints; var selectedEndpoint = Discover.SelectEndpoint(endpointUrl_, haveAppCertificate, 15000); Console.WriteLine(" Selected endpoint uses: {0}", selectedEndpoint.SecurityPolicyUri.Substring(selectedEndpoint.SecurityPolicyUri.LastIndexOf('#') + 1)); #endregion #region Create a session with OPC UA server Console.WriteLine(" 3 - Create a session with OPC UA server."); ExitCode = ExitCode.ErrorCreateSession; // create the user identity UserIdentity userIdentity; if (String.IsNullOrEmpty(Username) && String.IsNullOrEmpty(Password)) { userIdentity = new UserIdentity(new AnonymousIdentityToken()); } else { userIdentity = new UserIdentity(Username, Password); } // create worker session session_ = await CreateSessionAsync(config, selectedEndpoint, userIdentity).ConfigureAwait(false); // register keep alive handler session_.SessionKeepAliveEvent += OnSessionKeepAliveEvent; #endregion #region Browse the OPC UA Server Console.WriteLine(" 4 - Browse address space."); // Create the browser var browser = new Browser(session_) { BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences, IncludeSubtypes = true, NodeClassMask = 0, ContinueUntilDone = false }; // Browse from the RootFolder var references = browser.Browse(Objects.ObjectsFolder); GetElements(session_, browser, 0, references, Verbose); #endregion #region Read a single value Console.WriteLine(" 5 - Read a single value."); var simulatedDataValue = session_.ReadValue(machine1LevelNodeId_); Console.WriteLine("Measurement Value:" + simulatedDataValue.Value); #endregion #region Create a subscription with publishing interval of 1 second Console.WriteLine(" 6 - Create a subscription with publishing interval of 1 second."); ExitCode = ExitCode.ErrorCreateSubscription; subscription_ = new Subscription(session_.DefaultSubscription) { PublishingInterval = 1000 }; #endregion #region Add all dynamic values and the server time to the subscription Console.WriteLine(" 7 - Add the server time to the subscription."); ExitCode = ExitCode.ErrorMonitoredItem; var list = new List <MonitoredItem> { new MonitoredItem(subscription_.DefaultItem) { DisplayName = "ServerStatusCurrentTime", StartNodeId = "i=" + Variables.Server_ServerStatus_CurrentTime } }; list.ForEach(i => i.MonitoredItemNotificationEvent += OnNotification); subscription_.AddItems(list); #endregion #region Add the subscription to the session Console.WriteLine(" 8 - Add the subscription to the session."); ExitCode = ExitCode.ErrorAddSubscription; session_.AddSubscription(subscription_); subscription_.Create(); #endregion #region Running...Press Ctrl-C to exit... Console.WriteLine(" 9 - Running...Press Ctrl-C to exit..."); ExitCode = ExitCode.ErrorRunning; #endregion return(session_); }
private async Task <Session> ConsoleSampleClient() { var application = new ApplicationInstance { ApplicationType = ApplicationType.Client }; #region Create an Application Configuration Console.WriteLine(" 1 - Create an Application Configuration."); ExitCode = ExitCode.ErrorCreateApplication; // Load the Application Configuration and use the specified config section "Technosoftware.SimpleClient" var config = await application.LoadConfigurationAsync("Technosoftware.SimpleClient"); // check the application certificate. var haveAppCertificate = await application.CheckApplicationInstanceCertificateAsync(false, CertificateFactory.DefaultKeySize, CertificateFactory.DefaultLifeTime); reverseConnectManager_ = null; if (ReverseConnectUri != null) { // start the reverse connection manager reverseConnectManager_ = new ReverseConnectManager(); reverseConnectManager_.AddEndpoint(ReverseConnectUri); reverseConnectManager_.StartService(config); } if (haveAppCertificate) { config.ApplicationUri = X509Utils.GetApplicationUriFromCertificate(config.SecurityConfiguration.ApplicationCertificate.Certificate); if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates) { autoAccept_ = true; } config.CertificateValidator.CertificateValidation += OnCertificateValidation; } else { Console.WriteLine(" WARN: missing application certificate, using unsecured connection."); } #endregion #region Discover endpoints Console.WriteLine(" 2 - Discover endpoints of {0}.", endpointUrl_); ExitCode = ExitCode.ErrorDiscoverEndpoints; EndpointDescription selectedEndpoint; if (reverseConnectManager_ == null) { selectedEndpoint = Discover.SelectEndpoint(endpointUrl_, haveAppCertificate && !SecurityNone, 15000); } else { Console.WriteLine(" Waiting for reverse connection."); var connection = await reverseConnectManager_.WaitForConnection( new Uri(endpointUrl_), null, new CancellationTokenSource(60000).Token); if (connection == null) { throw new ServiceResultException(StatusCodes.BadTimeout, "Waiting for a reverse connection timed out."); } selectedEndpoint = Discover.SelectEndpoint(config, connection, haveAppCertificate && !SecurityNone, 15000); } Console.WriteLine(" Selected endpoint uses: {0}", selectedEndpoint.SecurityPolicyUri.Substring(selectedEndpoint.SecurityPolicyUri.LastIndexOf('#') + 1)); #endregion #region Create a session with OPC UA server Console.WriteLine(" 3 - Create a session with OPC UA server."); ExitCode = ExitCode.ErrorCreateSession; // create the user identity UserIdentity userIdentity; if (String.IsNullOrEmpty(Username) && String.IsNullOrEmpty(Password)) { userIdentity = new UserIdentity(new AnonymousIdentityToken()); } else { userIdentity = new UserIdentity(Username, Password); } // create worker session if (reverseConnectManager_ == null) { session_ = await CreateSessionAsync(config, selectedEndpoint, userIdentity).ConfigureAwait(false); } else { Console.WriteLine(" Waiting for reverse connection."); // Define the cancellation token. var source = new CancellationTokenSource(60000); var token = source.Token; try { var connection = await reverseConnectManager_.WaitForConnection( new Uri(endpointUrl_), null, token); if (connection == null) { throw new ServiceResultException(StatusCodes.BadTimeout, "Waiting for a reverse connection timed out."); } session_ = await CreateSessionAsync(config, connection, selectedEndpoint, userIdentity) .ConfigureAwait(false); } finally { source.Dispose(); } } // register keep alive handler session_.SessionKeepAliveEvent += OnSessionKeepAliveEvent; #endregion #region Browse the OPC UA Server Console.WriteLine(" 4 - Browse address space."); // Create the browser var browser = new Browser(session_) { BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences, IncludeSubtypes = true, NodeClassMask = 0, ContinueUntilDone = false }; // Browse from the RootFolder var references = browser.Browse(Objects.ObjectsFolder); GetElements(session_, browser, 0, references, Verbose); #endregion #region Read a single value Console.WriteLine(" 5 - Read a single value."); var simulatedDataValue = session_.ReadValue(simulatedDataNodeId_); Console.WriteLine("Node Value:" + simulatedDataValue.Value); #endregion #region Read multiple values Console.WriteLine(" 6 - Read multiple values."); // The input parameters of the ReadValues() method var variableIds = new List <NodeId>(); var expectedTypes = new List <Type>(); // Add a node to the list variableIds.Add(simulatedDataNodeId_); // Add an expected type to the list (null means we get the original type from the server) expectedTypes.Add(null); // Add another node to the list variableIds.Add(staticDataNodeId1_); // Add an expected type to the list (null means we get the original type from the server) expectedTypes.Add(null); // Add another node to the list variableIds.Add(staticDataNodeId2_); // Add an expected type to the list (null means we get the original type from the server) expectedTypes.Add(null); session_.ReadValues(variableIds, expectedTypes, out var values, out var errors); // write the result to the console. for (var i = 0; i < values.Count; i++) { Console.WriteLine("Status of Read of Node {0} is: {1}", variableIds[i].ToString(), errors[i]); } for (var i = 0; i < values.Count; i++) { Console.WriteLine("Value of Read of Node {0} is: Value: {1}", variableIds[i].ToString(), values[i]); } #endregion #region Read multiple values asynchronous Console.WriteLine(" 7 - Read multiple values asynchronous."); // start reading the value (setting a 10 second timeout). session_.BeginReadValues( variableIds, 0, TimestampsToReturn.Both, OnReadComplete, new UserData { Session = session_, NodeIds = variableIds }); #endregion #region Write a value Console.WriteLine(" 8 - Write a value."); short writeInt = 1234; Console.WriteLine("Write Value: " + writeInt); session_.WriteValue(staticDataNodeId1_, new DataValue(writeInt)); // read it again to check the new value Console.WriteLine("Node Value (should be {0}): {1}", session_.ReadValue(staticDataNodeId1_).Value, writeInt); #endregion #region Write multiple values at once Console.WriteLine(" 9 - Write multiple values at once."); writeInt = 5678; var writeDouble = 1234.1234; var nodeIds = new List <NodeId>(); var dataValues = new List <DataValue>(); nodeIds.Add(staticDataNodeId1_); nodeIds.Add(staticDataNodeId2_); dataValues.Add(new DataValue(writeInt)); dataValues.Add(new DataValue(writeDouble)); Console.WriteLine("Write Values: {0} and {1}", writeInt, writeDouble); var statusCodes = session_.WriteValues(nodeIds, dataValues); Console.WriteLine("Returned status codes:"); foreach (var statusCode in statusCodes) { Console.WriteLine("Status: {0}", statusCode.ToString()); } // read it again to check the new value Console.WriteLine("Node Value (should be {0}): {1}", session_.ReadValue(staticDataNodeId1_).Value, writeInt); Console.WriteLine("Node Value (should be {0}): {1}", session_.ReadValue(staticDataNodeId2_).Value, writeDouble); #endregion #region Write multiple values asynchronous Console.WriteLine("10 - Write multiple values asynchronous."); // start writing the values. session_.BeginWriteValues( nodeIds, dataValues, OnWriteComplete, new UserData { Session = session_, NodeIds = nodeIds }); #endregion #region Call a Method Console.WriteLine("11 - Call a Method."); INode node = session_.ReadNode(callHelloMethodNodeId_); if (node is MethodNode) { var methodId = callHelloMethodNodeId_; var objectId = methodsNodeId_; var inputArguments = new VariantCollection { new Variant("from Technosoftware") }; var request = new CallMethodRequest { ObjectId = objectId, MethodId = methodId, InputArguments = inputArguments }; var requests = new CallMethodRequestCollection { request }; var responseHeader = session_.Call( null, requests, out var results, out var diagnosticInfos); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(new ServiceResult(results[0].StatusCode, 0, diagnosticInfos, responseHeader.StringTable)); } Console.WriteLine("{0}", results[0].OutputArguments[0]); } #endregion #region Create a subscription with publishing interval of 1 second Console.WriteLine("12 - Create a subscription with publishing interval of 1 second."); ExitCode = ExitCode.ErrorCreateSubscription; subscription_ = new Subscription(session_.DefaultSubscription) { PublishingInterval = 1000 }; #endregion #region Add all dynamic values and the server time to the subscription Console.WriteLine("13 - Add all dynamic values and the server time to the subscription."); ExitCode = ExitCode.ErrorMonitoredItem; var list = new List <MonitoredItem> { new MonitoredItem(subscription_.DefaultItem) { DisplayName = "ServerStatusCurrentTime", StartNodeId = "i=" + Variables.Server_ServerStatus_CurrentTime } }; list.ForEach(i => i.MonitoredItemNotificationEvent += OnNotification); var newItem = new MonitoredItem(subscription_.DefaultItem) { DisplayName = "Simulated Data Value", StartNodeId = new NodeId(simulatedDataNodeId_) }; newItem.MonitoredItemNotificationEvent += OnMonitoredItemNotificationEvent; list.Add(newItem); subscription_.AddItems(list); #endregion #region Add the subscription to the session Console.WriteLine("14 - Add the subscription to the session."); ExitCode = ExitCode.ErrorAddSubscription; session_.AddSubscription(subscription_); subscription_.Create(); #endregion #region Running...Press Ctrl-C to exit... Console.WriteLine("15 - Running...Press Ctrl-C to exit..."); ExitCode = ExitCode.ErrorRunning; #endregion return(session_); }