C#使用UA-.NETStandard开发OPC UA客户端

OpcUa作为客户端测试代码

1、打开服务端,使用开源代码GitHub - OPCFoundation/UA-.NETStandard: OPC Unified Architecture .NET Standard中Quickstarts.ReferenceServer启动服务端

2、运行打印结果如下

测试标准OPC UA
Session_KeepAlive
2023/9/27 21:09:39Connected, loading complex type system.
ReadNode查询到这个Node的属性
data value : 55

3、测试启动

MyOpcUaServer myOpcUaServer = new MyOpcUaServer();

4、连接服务端测试类,引用NuGet:OPCFoundation.NetStandard.Opc.Ua

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Extensions.Configuration;
using Opc.Ua;
using Opc.Ua.Client;
using Opc.Ua.Client.ComplexTypes;
using Org.BouncyCastle.Asn1.X509;

namespace 标准OPC_UA
{
    internal class MyOpcUaClient
    {
        public string OpcUaName = "My Opc ua";

        private ApplicationConfiguration m_configuration;
        private Session m_session;
        private SessionReconnectHandler m_reconnectHandler;
        private CertificateValidationEventHandler m_CertificateValidation;
        //private Dictionary<Uri, EndpointDescription> m_endpoints;


        public MyOpcUaClient(string uri = "opc.tcp://lplsszsz4435n:62541/Quickstarts/ReferenceServer", bool useSecurity = false, int sessionTimeout = 1000) {
            InitConfiguration();

            // 连接测试
            Connect(uri, useSecurity, sessionTimeout);
            //Read();

            ConfiguredEndpointCollection configuredEndpoints = new ConfiguredEndpointCollection();
            List<ConfiguredEndpoint> list = configuredEndpoints.GetEndpoints("opc.tcp://lplsszsz4435n:62541/Quickstarts/ReferenceServer");

            if (m_session != null)
            {
                // 读取属性和值
                Node node = m_session.ReadNode("ns=7;s=Alarms.AnalogSource");
                if (node != null)
                {
                    Console.WriteLine("ReadNode查询到这个Node的属性");
                }

                WriteValueCollection nodesToWrite = new WriteValueCollection();
                WriteValue writeValue = new WriteValue();
                writeValue.NodeId = "ns=7;s=Alarms.AnalogSource";           // 看下属性是否是可写
                writeValue.AttributeId = 13u;                               // 不定义无法正常设置
                writeValue.Value = new DataValue(new Variant(55));          // 设置值
                nodesToWrite.Add(writeValue);
                StatusCodeCollection statusCodes = new StatusCodeCollection();
                DiagnosticInfoCollection diagnosticInfos = new DiagnosticInfoCollection();
                ResponseHeader rep = m_session.Write(null, nodesToWrite, out statusCodes, out diagnosticInfos);

                DataValue value = m_session.ReadValue("ns=7;s=Alarms.AnalogSource");
                if(value != null)
                {
                    Console.WriteLine("data value : " + value.ToString());
                }
            }

            //TranslateBrowsePathsToNodeIds();
        }
        void InitConfiguration()
        {
            var certificateValidator = new CertificateValidator();
            certificateValidator.CertificateValidation += (sender, eventArgs) =>
            {
                if (ServiceResult.IsGood(eventArgs.Error))
                    eventArgs.Accept = true;
                else if (eventArgs.Error.StatusCode.Code == StatusCodes.BadCertificateUntrusted)
                    eventArgs.Accept = true;
                else
                    throw new Exception(string.Format("Failed to validate certificate with error code {0}: {1}", eventArgs.Error.Code, eventArgs.Error.AdditionalInfo));
            };

            SecurityConfiguration securityConfigurationcv = new SecurityConfiguration
            {
                AutoAcceptUntrustedCertificates = true,
                RejectSHA1SignedCertificates = false,
                MinimumCertificateKeySize = 1024,
            };
            certificateValidator.Update(securityConfigurationcv);

            // Build the application configuration
            var configuration = new ApplicationConfiguration
            {
                ApplicationName = OpcUaName,
                ApplicationType = ApplicationType.Client,
                CertificateValidator = certificateValidator,
                ApplicationUri = "urn:MyClient", //Kepp this syntax
                ProductUri = "OpcUaClient",

                ServerConfiguration = new ServerConfiguration
                {
                    MaxSubscriptionCount = 100000,
                    MaxMessageQueueSize = 1000000,
                    MaxNotificationQueueSize = 1000000,
                    MaxPublishRequestCount = 10000000,
                },

                SecurityConfiguration = new SecurityConfiguration
                {
                    AutoAcceptUntrustedCertificates = true,
                    RejectSHA1SignedCertificates = false,
                    MinimumCertificateKeySize = 1024,
                    SuppressNonceValidationErrors = true,

                    ApplicationCertificate = new CertificateIdentifier
                    {
                        StoreType = CertificateStoreType.X509Store,
                        StorePath = "CurrentUser\\My",
                        SubjectName = OpcUaName,
                    },
                    TrustedIssuerCertificates = new CertificateTrustList
                    {
                        StoreType = CertificateStoreType.X509Store,
                        StorePath = "CurrentUser\\Root",
                    },
                    TrustedPeerCertificates = new CertificateTrustList
                    {
                        StoreType = CertificateStoreType.X509Store,
                        StorePath = "CurrentUser\\Root",
                    }
                },

                TransportQuotas = new TransportQuotas
                {
                    OperationTimeout = 6000000,
                    MaxStringLength = int.MaxValue,
                    MaxByteStringLength = int.MaxValue,
                    MaxArrayLength = 65535,
                    MaxMessageSize = 419430400,
                    MaxBufferSize = 65535,
                    ChannelLifetime = -1,
                    SecurityTokenLifetime = -1
                },
                ClientConfiguration = new ClientConfiguration
                {
                    DefaultSessionTimeout = -1,
                    MinSubscriptionLifetime = -1,
                },
                DisableHiResClock = true
            };

            configuration.Validate(ApplicationType.Client);
            m_configuration = configuration;
        }

