微信小程序实现lot开发07 java网络通信控制继电器

继电器型号:网络继电器,支持云端开发,可以连接阿里云物联网控制台,避免内网与外网之间的网络连接的问题,做隧道的两端都只能是具备网络计算能力的虚拟终端,网络继电器不属于这一类。

TCP协议:可靠传输,三次握手(连接),四次挥手(断开),目的就是确保信息收发双方都稳定在线,可以及时收发信息,保证信息传输的可靠性。

A---------发信息------>B:A说你好我要发信息了,你准备好了吗? B说你好我可以接收。A说那我发过去+信息。

A-----断开-----B,A说你还在吗?B说我还在。A说那我断开了,B说OK。

java网络通信的知识点去创建一个可靠的TCP连接通道,实现数据的可靠传输。

以下代码是控制代码,为实现解耦合,我在前面的springboot项目里单独创建了一个辅助的工具组件单独负责发送控制信息(常开,常关,延时关):

package com.hlc.utils;/*
    User: 黄林春
    Date: 2022/7/18
    Time: 周一
    Project_Name: springDemo712
    */


import java.io.*;
import java.net.*;

/***
 * 控制继电器吸合辅助工具类
 */
public class NetAndIoController {
    /*读写缓冲区*/
    private   BufferedReader reader;
    private   BufferedWriter writer;
    private   Socket client;
    private ServerSocket server;
    /*控制电源输出端口号*/
    public    int outSign;
    /*控制主机端口号:0~65535 去掉主要的计算机运行接口 */
    public    int serverPort;
    public  void TcpConnection(){
        try{
            /*主机所使用的端口,需要在硬件配置里设置好主机的目的IP与端口号*/
            server = new ServerSocket(serverPort);
            /*连接服务*/
            client = server.accept();
            System.out.println("连接成功");
            String clientAddress = client.getRemoteSocketAddress().toString().substring(1);
            String[] clientAddresses = clientAddress.split(":");
            System.out.println("客户端IP"+clientAddresses[0]+"端口"+clientAddresses[1]);
            reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        }catch (IOException e) {
//            e.printStackTrace();
            System.out.println("----------------------目前的TCP链接并没有断开,依旧使用旧链接-------------------------");
        }
    }

    /*这里的输出口号outSign决定我们去控制那个口的常开吸合*/
    public  void sendOpenControllerMsg(){
        System.out.println("控制继电器通道常开吸合发送:AT+STACHn=1\\r\\n");
        String msg = "AT+STACH"+outSign+"=1\r\n";
        try {
            /*发送数据(主机输出信息口等于继电器的网口输入口)*/
            System.out.println("主机发送控制常开指令"+msg);
            writer.write(msg);
            writer.flush();
            /*读数据(继电器收到指令会做出应答,如果应答OK就是执行正常)*/
            msg = reader.readLine();
            msg = msg.replace("\r\n","\\r\\n");
            System.out.println("网络继电器应答"+msg);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*这里的输出口号决定我们控制那个口的常关吸合*/
    public  void sendDownControllerMsg(){
        System.out.println("控制继电器通道常关吸合发送:AT+STACHn=0\\r\\n");
        String msg = "AT+STACH"+outSign+"=0\r\n";
        try{
            System.out.println("主机发送控制常开指令"+msg);
            writer.write(msg);
            writer.flush();
            msg =  reader.readLine();
            msg = msg.replace("\r\n","\\r\\n");
            System.out.println("网络继电器应答"+msg);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /*控制开关限时吸合*/
    public void sendDelayOpenControllerMsg(){
        System.out.println("控制继电器通道开启后延时关闭发送:AT+STACHn=3,10\\r\\n");
        String msg = "AT+STACH"+outSign+"=3,10\r\n";
        try{
            System.out.println("主机发送控制常开指令"+msg);
            writer.write(msg);
            writer.flush();
            msg =  reader.readLine();
            msg = msg.replace("\r\n","\\r\\n");
            System.out.println("网络继电器应答"+msg);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public  void shutClient(){
        try{
            System.out.println("关闭客户端连接");
            if (reader != null)
                reader.close();
            if (writer != null)
                writer.close();
            if (client != null)
                client.close();
            if (server != null)
                server.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这里的简单的组件代码,就是负责实现这三个控制功能的,但是这个测试有一个问题,就是测试的设备参数里的目的IP与目的端口都得配置为测试主机的IP与6000端口,这里你可以选用cmd黑窗口输入ipconfig查看主机ip地址。

需要注意的是:如果不关闭当前连接,每次默认发送信息的时候就会用同一条通道,但是如果只关闭了两个缓冲流,那么你连信息都发不了。关闭连接会导致每次都要重新连接,时间上要求的话可以对频繁操作的设备进行同一条连接的控制。

你可能感兴趣的:(java基础学习,springboot,java,开发语言)