如何使用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
相关产品推荐
相关产品推荐

