
1、安装依赖dependency groupIdorg.eclipse.milo/groupId artifactIdsdk-client/artifactId version0.6.16/version scopecompile/scope /dependency dependency groupIdjavax.xml.bind/groupId artifactIdjaxb-api/artifactId version2.3.1/version /dependency配置文件ymlopcua-service: url: opc.tcp://localhost:4840 username: xxxx password: xxxxx2、新建OpcUaConfig配置类package com.example.collection_service.common.config; import org.eclipse.milo.opcua.sdk.client.OpcUaClient; import org.eclipse.milo.opcua.sdk.client.api.identity.UsernameProvider; import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class OpcUaConfig { Value(${opcua-service.url}) private String endPointUrl; Value(${opcua-service.username}) private String userName; Value(${opcua-service.password}) private String password; Bean public OpcUaClient opcUaClient() throws Exception { OpcUaClient opcUaClient OpcUaClient.create(endPointUrl, endpoints - endpoints.stream() .filter(e - e.getSecurityPolicyUri().equals(SecurityPolicy.None.getUri())) .findFirst(), configBuilder - configBuilder .setApplicationName(LocalizedText.english(eclipse milo opc-ua client)) .setApplicationUri(urn:eclipse:milo:examples:client) //访问方式 // .setIdentityProvider(new AnonymousProvider()) .setIdentityProvider(new UsernameProvider(userName,password)) .setRequestTimeout(UInteger.valueOf(500)) .build() ); opcUaClient.connect().get(); return opcUaClient; } }3、新建OpcService用于订阅OPCUA数据package org.example.opcua.opc_service; import jakarta.annotation.Resource; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.eclipse.milo.opcua.sdk.client.OpcUaClient; import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaMonitoredItem; import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscription; import org.eclipse.milo.opcua.stack.core.AttributeId; import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId; import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger; import org.eclipse.milo.opcua.stack.core.types.enumerated.MonitoringMode; import org.eclipse.milo.opcua.stack.core.types.enumerated.TimestampsToReturn; import org.eclipse.milo.opcua.stack.core.types.structured.MonitoredItemCreateRequest; import org.eclipse.milo.opcua.stack.core.types.structured.MonitoringParameters; import org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import static com.google.common.collect.Lists.newArrayList; import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint; Service Slf4j public class OpcService implements ApplicationRunner { Resource private OpcUaClient opcUaClient; private static final AtomicInteger atomic new AtomicInteger(); //单个订阅 SneakyThrows public void subscribe(OpcUaClient client) { client .getSubscriptionManager() .createSubscription(1000.0) .thenAccept(t - { //节点 NodeId nodeId new NodeId(2,accesstest2.equip1.test); ReadValueId readValueId new ReadValueId(nodeId, AttributeId.Value.uid(), null, null); //创建监控的参数 MonitoringParameters parameters new MonitoringParameters(UInteger.valueOf(atomic.getAndIncrement()), 1000.0, null, UInteger.valueOf(10), true); //创建监控项请求 //该请求最后用于创建订阅。 MonitoredItemCreateRequest request new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters); ListMonitoredItemCreateRequest requests new ArrayList(); requests.add(request); //创建监控项并且注册变量值改变时候的回调函数。 t.createMonitoredItems( TimestampsToReturn.Both, requests, (item, id) - item.setValueConsumer((it, val) - { System.out.println(nodeid : it.getReadValueId().getNodeId()); System.out.println(value : val.getValue().getValue()); }) ); }).get(); } public void subscribeOpcUaData() { try { //创建发布间隔1000ms的订阅对象 UaSubscription subscription opcUaClient.getSubscriptionManager().createSubscription(2000.0).get(); ListString key List.of( ns6;bAQAAAKbhKnGK9zM6Di/m8WY0qY9vrSN7nO00cZuD, ns6;bAQAAAKbhKnGK9zM6Di/m8WY0qY9vrSN7nO00cZuyQA, ns6;bAQAAAKbhKnGK9zM6Di/m8WY0qY9vrSN7nO00cZuxQA ); // 1. 先建所有 request ListMonitoredItemCreateRequest requests new ArrayList(); for (int i 0; i key.size(); i) { NodeId nodeId NodeId.parse(key.get(i)); ReadValueId readValueId new ReadValueId(nodeId, AttributeId.Value.uid(), null, null); MonitoringParameters parameters new MonitoringParameters( uint(1 i), 0.0, null, uint(10), true ); requests.add(new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters)); } subscription.addNotificationListener(new UaSubscription.NotificationListener() { Override public void onDataChangeNotification(UaSubscription sub, ListUaMonitoredItem items, ListDataValue values, DateTime publishTime) { // ✅ 这里就是“一批” System.out.println( 本次 Publish 收到 items.size() 个变量变化 ); for (int i 0; i items.size(); i) { String nodeName items.get(i).getReadValueId().getNodeId().getIdentifier().toString(); Object val values.get(i).getValue().getValue(); System.out.println(nodeName val); System.out.println(val); } } }); // 3. 批量创建监控项item 创建回调里不用再设 setValueConsumer subscription.createMonitoredItems( TimestampsToReturn.Both, requests, (item, id) - { // 可以留空也可以只打日志 // System.out.println(created: item.getReadValueId().getNodeId()); } ).get(); }catch (Exception ex){ throw new BusinessException(ex.getMessage()); } } Override public void run(ApplicationArguments args){ try { //创建发布间隔1000ms的订阅对象 System.out.println(执行订阅); this.createSubscription(); }catch (Exception e) { e.printStackTrace(); log.error(e.getMessage()); } } }