Java版opc client

本文介绍了如何使用Java开发OPC UA客户端,包括创建客户端、遍历节点、读取和写入节点数据,并详细阐述了将数据直接存储到MySQL与TDengine数据库的过程。同时,讲解了如何订阅单个节点数据并将其推送至Kafka,以及批量订阅数据的处理方法。
摘要由CSDN通过智能技术生成

创建OPC UA客户端

 /**
     *
     *
     * 创建OPC UA客户端
     * @return
     * @throws Exception
     */
    private static OpcUaClient createClient() throws Exception {
   
        //opc ua服务端地址

        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(500))
                                .build()
        );
    }

遍历树形节点

 /**
     * 遍历树形节点
     *
     * @param client OPC UA客户端
     * @param uaNode 节点
     * @throws Exception
     */
    private static void browseNode(OpcUaClient client, UaNode uaNode) throws Exception {
   
        List<? extends UaNode> 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
     */
    private static void readNode(OpcUaClient client) throws Exception {
   
        int namespaceIndex = 2;
        String identifier = "通道 1.设备 1.TT1";
        //节点
        NodeId nodeId = new NodeId(namespaceIndex, identifier);
        //读取节点数据
        DataValue value = client.readValue(0.0, TimestampsToReturn.Neither, nodeId).get();
        //标识符
        identifier = String.valueOf(nodeId.getIdentifier());
        System.out.println(identifier + ": " + value.getServerTime() + value.getValue().getValue());
    }

直接存储节点数据到mysql

    public static PreparedStatement ps;
    public static Connection con;

    /**
     * 存储节点数据到mysql
     *
     * @param client OPC UA客户端
     * @throws Exception
     */
    private static void cunchuNode(OpcUaClient client) throws Exception {
   
        Class.forName("com.mysql.cj.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/opc_test?seUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC", "root", "123456");

        System.out.println("数据库连接成功");

        int namespaceIndex = 2;
        String identifier = "通道 1.设备 1.TT1";
        //节点
        NodeId nodeId = new NodeId(namespaceIndex, identifier);
        //读取节点数据
        DataValue value = client.readValue(0.0, TimestampsToReturn.Server, nodeId).get();
        //标识符
        identifier = String.valueOf(nodeId.getIdentifier());
        Date javaDate = value.getServerTime().getJavaDate();
        System.out.println(identifier + ": " + stampToDate(String.valueOf(value.getServerTime().getJavaTime())) + "   " + value.getValue().getValue());
        System.out.println("time:" + javaDate);

        String s1 = "insert into test_table1(tag1, tag2) values(?, ?)";
        ps = con.prepareStatement(s1);

//        System.out.println("1");

        ps.setString(1, String.valueOf(value.getValue().getValue()));
        ps.setString(2, String.valueOf(value.getValue(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值