|
|
|
@ -14,6 +14,7 @@ import org.springframework.context.ApplicationContext;
|
|
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
|
//import purejavacomm.SerialPort;
|
|
|
|
|
import gnu.io.SerialPort; |
|
|
|
|
|
|
|
|
|
import java.nio.ByteBuffer; |
|
|
|
|
import java.nio.charset.StandardCharsets; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
@ -29,10 +30,10 @@ import java.util.List;
|
|
|
|
|
@Slf4j |
|
|
|
|
public class SerialPortSingle { |
|
|
|
|
|
|
|
|
|
public SerialPort serialPort = null; |
|
|
|
|
private String receiveStr = null; |
|
|
|
|
private int baudrate=9600; |
|
|
|
|
private String parity=null; |
|
|
|
|
public SerialPort serialPort = null; |
|
|
|
|
private String receiveStr = null; |
|
|
|
|
private int baudrate = 9600; |
|
|
|
|
private String parity = null; |
|
|
|
|
|
|
|
|
|
// 调用service
|
|
|
|
|
ApplicationContext context = SpringBeanUtil.getApplicationContext(); |
|
|
|
@ -41,107 +42,111 @@ public class SerialPortSingle {
|
|
|
|
|
DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); |
|
|
|
|
NowDataService nowDataService = context.getBean(NowDataService.class); |
|
|
|
|
BuildingService buildingService = context.getBean(BuildingService.class); |
|
|
|
|
public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity){ |
|
|
|
|
|
|
|
|
|
public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity) { |
|
|
|
|
|
|
|
|
|
//查看所有串口
|
|
|
|
|
SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); |
|
|
|
|
ArrayList<String> port = serialPortUtil.findPort(); |
|
|
|
|
// SerialTool serialPortUtil = SerialTool.getSerialPortUtil();
|
|
|
|
|
// ArrayList<String> port = serialPortUtil.findPort();
|
|
|
|
|
String rtData=""; |
|
|
|
|
String rtData = ""; |
|
|
|
|
// System.out.println("发现全部串口:" + port);
|
|
|
|
|
String comName=deviceCodeParamEntity.getDataCom().toUpperCase(); |
|
|
|
|
if (port.contains(comName)){ |
|
|
|
|
try{ |
|
|
|
|
try{ |
|
|
|
|
baudrate=deviceCodeParamEntity.getBaudrate(); |
|
|
|
|
parity=deviceCodeParamEntity.getParity(); |
|
|
|
|
if (parity==null || parity.equals("") || parity.equalsIgnoreCase("none")){ |
|
|
|
|
serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); |
|
|
|
|
}else{ |
|
|
|
|
serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); |
|
|
|
|
} |
|
|
|
|
//向串口发送指令
|
|
|
|
|
log.info("-----------------------------单抄向串口"+serialPort+"发送指令!-----------------------------"); |
|
|
|
|
SendOrderUtils.sendSerialPort(deviceCodeParamEntity, serialPort); |
|
|
|
|
Thread.sleep(1500); |
|
|
|
|
}catch(Exception e){ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
//对返回数据进行相关解析处理
|
|
|
|
|
receiveStr=null; |
|
|
|
|
byte[] bytes = serialPortUtil.readFromPort(serialPort); //读取串口数据
|
|
|
|
|
try { |
|
|
|
|
String byteStr = new String(bytes, 0, bytes.length).trim(); |
|
|
|
|
receiveStr = receiveStr + printHexString(bytes); |
|
|
|
|
//去掉空格和null
|
|
|
|
|
receiveStr = receiveStr.replace("null", ""); |
|
|
|
|
receiveStr = receiveStr.replace(" ", ""); |
|
|
|
|
log.info("串口"+serialPort+"接收数据:" + receiveStr + ",大小: " + receiveStr.length()); |
|
|
|
|
} catch (NullPointerException e) { |
|
|
|
|
serialPortUtil.closePort(serialPort); |
|
|
|
|
log.info("单抄串口"+serialPort+"异常,没有数据返回!关闭串口"); |
|
|
|
|
String comName = deviceCodeParamEntity.getDataCom().toUpperCase(); |
|
|
|
|
if (!port.contains(comName)) { |
|
|
|
|
log.info("串口:" + comName + "不存在!"); |
|
|
|
|
return "fail"; |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
try { |
|
|
|
|
baudrate = deviceCodeParamEntity.getBaudrate(); |
|
|
|
|
parity = deviceCodeParamEntity.getParity(); |
|
|
|
|
if (parity == null || parity.equals("") || parity.equalsIgnoreCase("none")) { |
|
|
|
|
serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); |
|
|
|
|
} else { |
|
|
|
|
serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); |
|
|
|
|
} |
|
|
|
|
//返回值全部变成大写
|
|
|
|
|
String receiveData = receiveStr.toUpperCase(); |
|
|
|
|
//截取去掉FE
|
|
|
|
|
String dataStr = receiveData.replace("FE", ""); |
|
|
|
|
String deviceType=deviceCodeParamEntity.getDeviceType(); |
|
|
|
|
String deviceAddr=deviceCodeParamEntity.getDeviceAddr(); |
|
|
|
|
String registerAddr=deviceCodeParamEntity.getRegisterAddr(); |
|
|
|
|
String brand=deviceCodeParamEntity.getBrand(); |
|
|
|
|
String buildingId=deviceCodeParamEntity.getBuildingId(); |
|
|
|
|
String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
|
|
|
|
|
//向串口发送指令
|
|
|
|
|
log.info("-----------------------------单抄向串口" + serialPort + "发送指令!-----------------------------"); |
|
|
|
|
SendOrderUtils.sendSerialPort(deviceCodeParamEntity, serialPort); |
|
|
|
|
Thread.sleep(1500); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("前端设置出现异常==>", e); |
|
|
|
|
return "fail"; |
|
|
|
|
} |
|
|
|
|
//对返回数据进行相关解析处理
|
|
|
|
|
receiveStr = null; |
|
|
|
|
byte[] bytes = serialPortUtil.readFromPort(serialPort); //读取串口数据
|
|
|
|
|
if (null == bytes) { |
|
|
|
|
serialPortUtil.closePort(serialPort); |
|
|
|
|
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口"); |
|
|
|
|
return "fail"; |
|
|
|
|
} |
|
|
|
|
receiveStr = receiveStr + printHexString(bytes); |
|
|
|
|
//去掉空格和null
|
|
|
|
|
receiveStr = receiveStr.replace("null", ""); |
|
|
|
|
receiveStr = receiveStr.replace(" ", ""); |
|
|
|
|
log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length()); |
|
|
|
|
//返回值全部变成大写
|
|
|
|
|
String receiveData = receiveStr.toUpperCase(); |
|
|
|
|
//截取去掉FE
|
|
|
|
|
String dataStr = receiveData.replace("FE", ""); |
|
|
|
|
String deviceType = deviceCodeParamEntity.getDeviceType(); |
|
|
|
|
String deviceAddr = deviceCodeParamEntity.getDeviceAddr(); |
|
|
|
|
String registerAddr = deviceCodeParamEntity.getRegisterAddr(); |
|
|
|
|
String brand = deviceCodeParamEntity.getBrand(); |
|
|
|
|
String buildingId = deviceCodeParamEntity.getBuildingId(); |
|
|
|
|
String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称
|
|
|
|
|
|
|
|
|
|
deviceInstallService.updateOnline(deviceAddr,deviceType,buildingId,"在线"); //设备在线
|
|
|
|
|
log.info(deviceType+"在线,设备号:"+deviceAddr+",所属楼栋:"+buildingName); |
|
|
|
|
if (deviceType.equals("热泵")){ |
|
|
|
|
String strState=nowDataService.selectState(buildingId,deviceAddr); |
|
|
|
|
if (strState!=null && strState.equals("离线")){ //采集到数据
|
|
|
|
|
nowDataService.updateRunState(buildingId,deviceAddr,"不运行"); //监控界面状态表热泵在线状态
|
|
|
|
|
} |
|
|
|
|
deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线
|
|
|
|
|
log.info(deviceType + "在线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName); |
|
|
|
|
if (deviceType.equals("热泵")) { |
|
|
|
|
String strState = nowDataService.selectState(buildingId, deviceAddr); |
|
|
|
|
if (strState != null && strState.equals("离线")) { //采集到数据
|
|
|
|
|
nowDataService.updateRunState(buildingId, deviceAddr, "不运行"); //监控界面状态表热泵在线状态
|
|
|
|
|
} |
|
|
|
|
try{ |
|
|
|
|
if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { |
|
|
|
|
rtData=analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length()==40 || dataStr.length()==50) && deviceType.equals("电表")) { |
|
|
|
|
rtData=analysisReceiveOrder485.analysisMeterOrder4852(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} else if (deviceType.equals("压变")) { |
|
|
|
|
rtData=analysisReceiveOrder485.analysisPressureOrder4852(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统
|
|
|
|
|
analysisReceiveOrder485.analysisStateOrder485(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) { |
|
|
|
|
rtData=analysisReceiveOrder485.analysisRelayOrder4852(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} else if (deviceType.equals("热泵")) { |
|
|
|
|
rtData=analysisReceiveOrder485.analysisPumpOrder4852(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} else if (deviceType.equals("时控")) { |
|
|
|
|
rtData=analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} else if (deviceType.equals("水位开关") && registerAddr.equals("0010")){ //热泵状态
|
|
|
|
|
rtData=analysisReceiveOrder485.analysisPumpStateOrder2(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} else if (deviceType.equals("温度变送器")) { |
|
|
|
|
rtData=analysisReceiveOrder485.analysisMulTempOrder4852(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} else if (deviceType.equals("热泵状态")){ |
|
|
|
|
rtData=analysisReceiveOrder485.analysisPumpStateOrder2(dataStr,registerAddr,brand,buildingId); |
|
|
|
|
} |
|
|
|
|
}catch (Exception e){ |
|
|
|
|
log.error(deviceCodeParamEntity.getDeviceType()+"单抄保存数据库失败!"); |
|
|
|
|
serialPortUtil.closePort(serialPort); |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { |
|
|
|
|
rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) { |
|
|
|
|
rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} else if (deviceType.equals("压变")) { |
|
|
|
|
rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统
|
|
|
|
|
analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) { |
|
|
|
|
rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} else if (deviceType.equals("热泵")) { |
|
|
|
|
rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} else if (deviceType.equals("时控")) { |
|
|
|
|
rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) { //热泵状态
|
|
|
|
|
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} else if (deviceType.equals("温度变送器")) { |
|
|
|
|
rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} else if (deviceType.equals("热泵状态")) { |
|
|
|
|
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId); |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!"); |
|
|
|
|
serialPortUtil.closePort(serialPort); |
|
|
|
|
System.out.println("关闭"+serialPort); |
|
|
|
|
Thread.sleep(500); |
|
|
|
|
log.info("-----------------------------"+serialPort+"单抄结束!-----------------------------"); |
|
|
|
|
return rtData; |
|
|
|
|
}catch (Exception e){ |
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
return "fail"; |
|
|
|
|
} |
|
|
|
|
}else { |
|
|
|
|
log.info("串口:"+comName+"不存在!"); |
|
|
|
|
serialPortUtil.closePort(serialPort); |
|
|
|
|
System.out.println("关闭" + serialPort); |
|
|
|
|
Thread.sleep(500); |
|
|
|
|
log.info("-----------------------------" + serialPort + "单抄结束!-----------------------------"); |
|
|
|
|
return rtData; |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("前端设置出现异常==>", e); |
|
|
|
|
return "fail"; |
|
|
|
|
} |
|
|
|
|
return "fail"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 字节数组转16进制字符串 |
|
|
|
|
* |
|
|
|
|
* @param b 字节数组 |
|
|
|
|
* @return 16进制字符串 |
|
|
|
|
*/ |
|
|
|
@ -159,12 +164,13 @@ public class SerialPortSingle {
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 十六进制字符串转byte[] |
|
|
|
|
* |
|
|
|
|
* @param hex 十六进制字符串 |
|
|
|
|
* @return byte[] |
|
|
|
|
*/ |
|
|
|
|
public static byte[] hexStr2Byte(String hex) { |
|
|
|
|
if (hex == null) { |
|
|
|
|
return new byte[] {}; |
|
|
|
|
return new byte[]{}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 奇数位补0
|
|
|
|
@ -183,8 +189,10 @@ public class SerialPortSingle {
|
|
|
|
|
} |
|
|
|
|
return buffer.array(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 16进制转换成为string类型字符串 |
|
|
|
|
* |
|
|
|
|
* @param s 待转换字符串 |
|
|
|
|
*/ |
|
|
|
|
public static String hexStringToString(String s) { |
|
|
|
|