You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python通过HTTPS(opc.https)连接OPC UA服务器?

问题原因

你直接用requests发送自定义二进制数据的方式不符合OPC UA over HTTPS的协议规范。OPC UA有专门的报文编码(如UA Binary)和会话管理机制,普通HTTP库无法正确处理这些细节,服务器解析你的数据时自然会抛出解码错误。

Python实现方案

推荐使用专门的OPC UA库,以下是两种常用库的示例:

1. opcua-asyncio(异步优先,主流选择)

这是目前维护活跃的异步OPC UA客户端库,支持HTTPS端点:

from asyncua import Client
import asyncio

async def connect_prosys_server():
    # 替换为你的Prosys HTTPS端点地址
    endpoint_url = "opc.https://localhost:53443/OPCUA/SimulationServer"
    
    async with Client(url=endpoint_url, verify_ssl=False) as client:
        # 获取根节点并打印
        root_node = client.get_root_node()
        print(f"根节点: {root_node}")
        
        # 获取对象节点
        objects_node = client.get_objects_node()
        print(f"对象节点: {objects_node}")
        
        # 浏览根节点的子节点
        children = await root_node.get_children()
        print("根节点子节点列表:")
        for child in children:
            print(f"- {child}")

if __name__ == "__main__":
    asyncio.run(connect_prosys_server())
  • verify_ssl=False用于忽略证书验证,生产环境请配置合法的SSL证书并移除该参数。
  • 若服务器启用了安全策略(如签名加密),需添加证书相关配置。

2. FreeOpcUa(同步版本)

这是opcua-asyncio的同步前身,适合简单的同步场景:

from opcua import Client

def connect_prosys_server():
    endpoint_url = "opc.https://localhost:53443/OPCUA/SimulationServer"
    client = Client(endpoint_url)
    
    # 忽略SSL证书验证
    client.session.set_verify_ssl(False)
    
    try:
        client.connect()
        print("连接成功")
        
        root_node = client.get_root_node()
        print(f"根节点: {root_node}")
        
        # 读取模拟变量(以Prosys的Simulation节点为例)
        sim_node = client.get_node("ns=2;i=1")
        value = sim_node.get_value()
        print(f"模拟变量值: {value}")
    finally:
        client.disconnect()
        print("连接断开")

if __name__ == "__main__":
    connect_prosys_server()
其他编程语言实现方案

C#/.NET

使用OPC基金会官方的OPC UA .NET Standard Library:

using Opc.Ua;
using Opc.Ua.Client;

class OpcUaHttpsClient
{
    static void Main()
    {
        string endpointUrl = "opc.https://localhost:53443/OPCUA/SimulationServer";
        var endpoint = new ConfiguredEndpoint(null, new EndpointDescription(endpointUrl))
        {
            SecurityPolicyUri = SecurityPolicy.NoneUri,
            SecurityMode = MessageSecurityMode.None
        };
        
        using (var session = Session.Create(
            new ApplicationInstance(),
            new SessionCreationData
            {
                Endpoint = endpoint,
                SessionName = "ProsysSimClient",
                VerifyPeer = false // 忽略证书验证
            }))
        {
            session.Open();
            Console.WriteLine("连接成功");
            
            var rootNode = session.ReadNode(ObjectIds.RootFolder);
            Console.WriteLine($"根节点: {rootNode.DisplayName.Text}");
            
            session.Close();
        }
    }
}

Java

使用Eclipse Milo库(Java生态主流OPC UA实现):

import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;

public class ProsysOpcUaClient {
    public static void main(String[] args) throws Exception {
        String endpointUrl = "opc.https://localhost:53443/OPCUA/SimulationServer";
        
        OpcUaClient client = OpcUaClient.create(
            endpointUrl,
            configBuilder -> configBuilder
                .setSecurityPolicy(SecurityPolicy.None)
                .setCertificateValidator(c -> true) // 忽略证书验证
                .build()
        );
        
        client.connect().get();
        System.out.println("连接成功");
        
        NodeId rootNodeId = NodeId.parse("i=84");
        var rootNode = client.readNode(rootNodeId).get();
        System.out.println($"根节点: {rootNode.getBrowseName().getName()}");
        
        client.disconnect().get();
    }
}

内容的提问来源于stack exchange,提问作者Story De Moi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:32:46