//package org.jeecg.modules.dry.common; // //import lombok.extern.slf4j.Slf4j; //import org.eclipse.milo.opcua.sdk.client.OpcUaClient; //import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider; //import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscription; //import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscriptionManager; //import org.eclipse.milo.opcua.sdk.client.nodes.UaNode; //import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedDataItem; //import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedSubscription; //import org.eclipse.milo.opcua.stack.core.AttributeId; //import org.eclipse.milo.opcua.stack.core.Identifiers; //import org.eclipse.milo.opcua.stack.core.UaException; //import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy; //import org.eclipse.milo.opcua.stack.core.types.builtin.*; //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 java.nio.file.Files; //import java.nio.file.Path; //import java.nio.file.Paths; //import java.util.ArrayList; //import java.util.List; //import java.util.Objects; //import java.util.concurrent.CountDownLatch; //import java.util.concurrent.atomic.AtomicInteger; // // //@Slf4j //public class OPCUA { // // private static AtomicInteger atomic = new AtomicInteger(1); // // 定义服务端地址 // private final static String endPointUrl = "opc.tcp://127.0.0.1:49320"; // // // /** // * 创建OPC UA客户端 // * @return // * @throws Exception // */ // public static OpcUaClient createClient() throws Exception { // // 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); // } // return 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(5000)) // .build() // ); // } // // /** // * 遍历树形节点 // * // * @param client OPC UA客户端 // * @param uaNode 节点 // * @throws Exception // */ // public static void browseNode(OpcUaClient client, UaNode uaNode) throws Exception { // List nodes; // if (uaNode == null) { // nodes = client.getAddressSpace().browseNodes(Identifiers.ObjectsFolder); // } else { // nodes = client.getAddressSpace().browseNodes(uaNode); // } // for (UaNode nd : nodes) { // //排除系统行性节点,这些系统性节点名称一般都是以"_"开头 // if (Objects.requireNonNull(nd.getBrowseName().getName()).contains("_")) { // continue; // } // System.out.println("Node= " + nd.getBrowseName().getName()); // browseNode(client, nd); // } // } // // // /** // * 读取节点数据 // * // * @param client OPC UA客户端 // * @throws Exception // */ // public static void readNode(OpcUaClient client) throws Exception { // int namespaceIndex = 2; // String identifier = "TD-01.SB-01.AG-01"; // //节点 // NodeId nodeId = new NodeId(namespaceIndex, identifier); // //读取节点数据 // DataValue value = client.readValue(0.0, TimestampsToReturn.Neither, nodeId).get(); // // System.out.println(identifier + ": " + String.valueOf(value.getValue().getValue())); // } // // // /** // * 写入节点数据 // * // * @param client // * @throws Exception // */ // public static void writeNodeValue(OpcUaClient client) throws Exception { // //节点 // NodeId nodeId = new NodeId(2, "TD-01.SB-01.AG-01"); // short i = 3; // //创建数据对象,此处的数据对象一定要定义类型,不然会出现类型错误,导致无法写入 // DataValue nowValue = new DataValue(new Variant(i), null, null); // //写入节点数据 // StatusCode statusCode = client.writeValue(nodeId, nowValue).join(); // System.out.println("结果:" + statusCode.isGood()); // } // // // /** // * 订阅(单个) // * // * @param client // * @throws Exception // */ // public static void subscribe(OpcUaClient client) throws Exception { // //创建发布间隔1000ms的订阅对象 // client // .getSubscriptionManager() // .createSubscription(1000.0) // .thenAccept(t -> { // //节点 // NodeId nodeId = new NodeId(2, "TD-01.SB-01.AG-01"); // 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); // List 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(); // // //持续订阅 // Thread.sleep(Long.MAX_VALUE); // } // // // /** // * 批量订阅 // * // * @param client // * @throws Exception // */ //// private static void managedSubscriptionEvent(OpcUaClient client) throws Exception { //// final CountDownLatch eventLatch = new CountDownLatch(1); //// //// //处理订阅业务 //// handlerNode(client); //// //// //持续监听 //// eventLatch.await(); //// } // // /** // * 处理订阅业务 // * // * @param client OPC UA客户端 // */ // public static void handlerNode(OpcUaClient client) { // try { // //创建订阅 // ManagedSubscription subscription = ManagedSubscription.create(client); // // //你所需要订阅的key // List key = new ArrayList<>(); // key.add("通道 1.设备 1.标记 1"); // key.add("通道 1.设备 1.标记 2"); // // List nodeIdList = new ArrayList<>(); // for (String s : key) { // nodeIdList.add(new NodeId(2, s)); // } // // //监听 // List dataItemList = subscription.createDataItems(nodeIdList); // for (ManagedDataItem managedDataItem : dataItemList) { // managedDataItem.addDataValueListener((t) -> { // System.out.println(managedDataItem.getNodeId().getIdentifier().toString() + ":" + t.getValue().getValue().toString()); // }); // } // } catch (Exception e) { // e.printStackTrace(); // } // } // // /** // * 自定义订阅监听 // */ // public static class CustomSubscriptionListener implements UaSubscriptionManager.SubscriptionListener { // // private OpcUaClient client; // // CustomSubscriptionListener(OpcUaClient client) { // this.client = client; // } // // public void onKeepAlive(UaSubscription subscription, DateTime publishTime) { // log.debug("onKeepAlive"); // } // // public void onStatusChanged(UaSubscription subscription, StatusCode status) { // log.debug("onStatusChanged"); // } // // public void onPublishFailure(UaException exception) { // log.debug("onPublishFailure"); // } // // public void onNotificationDataLost(UaSubscription subscription) { // log.debug("onNotificationDataLost"); // } // // /** // * 重连时 尝试恢复之前的订阅失败时 会调用此方法 // * @param uaSubscription 订阅 // * @param statusCode 状态 // */ // public void onSubscriptionTransferFailed(UaSubscription uaSubscription, StatusCode statusCode) { // log.debug("恢复订阅失败 需要重新订阅"); // //在回调方法中重新订阅 // handlerNode(client); // } // } // // /** // * 批量订阅 // * // * @param client // * @throws Exception // */ // public static void managedSubscriptionEvent(OpcUaClient client) throws Exception { // final CountDownLatch eventLatch = new CountDownLatch(1); // // //添加订阅监听器,用于处理断线重连后的订阅问题 // client.getSubscriptionManager().addSubscriptionListener(new CustomSubscriptionListener(client)); // // //处理订阅业务 // handlerNode(client); // // //持续监听 // eventLatch.await(); // } //}