        async void Connect(string uri = "opc.tcp://lplsszsz4435n:62541/Quickstarts/ReferenceServer", bool useSecurity = false, int sessionTimeout = 1000)
        {
            if (m_session != null)
            {
                m_session.KeepAlive -= Session_KeepAlive;
                m_session.Close(10000);
                m_session = null;
            }
            // select the best endpoint.
            var endpointDescription = CoreClientUtils.SelectEndpoint(m_configuration, uri, useSecurity, sessionTimeout);
            var endpointConfiguration = EndpointConfiguration.Create(m_configuration);
            var endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);

            m_session = await Session.Create(
                m_configuration,
                //connection,
                endpoint,
                false,
                //true,        //DisableDomainCheck
                "Quickstart Reference Client", //(String.IsNullOrEmpty(SessionName)) ? m_configuration.ApplicationName : SessionName,
                (uint)sessionTimeout,
                null,       //UserIdentity,
                null);      //PreferredLocales

            // set up keep alive callback.
            m_session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);

            // set up reconnect handler.
            m_reconnectHandler = new SessionReconnectHandler(true, 10 * 1000);

            try
            {
                Console.WriteLine(DateTime.Now + "Connected, loading complex type system.");
                var typeSystemLoader = new ComplexTypeSystem(m_session);
                await typeSystemLoader.Load();
            }
            catch (Exception e)
            {
                Console.WriteLine(DateTime.Now + "Connected, failed to load complex type system.");
                Utils.LogError(e, "Failed to load complex type system.");
            }
        }

        bool Read()
        {
            DataValueCollection dataValues = new DataValueCollection();
            DiagnosticInfoCollection diagnosticInfos = new DiagnosticInfoCollection();
            ResponseHeader resp = m_session.Read(null, 0, TimestampsToReturn.Both, null, out dataValues, out diagnosticInfos);
            return true;
        }
        void TranslateBrowsePathsToNodeIds()
            //RequestHeader requestHeader,
            //BrowsePathCollection browsePaths)
            //out BrowsePathResultCollection results,
            //out DiagnosticInfoCollection diagnosticInfos)
        {
            //m_session.TranslateBrowsePathsToNodeIds(null, "opc.tcp://lplsszsz4435n:62541/Quickstarts/ReferenceServer");
            BrowsePathResultCollection results;
            DiagnosticInfoCollection diagnosticInfos;
            var startNodeId = new NodeId(Objects.ObjectsFolder);
            var browsePaths1 = new BrowsePathCollection
            {
                new BrowsePath
                {
                    RelativePath = RelativePath.Parse("Objects", m_session.TypeTree, m_session.NamespaceUris, m_session.NamespaceUris),
                    StartingNode = startNodeId
                }
            };
            ResponseHeader resp = m_session.TranslateBrowsePathsToNodeIds(null, browsePaths1, out results, out diagnosticInfos);

        }

        private void ChangeSession(Session session, bool refresh)
        {
            //m_session = session;

            //if (AttributesControl != null)
            //{
            //    AttributesControl.ChangeSession(session);
            //}

            //BrowseTV.Nodes.Clear();

            //if (m_session != null)
            //{
            //    INode node = m_session.NodeCache.Find(m_rootId);

            //    if (node != null)
            //    {
            //        TreeNode root = new TreeNode(node.ToString());
            //        root.ImageIndex = ClientUtils.GetImageIndex(m_session, node.NodeClass, node.TypeDefinitionId, false);
            //        root.SelectedImageIndex = ClientUtils.GetImageIndex(m_session, node.NodeClass, node.TypeDefinitionId, true);

            //        ReferenceDescription reference = new ReferenceDescription();
            //        reference.NodeId = node.NodeId;
            //        reference.NodeClass = node.NodeClass;
            //        reference.BrowseName = node.BrowseName;
            //        reference.DisplayName = node.DisplayName;
            //        reference.TypeDefinition = node.TypeDefinitionId;
            //        root.Tag = reference;

            //        root.Nodes.Add(new TreeNode());
            //        BrowseTV.Nodes.Add(root);
            //        root.Expand();
            //        BrowseTV.SelectedNode = root;
            //    }
            //}
        }

        private void Session_KeepAlive(ISession session, KeepAliveEventArgs e)
        {
            Console.WriteLine("Session_KeepAlive");
        }

    }
}
相关推荐
结衣结衣.3 分钟前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
茫茫人海一粒沙6 分钟前
Python 代码编写规范
开发语言·python
原野心存6 分钟前
java基础进阶知识点汇总(1)
java·开发语言
程序猿阿伟8 分钟前
《C++高效图形用户界面(GUI)开发:探索与实践》
开发语言·c++
暗恋 懒羊羊16 分钟前
Linux 生产者消费者模型
linux·开发语言·ubuntu
五味香33 分钟前
C++学习,信号处理
android·c语言·开发语言·c++·学习·算法·信号处理
梓䈑1 小时前
【C语言】自定义类型:结构体
c语言·开发语言·windows
鱼跃鹰飞1 小时前
Leecode热题100-295.数据流中的中位数
java·服务器·开发语言·前端·算法·leetcode·面试
小蜗笔记1 小时前
在Python中实现多目标优化问题(7)模拟退火算法的调用
开发语言·python·模拟退火算法