所以我的工作有一个现有的 python 脚本用于连接到 OPC UA 服务器。这一切都非常基本,我试图用 java 创建一个更好的系统,但是每当我尝试对服务器执行任何操作时,我都会收到消息 status=Bad_ConnectionClosed 的异常。涉及建立连接和检索值的现有 python 脚本如下:
from opcua import Client, ua
opcClient = Client("opc.tcp://localhost:54321")
opcClient.connect;
valueNode = opcClient.get_node("ns=1;s=measure.value")
我不是在开玩笑,这就是这里所做的一切。我能找到的最好的java开源库是Digital Petri,通过maven,com.digitalpetri.opcua:ua-client:1.0.4(也尝试过1.1.1) 我的连接尝试如下:
OpcUaClient opcUaClient = new OpcUaClient(OpcUaClientConfig.builder().setEndpointUrl("opc.tcp://localhost:54321").build()).connect().get();
此行抛出提到的异常,然后我无法检索节点或其他任何内容
经过进一步研究,我在 Digital Petris github 页面上找到了一个客户端示例, https://github.com/kevinherron/ua-client-sdk/blob/master/ua-client-tests/src/test/java/com/digitalpetri/opcua/sdk/client/OpcUaClientIT.java
使用 python 脚本提取所需的配置值后,我能够复制与将客户端连接到服务器相关的部分:
EndpointDescription[] endpoints = UaTcpStackClient.getEndpoints("opc.tcp://localhost:54321").get();
EndpointDescription endpoint = Arrays.stream(endpoints)
.filter(e -> e.getSecurityPolicyUri().equals(SecurityPolicy.None.getSecurityPolicyUri()))
.findFirst().orElseThrow(() -> new Exception("no desired endpoints returned"));
OpcUaClientConfig clientConfig = OpcUaClientConfig.builder()
.setApplicationName(LocalizedText.english("Pure Python Client"))
.setApplicationUri("urn:freeopcua:client")
.setEndpoint(endpoint)
.setRequestTimeout(uint(60000))
.build();
OpcUaClient client = new OpcUaClient(clientConfig);
然而,在第一行 EndpointDescription[] endpoints = UaTcpStackClient.getEndpoints("opc.tcp://localhost:54321").get();我也遇到同样的异常。
我尝试在网址末尾添加 /discovery (按照推荐)。没有适当的证书系统,需要匿名登录。
但无论如何,数字 Petri 似乎是 Java 的首选,并且应该可以正常工作。
digitalpetri OPC UA 存储库已存档,并明确指出您可以使用 Eclipse Milo 作为替代品。