继电器型号:网络继电器,支持云端开发,可以连接阿里云物联网控制台,避免内网与外网之间的网络连接的问题,做隧道的两端都只能是具备网络计算能力的虚拟终端,网络继电器不属于这一类。
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地址。
需要注意的是:如果不关闭当前连接,每次默认发送信息的时候就会用同一条通道,但是如果只关闭了两个缓冲流,那么你连信息都发不了。关闭连接会导致每次都要重新连接,时间上要求的话可以对频繁操作的设备进行同一条连接的控制。