springboot連接訂閱OPCUA數(shù)據(jù)的實現(xiàn)
1、安裝依賴
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>sdk-client</artifactId>
<version>0.6.14</version>
</dependency>
2、新建OpcUaConfig配置類
package org.example.opcua.opc_config;
import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@Configuration
public class OpcUaConfig {
@Bean
public OpcUaClient createClient() throws Exception {
String endPointUrl = "opc.tcp://127.0.0.1:49320";
Path securityTempDir = Paths.get(System.getProperty("java.io.tmpdir"), "security");
Files.createDirectories(securityTempDir);
if (!Files.exists(securityTempDir)) {
throw new Exception("unable to create security dir: " + securityTempDir);
}
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())
.setRequestTimeout(UInteger.valueOf(500))
.build()
);
opcUaClient.connect().get();
// Thread.sleep(2000); // 線程休眠一下再返回對象,給創(chuàng)建過程一個時間。
return opcUaClient;
}
}
3、新建OpcService用于訂閱OPCUA數(shù)據(jù)
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 -> {
//節(jié)點
NodeId nodeId = new NodeId(2,"accesstest2.equip1.test");
ReadValueId readValueId = new ReadValueId(nodeId, AttributeId.Value.uid(), null, null);
//創(chuàng)建監(jiān)控的參數(shù)
MonitoringParameters parameters = new MonitoringParameters(UInteger.valueOf(atomic.getAndIncrement()), 1000.0, null, UInteger.valueOf(10), true);
//創(chuàng)建監(jiān)控項請求
//該請求最后用于創(chuàng)建訂閱。
MonitoredItemCreateRequest request = new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters);
List<MonitoredItemCreateRequest> requests = new ArrayList<>();
requests.add(request);
//創(chuàng)建監(jiān)控項,并且注冊變量值改變時候的回調(diào)函數(shù)。
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();
}
/**
* 批量訂閱
* @throws Exception
*/
public void createSubscription() throws Exception {
// 獲取OPC UA服務(wù)器的數(shù)據(jù)
//創(chuàng)建監(jiān)控項請求
//創(chuàng)建發(fā)布間隔1000ms的訂閱對象
UaSubscription subscription = opcUaClient.getSubscriptionManager().createSubscription(1000.0).get();
// 你所需要訂閱的key
List<String> key = new ArrayList<>();
key.add("accesstest2.equip1.test");
key.add("accesstest2.equip1.test1");
key.add("accesstest2.equip1.test2");
for (int i = 0; i < key.size(); i++) {
String node = key.get(i);
//創(chuàng)建訂閱的變量
NodeId nodeId = new NodeId(2, node);
ReadValueId readValueId = new ReadValueId(nodeId, AttributeId.Value.uid(), null, null);
//創(chuàng)建監(jiān)控的參數(shù)
MonitoringParameters parameters = new MonitoringParameters(
uint(1 + i), // 為了保證唯一性,否則key值一致
0.0, // sampling interval
null, // filter, null means use default
uint(10), // queue size
true // discard oldest
);
MonitoredItemCreateRequest request = new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters);
//創(chuàng)建監(jiān)控項,并且注冊變量值改變時候的回調(diào)函數(shù)。
List<UaMonitoredItem> items = subscription.createMonitoredItems(
TimestampsToReturn.Both,
newArrayList(request),
(item, id) -> {
item.setValueConsumer((is, value) -> {
String nodeName = item.getReadValueId().getNodeId().getIdentifier().toString();
String nodeValue = value.getValue().getValue().toString();
System.out.println("訂閱");
System.out.println(nodeName);
System.out.println(nodeValue);
});
}).get();
}
}
@Override
public void run(ApplicationArguments args){
try {
//創(chuàng)建發(fā)布間隔1000ms的訂閱對象
System.out.println("執(zhí)行訂閱");
this.createSubscription();
}catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
}
}
}
到此這篇關(guān)于springboot連接訂閱OPCUA數(shù)據(jù)的實現(xiàn)的文章就介紹到這了,更多相關(guān)springboot連接訂閱OPCUA內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合netty-mqtt-client實現(xiàn)Mqtt消息的訂閱和發(fā)布示例
- SpringBoot中使用MQTT實現(xiàn)消息的訂閱和發(fā)布(示例代碼)
- SpringBoot?Redis?發(fā)布訂閱模式(Pub/Sub)的具體使用
- springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案
- Springboot Websocket Stomp 消息訂閱推送
- SpringBoot+Redis實現(xiàn)消息的發(fā)布與訂閱的示例代碼
- SpringBoot 集成MQTT實現(xiàn)消息訂閱的詳細(xì)代碼
- SpringBoot整合Redis實現(xiàn)消息發(fā)布與訂閱的示例代碼
相關(guān)文章
在Spring Boot中淺嘗內(nèi)存泄漏的實戰(zhàn)記錄
本文給大家分享在Spring Boot中淺嘗內(nèi)存泄漏的實戰(zhàn)記錄,結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04
基于SpringBoot后端導(dǎo)出Excel文件的操作方法
這篇文章給大家介紹了基于SpringBoot后端導(dǎo)出Excel文件的操作方法,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02
Spring如何使用AOP實現(xiàn)聲明式事務(wù)管理
Spring?使用?AOP?實現(xiàn)聲明式事務(wù)管理是其最強大的功能之一,這篇文章小編將詳細(xì)拆解這個過程,從高層概念到底層原理,感興趣的小伙伴可以參考一下2025-06-06
ShardingSphere JDBC強制路由使用的項目實踐
在某些特定場景下,可能需要繞過分片規(guī)則直接定位到特定的數(shù)據(jù)庫或表,這種情況下就可以使用HintRouting,本文就來介紹一下ShardingSphere JDBC強制路由使用的項目實踐,感興趣的可以了解一下2024-06-06
Java圖形化界面設(shè)計之布局管理器之BorderLayout案例詳解
這篇文章主要介紹了Java圖形化界面設(shè)計之布局管理器之BorderLayout案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Spring @Valid和@Validated區(qū)別和用法實例
這篇文章主要介紹了Spring @Valid和@Validated區(qū)別和用法實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
基于Spring Validation實現(xiàn)全局參數(shù)校驗異常處理的示例詳解
在 Spring Boot 項目開發(fā)中,接口參數(shù)校驗是保障數(shù)據(jù)合法性的關(guān)鍵環(huán)節(jié),Spring Validation 提供了便捷的參數(shù)校驗?zāi)芰?下面我們就來看看具體的實現(xiàn)方法吧2025-08-08
springsecurity第三方授權(quán)認(rèn)證的項目實踐
Spring security 是一個強大的和高度可定制的身份驗證和訪問控制框架,本文主要介紹了springsecurity第三方授權(quán)認(rèn)證的項目實踐,具有一定的參考價值,感興趣可以了解一下2023-08-08

