springboot連接訂閱OPCUA數(shù)據(jù)的實(shí)現(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); // 線程休眠一下再返回對(duì)象,給創(chuàng)建過程一個(gè)時(shí)間。
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();
//單個(gè)訂閱
@SneakyThrows
public void subscribe(OpcUaClient client) {
client
.getSubscriptionManager()
.createSubscription(1000.0)
.thenAccept(t -> {
//節(jié)點(diǎn)
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)控項(xiàng)請(qǐng)求
//該請(qǐng)求最后用于創(chuàng)建訂閱。
MonitoredItemCreateRequest request = new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters);
List<MonitoredItemCreateRequest> requests = new ArrayList<>();
requests.add(request);
//創(chuàng)建監(jiān)控項(xiàng),并且注冊(cè)變量值改變時(shí)候的回調(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)控項(xiàng)請(qǐng)求
//創(chuàng)建發(fā)布間隔1000ms的訂閱對(duì)象
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)控項(xiàng),并且注冊(cè)變量值改變時(shí)候的回調(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的訂閱對(duì)象
System.out.println("執(zhí)行訂閱");
this.createSubscription();
}catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
}
}
}
到此這篇關(guān)于springboot連接訂閱OPCUA數(shù)據(jù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)springboot連接訂閱OPCUA內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合netty-mqtt-client實(shí)現(xiàn)Mqtt消息的訂閱和發(fā)布示例
- SpringBoot中使用MQTT實(shí)現(xiàn)消息的訂閱和發(fā)布(示例代碼)
- SpringBoot?Redis?發(fā)布訂閱模式(Pub/Sub)的具體使用
- springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案
- Springboot Websocket Stomp 消息訂閱推送
- SpringBoot+Redis實(shí)現(xiàn)消息的發(fā)布與訂閱的示例代碼
- SpringBoot 集成MQTT實(shí)現(xiàn)消息訂閱的詳細(xì)代碼
- SpringBoot整合Redis實(shí)現(xiàn)消息發(fā)布與訂閱的示例代碼
相關(guān)文章
在Spring Boot中淺嘗內(nèi)存泄漏的實(shí)戰(zhàn)記錄
本文給大家分享在Spring Boot中淺嘗內(nèi)存泄漏的實(shí)戰(zhàn)記錄,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04
基于SpringBoot后端導(dǎo)出Excel文件的操作方法
這篇文章給大家介紹了基于SpringBoot后端導(dǎo)出Excel文件的操作方法,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02
Spring如何使用AOP實(shí)現(xiàn)聲明式事務(wù)管理
Spring?使用?AOP?實(shí)現(xiàn)聲明式事務(wù)管理是其最強(qiáng)大的功能之一,這篇文章小編將詳細(xì)拆解這個(gè)過程,從高層概念到底層原理,感興趣的小伙伴可以參考一下2025-06-06
ireport數(shù)據(jù)表格報(bào)表的簡(jiǎn)單使用
這篇文章給大家介紹了如何畫一個(gè)報(bào)表模板,這里介紹下畫表格需要用到的組件,文中通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-10-10
ShardingSphere JDBC強(qiáng)制路由使用的項(xiàng)目實(shí)踐
在某些特定場(chǎng)景下,可能需要繞過分片規(guī)則直接定位到特定的數(shù)據(jù)庫(kù)或表,這種情況下就可以使用HintRouting,本文就來介紹一下ShardingSphere JDBC強(qiáng)制路由使用的項(xiàng)目實(shí)踐,感興趣的可以了解一下2024-06-06
Java圖形化界面設(shè)計(jì)之布局管理器之BorderLayout案例詳解
這篇文章主要介紹了Java圖形化界面設(shè)計(jì)之布局管理器之BorderLayout案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Spring @Valid和@Validated區(qū)別和用法實(shí)例
這篇文章主要介紹了Spring @Valid和@Validated區(qū)別和用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
基于Spring Validation實(shí)現(xiàn)全局參數(shù)校驗(yàn)異常處理的示例詳解
在 Spring Boot 項(xiàng)目開發(fā)中,接口參數(shù)校驗(yàn)是保障數(shù)據(jù)合法性的關(guān)鍵環(huán)節(jié),Spring Validation 提供了便捷的參數(shù)校驗(yàn)?zāi)芰?下面我們就來看看具體的實(shí)現(xiàn)方法吧2025-08-08
java命令調(diào)用虛擬機(jī)方法總結(jié)
在本篇文章里我們給大家整理了關(guān)于java中的java命令如何調(diào)用虛擬機(jī)的方法和具體步驟,需要的朋友們跟著操作下。2019-05-05
springsecurity第三方授權(quán)認(rèn)證的項(xiàng)目實(shí)踐
Spring security 是一個(gè)強(qiáng)大的和高度可定制的身份驗(yàn)證和訪問控制框架,本文主要介紹了springsecurity第三方授權(quán)認(rèn)證的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣可以了解一下2023-08-08

