Beispiel #1
0
        public async Task <string> ReadAnItemAsyc(string name)
        {
            string item = "";

            if (serverName != "")
            {
                try
                {
                    var readRequestGetName = new Workstation.ServiceModel.Ua.ReadRequest
                    {
                        NodesToRead = new[]
                        {
                            new Workstation.ServiceModel.Ua.ReadValueId
                            {
                                NodeId      = Workstation.ServiceModel.Ua.NodeId.Parse("ns=4;s=|var|" + serverName + "." + name),
                                AttributeId = AttributeIds.Value
                            }
                        }
                    };
                    var readResultName = await channel.ReadAsync(readRequestGetName);

                    item = readResultName.Results[0].Value.ToString();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
            return(item);
        }
        /// <summary>
        /// Reads a list of Node attributes.
        /// </summary>
        /// <param name="client">A instance of <see cref="ISessionClient"/>.</param>
        /// <param name="request">A <see cref="ReadRequest"/>.</param>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation that returns a <see cref="ReadResponse"/>.</returns>
        public static async Task<ReadResponse> ReadAsync(this ISessionClient client, ReadRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            return (ReadResponse)await client.RequestAsync(request).ConfigureAwait(false);
        }
Beispiel #3
0
        public override async Task <VTQ[]> ReadDataItems(string group, IList <ReadRequest> items, Duration?timeout)
        {
            bool connected = await TryConnect();

            if (!connected || connection == null)
            {
                return(GetBadVTQs(items));
            }

            var readHelper = new ReadManager <ReadValueId, Workstation.ServiceModel.Ua.DataValue>(items, request => {
                NodeId node = mapId2Info[request.ID].Node ?? NodeId.Null;
                return(new ReadValueId {
                    AttributeId = AttributeIds.Value, NodeId = node
                });
            });

            ReadValueId[] dataItemsToRead = readHelper.GetRefs();

            try {
                VTQ[] result;

                if (dataItemsToRead.Length > 0)
                {
                    var readRequest = new Workstation.ServiceModel.Ua.ReadRequest {
                        NodesToRead        = dataItemsToRead,
                        TimestampsToReturn = TimestampsToReturn.Source,
                    };

                    ReadResponse readResponse = await connection.ReadAsync(readRequest);

                    readHelper.SetAllResults(readResponse.Results, (vv, request) => MakeVTQ(vv, request.LastValue, request.ID));
                    result = readHelper.values;
                }
                else
                {
                    result = readHelper.values;
                }

                if (readExceptionWarning)
                {
                    readExceptionWarning = false;
                    ReturnToNormal("UAReadExcept", "ReadDataItems successful again");
                }

                return(result);
            }
            catch (Exception exp) {
                Exception e = exp.GetBaseException() ?? exp;
                readExceptionWarning = true;
                LogWarn("UAReadExcept", $"Read exception: {e.Message}", details: e.ToString());
                Task ignored = CloseChannel();
                return(GetBadVTQs(items));
            }
        }
Beispiel #4
0
        public override async Task <VTQ[]> ReadDataItems(string group, IList <ReadRequest> items, Duration?timeout)
        {
            int N = items.Count;

            VTQ[] res = new VTQ[N];

            bool connected = await TryConnect();

            if (!connected)
            {
                for (int i = 0; i < N; ++i)
                {
                    VTQ vtq = items[i].LastValue;
                    vtq.Q  = Quality.Bad;
                    res[i] = vtq;
                }
                return(res);
            }

            ReadValueId[] dataItemsToRead = new ReadValueId[N];
            for (int i = 0; i < N; ++i)
            {
                ReadRequest request = items[i];
                NodeId      node    = mapId2Info[request.ID].Node ?? NodeId.Null;
                dataItemsToRead[i] = new ReadValueId {
                    AttributeId = AttributeIds.Value, NodeId = node
                };
            }

            var readRequest = new Workstation.ServiceModel.Ua.ReadRequest {
                NodesToRead        = dataItemsToRead,
                TimestampsToReturn = TimestampsToReturn.Source,
            };

            ReadResponse readResponse = await connection.ReadAsync(readRequest);

            for (int i = 0; i < N; ++i)
            {
                res[i] = MakeVTQ(readResponse.Results[i], items[i].LastValue, items[i].ID);
            }
            return(res);
        }
        public async Task SessionTimeoutCausesFault()
        {
            // get or add application certificate.
            var localCertificate = this.localDescription.GetCertificate();
            if (localCertificate == null)
            {
                throw new ServiceResultException(StatusCodes.BadSecurityChecksFailed, "Application certificate is missing.");
            }

            // discover available endpoints of server.
            var getEndpointsRequest = new GetEndpointsRequest
            {
                EndpointUrl = this.endpointUrl,
                ProfileUris = new[] { TransportProfileUris.UaTcpTransport }
            };
            Console.WriteLine($"Discovering endpoints of '{getEndpointsRequest.EndpointUrl}'.");
            var getEndpointsResponse = await UaTcpDiscoveryClient.GetEndpointsAsync(getEndpointsRequest);
            var selectedEndpoint = getEndpointsResponse.Endpoints.OrderBy(e => e.SecurityLevel).Last();

            var selectedTokenType = selectedEndpoint.UserIdentityTokens[0].TokenType;
            IUserIdentity selectedUserIdentity;
            switch (selectedTokenType)
            {
                case UserTokenType.UserName:
                    selectedUserIdentity = new UserNameIdentity("root", "secret");
                    break;

                case UserTokenType.Certificate:
                    selectedUserIdentity = new X509Identity(localCertificate);
                    break;

                default:
                    selectedUserIdentity = new AnonymousIdentity();
                    break;
            }

            var client = new UaTcpSessionClient(
                this.localDescription,
                localCertificate,
                selectedUserIdentity,
                selectedEndpoint)
            {
                SessionTimeout = 10000
            };
            Console.WriteLine($"Creating session with endpoint '{client.RemoteEndpoint.EndpointUrl}'.");
            Console.WriteLine($"SecurityPolicy: '{client.RemoteEndpoint.SecurityPolicyUri}'.");
            Console.WriteLine($"SecurityMode: '{client.RemoteEndpoint.SecurityMode}'.");
            await client.OpenAsync();
            Console.WriteLine($"Activated session '{client.SessionId}'.");

            // server should close session due to inactivity
            await Task.Delay(20000);

            // should throw exception
            var readRequest = new ReadRequest { NodesToRead = new[] { new ReadValueId { NodeId = NodeId.Parse(VariableIds.Server_ServerStatus_CurrentTime), AttributeId = AttributeIds.Value } } };
            await client.ReadAsync(readRequest);

            Console.WriteLine($"Closing session '{client.SessionId}'.");
            await client.CloseAsync();
        }
Beispiel #6
0
        public async Task SetChanel()
        {
            var clientDescription = new ApplicationDescription
            {
                ApplicationName = "Workstation.UaClient.FeatureTests",
                ApplicationUri  = $"urn:{System.Net.Dns.GetHostName()}:Workstation.UaClient.FeatureTests",
                ApplicationType = Workstation.ServiceModel.Ua.ApplicationType.Client
            };

            channel = new UaTcpSessionChannel(
                clientDescription,
                null, // no x509 certificates
                new AnonymousIdentity(),
                url,
                SecurityPolicyUris.None);

            try
            {
                await channel.OpenAsync();

                var readRequestGetName = new Workstation.ServiceModel.Ua.ReadRequest
                {
                    NodesToRead = new[] {
                        new Workstation.ServiceModel.Ua.ReadValueId {
                            NodeId      = Workstation.ServiceModel.Ua.NodeId.Parse(Workstation.ServiceModel.Ua.VariableIds.Server_ServerStatus),
                            AttributeId = AttributeIds.Value
                        }
                    }
                };
                var readResultName = await channel.ReadAsync(readRequestGetName);

                var serverStatusGetName = readResultName.Results[0].GetValueOrDefault <Workstation.ServiceModel.Ua.ServerStatusDataType>();
                serverName = serverStatusGetName.BuildInfo.ProductName;


                ReadValueId[] reads = new ReadValueId[itemsNames.Count];
                int           index = 0;
                names = new String[itemsNames.Count];
                foreach (string name in itemsNames)
                {
                    reads[index] = new Workstation.ServiceModel.Ua.ReadValueId
                    {
                        NodeId      = Workstation.ServiceModel.Ua.NodeId.Parse("ns=4;s=|var|" + serverName + "." + name),
                        AttributeId = AttributeIds.Value
                    };
                    //MessageBox.Show(itemsNames.Count.ToString());
                    names[index] = name;
                    index++;
                }
                readRequest = new Workstation.ServiceModel.Ua.ReadRequest
                {
                    NodesToRead = reads
                };
            }
            catch (Exception ex)
            {
                await channel.AbortAsync();

                MessageBox.Show(ex.Message);
            }
        }