继电器型号:网络继电器,支持云端开发,可以连接阿里云物联网控制台,避免内网与外网之间的网络连接的问题,做隧道的两端都只能是具备网络计算能力的虚拟终端,网络继电器不属于这一类。
TCP协议:可靠传输,三次握手(连接),四次挥手(断开),目的就是确保信息收发双方都稳定在线,可以及时收发信息,保证信息传输的可靠性。
A---------发信息------>B:A说你好我要发信息了,你准备好了吗? B说你好我可以接收。A说那我发过去+信息。
A-----断开-----B,A说你还在吗?B说我还在。A说那我断开了,B说OK。
java网络通信的知识点去创建一个可靠的TCP连接通道,实现数据的可靠传输。
以下代码是控制代码,为实现解耦合,我在前面的springboot项目里单独创建了一个辅助的工具组件单独负责发送控制信息(常开,常关,延时关):
package com.hlc.utils;
import java.io.*;
import java.net.*;
public class NetAndIoController {
private BufferedReader reader;
private BufferedWriter writer;
private Socket client;
private ServerSocket server;
public int outSign;
public int serverPort;
public void TcpConnection(){
try{
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链接并没有断开,依旧使用旧链接-------------------------");
}
}
public void sendOpenControllerMsg(){
System.out.println("控制继电器通道常开吸合发送:AT+STACHn=1\r\n");
String msg = "AT+STACH"+outSign+"=1rn";
try {
System.out.println("主机发送控制常开指令"+msg);
writer.write(msg);
writer.flush();
msg = reader.readLine();
msg = msg.replace("rn","\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+"=0rn";
try{
System.out.println("主机发送控制常开指令"+msg);
writer.write(msg);
writer.flush();
msg = reader.readLine();
msg = msg.replace("rn","\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,10rn";
try{
System.out.println("主机发送控制常开指令"+msg);
writer.write(msg);
writer.flush();
msg = reader.readLine();
msg = msg.replace("rn","\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地址。
需要注意的是:如果不关闭当前连接,每次默认发送信息的时候就会用同一条通道,但是如果只关闭了两个缓冲流,那么你连信息都发不了。关闭连接会导致每次都要重新连接,时间上要求的话可以对频繁操作的设备进行同一条连接的控制。



