关于Java对接温度、雷达液位传感器相关案例
一、需求
在SpringBoot项目中调用硬件厂商的仪器获取温度、高度等相关数据
二、了解通讯协议
根据硬件厂商通讯协议:
使用通信协议读取:(单位mm)
01 02 17 17 00 01 22 0F
回复:01 02 07 00 00 00 1D 3F 3F
料高数据为0X 00 1D 解析十进制为 29 单位mm
解析:只需要获取00 1D这四个16进制字符,进行10进制转换
三、请求案例
1、Socket请求
/****
* 使用Socket向相应ip:port发送指令
* @param ip 设备ip
* @param port 设备端口
* @param sendHex 请求指令
* @return 设备回复信息
*/
public static byte[] sendCmdLiquidHeight(String ip, Integer port, String sendHex) {
// 接收响应处理
byte[] recvData = new byte[1024];
try {
// 创建未连接的 Socket 对象
Socket socket = new Socket();
// 设置连接超时(5 秒)
socket.connect(new InetSocketAddress(ip, port), 5000); //
// 设置读取超时(3 秒)
socket.setSoTimeout(3000); //
try (OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream()) {
// 发送指令
byte[] sendData = hexToByte(sendHex, ' ');
out.write(sendData);
out.flush();
logger.info("发送指令:" + sendData);
// 接收响应(受 setSoTimeout 控制)
int bytesRead = in.read(recvData); // 若超时抛出 SocketTimeoutException
String recvHex = bytesToHex(recvData, bytesRead);
logger.info("接收响应:" + recvHex);
}
} catch (SocketTimeoutException e) {
logger.error("操作超时: " + e.getMessage()); //
} catch (IOException e) {
logger.error("IOException: "); //
e.printStackTrace();
}
return recvData;
}
/**
十六进制字符串转字节数组(支持分隔符)
关键点说明:
输入处理:接受类似 "01 03 10 16" 格式的字符串(分隔符由参数 split 指定)
分割操作:使用指定分隔符将字符串拆分成十六进制片段数组
字节转换:每个十六进制字符串(如 "1D")会被转换为对应的字节(0x1D)
返回值:包含所有字节的数组,用于后续 Modbus 协议通信
示例转换: 输入 "01 A3 FF" 分隔符为空格时,输出字节数组 [0x01, 0xA3, 0xFF]
*/
private static byte[] hexToByte(String hexString, char split) {
// 将十六进制字符串按指定分隔符拆分成数组
String[] hexArray = hexString.trim().split(String.valueOf(split));
// 创建与分割后数组长度相同的字节数组
byte[] data = new byte[hexArray.length];
// 遍历每个十六进制字符串片段
for (int i = 0; i < hexArray.length; i++) {
// 将十六进制字符串转换为整数,再强制转换为字节
data[i] = (byte) Integer.parseInt(hexArray[i], 16);
}
return data;
}
X
2、解析返回字节
/**
* 解析液位数据
*/
public static int parseYeWeiData(byte[] data) {
// 例如:输入 01 02 07 00 00 00 1D 3F 3F
int startPos = 5;
/*
跳过前5个数据字节 00 1D 3F 3F
data[5] = 00
data[6] = 1D
00 表示为二进制 00000000
0xff 表示为二进制 11111111
00000000 & 11111111 = 00000000 -> 0
1D 表示为二进制 00011101
0xff 表示为二进制 11111111
00000000 & 11111111 = 00011101 -> (0001)16+ (1101)13=29
*/
int highByte = data[startPos] & 0xFF; // 消除符号位影响
int lowByte = data[startPos + 1] & 0xFF;
// 组合成16位整数(大端序)
return (highByte << 8) | lowByte;
}

浙公网安备 33010602011771号