Browse Source

优化采集控制逻辑

prod_202403
mh 11 months ago
parent
commit
b2e336d43f
  1. 317
      user-service/src/main/java/com/mh/user/controller/SerialPortController.java
  2. 2
      user-service/src/main/java/com/mh/user/mapper/provider/NowDataProvider.java
  3. 12
      user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java
  4. 25
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java
  5. 240
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java
  6. 23
      user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java
  7. 60
      user-service/src/test/java/com/mh/user/chart/ChartTest.java

317
user-service/src/main/java/com/mh/user/controller/SerialPortController.java

@ -12,6 +12,7 @@ import com.mh.user.model.DeviceModel;
import com.mh.user.model.SerialPortModel;
import com.mh.user.serialport.SerialPortSendReceive;
import com.mh.user.serialport.SerialPortSingle;
import com.mh.user.serialport.SerialPortSingle2;
import com.mh.user.service.ControlSetService;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.NowDataService;
@ -46,7 +47,7 @@ public class SerialPortController {
@PostMapping(value = "/operate")
public HttpResult operateDevice(@RequestBody List<SerialPortModel> params) {
try {
SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类
SerialPortSingle2 serialPortSingle = new SerialPortSingle2(); //发送接收类
DeviceCodeParamEntity deviceCodeParam = new DeviceCodeParamEntity();//参数实体类
Constant.WEB_FLAG = true; //单抄,暂时停止采集
@ -75,11 +76,9 @@ public class SerialPortController {
deviceCodeParam.setBuildingId(buildingId);
String brand = deviceInstallEntity.getBrand();//品牌
deviceCodeParam.setBrand(brand);
ControlSetEntity controlData = new ControlSetEntity();
//设置设备实体对象
ControlSetEntity controlData = new ControlSetEntity();
controlData.setBuildingId(deviceInstallEntity.getBuildingId());
if (deviceType == null || deviceType.equals("") || deviceType.equals("热泵")) {
//设置热泵实体对象
PumpSetEntity pumpData = new PumpSetEntity();
@ -190,9 +189,11 @@ public class SerialPortController {
Constant.WEB_FLAG = false; //单抄,恢复采集
return HttpResult.ok();
} catch (Exception e) {
// e.printStackTrace();
log.error("前端发送控制异常==>", e);
Constant.WEB_FLAG = false; //单抄,恢复采集
return HttpResult.error(500, "fail");
} finally {
Constant.WEB_FLAG = false;
}
}
@ -201,7 +202,7 @@ public class SerialPortController {
@PostMapping(value = "/read")
public HttpResult readData(@RequestBody List<SerialPortModel> params) {
try {
SerialPortSingle serialPortSingle = new SerialPortSingle();
SerialPortSingle2 serialPortSingle = new SerialPortSingle2();
DeviceCodeParamEntity deviceCodeParam = new DeviceCodeParamEntity();
String rtData = ""; //返回值
Constant.WEB_FLAG = true; //单抄,暂时停止采集
@ -215,169 +216,169 @@ public class SerialPortController {
List<DeviceModel> list = deviceInstallService.selectDevices(buildingId, deviceType);
deviceAddr = list.get(0).getDeviceAddr();
}
if (deviceAddr != null && deviceAddr.length() > 0) {
DeviceInstallEntity deviceInstallEntity = deviceInstallService.selectDevice(deviceAddr, deviceType, buildingId);
//发送指令实体类
deviceCodeParam.setDeviceAddr(deviceAddr);
deviceCodeParam.setDeviceType(deviceType);
deviceCodeParam.setDataCom(deviceInstallEntity.getDataCom());
deviceCodeParam.setBaudrate(deviceInstallEntity.getBaudRate());
deviceCodeParam.setParity(deviceInstallEntity.getParity());
deviceCodeParam.setDataValue(serialPortModel.getDataValue());//传入相关参数值
deviceCodeParam.setBuildingId(buildingId);
String brand = deviceInstallEntity.getBrand();//品牌
deviceCodeParam.setBrand(brand);
//设置设备实体对象
ControlSetEntity controlData = new ControlSetEntity();
controlData.setBuildingId(deviceInstallEntity.getBuildingId());
if (deviceType == null || deviceType.equals("") || deviceType.equals("热泵")) {
//设置热泵实体对象
PumpSetEntity pumpData = new PumpSetEntity();
pumpData.setBuildingId(deviceInstallEntity.getBuildingId());
pumpData.setPumpId(deviceAddr);
if (param == null || param.equals("") || param.equals("读温度设定")) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (brand.equals("美的")) {
deviceCodeParam.setRegisterAddr("0642"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
if (!rtData.equals("")) {
pumpData.setTempSet(rtData);
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
} else if (param.equals("实际温度")) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (brand.equals("美的")) {
deviceCodeParam.setRegisterAddr("0007"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0064"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
if (!rtData.equals("")) {
pumpData.setWaterTemp(rtData);
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
} else if (param.equals("运行状态")) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (brand.equals("美的")) {
deviceCodeParam.setRegisterAddr("0641"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0BBD"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
//pumpData(rtData);
//pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
} else if (param.equals("时段1")) {
if (brand.equals("美的")) {
//发送指令
deviceCodeParam.setRegisterAddr("0656"); //寄存器地址
deviceCodeParam.setFunCode("03"); //功能码读数据
//保存数据
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
String time = rtData;
if (time.length() == 8) {
String statTime = time.substring(0, 2) + ":" + time.substring(2, 4);
String closeTime = time.substring(4, 6) + ":" + time.substring(6, 8);
pumpData.setStartTime1(statTime);
pumpData.setCloseTime1(closeTime);
}
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
} else if (param.equals("时段2")) {
if (brand.equals("美的")) {
//发送指令
deviceCodeParam.setRegisterAddr("065A"); //寄存器地址
deviceCodeParam.setFunCode("03"); //功能码读数据
//保存数据
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
String time = rtData;
if (time.length() == 8) {
String statTime = time.substring(0, 2) + ":" + time.substring(2, 4);
String closeTime = time.substring(4, 6) + ":" + time.substring(6, 8);
pumpData.setStartTime2(statTime);
pumpData.setCloseTime2(closeTime);
}
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
}
} else if (deviceType.equals("时控")) {
if (param.equals("L1")) {
deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D)
} else if (param.equals("L2")) {
deviceCodeParam.setRegisterAddr("000D");
if (deviceAddr == null || deviceAddr.length() == 0) {
Constant.WEB_FLAG = false;
return HttpResult.error("通讯ID为空!");
}
DeviceInstallEntity deviceInstallEntity = deviceInstallService.selectDevice(deviceAddr, deviceType, buildingId);
//发送指令实体类
deviceCodeParam.setDeviceAddr(deviceAddr);
deviceCodeParam.setDeviceType(deviceType);
deviceCodeParam.setDataCom(deviceInstallEntity.getDataCom());
deviceCodeParam.setBaudrate(deviceInstallEntity.getBaudRate());
deviceCodeParam.setParity(deviceInstallEntity.getParity());
deviceCodeParam.setDataValue(serialPortModel.getDataValue());//传入相关参数值
deviceCodeParam.setBuildingId(buildingId);
String brand = deviceInstallEntity.getBrand();//品牌
deviceCodeParam.setBrand(brand);
//设置设备实体对象
ControlSetEntity controlData = new ControlSetEntity();
controlData.setBuildingId(deviceInstallEntity.getBuildingId());
if (deviceType == null || deviceType.equals("") || deviceType.equals("热泵")) {
//设置热泵实体对象
PumpSetEntity pumpData = new PumpSetEntity();
pumpData.setBuildingId(deviceInstallEntity.getBuildingId());
pumpData.setPumpId(deviceAddr);
if (param == null || param.equals("") || param.equals("读温度设定")) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (brand.equals("美的")) {
deviceCodeParam.setRegisterAddr("0642"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0011");
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
}
deviceCodeParam.setFunCode("03"); //功能码读数据
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
String time = rtData;
if (time.length() == 16) {
//时段1
String statTime1 = time.substring(0, 2) + ":" + time.substring(2, 4);
String closeTime1 = time.substring(4, 6) + ":" + time.substring(6, 8);
//时段2
String statTime2 = time.substring(8, 10) + ":" + time.substring(10, 12);
String closeTime2 = time.substring(12, 14) + ":" + time.substring(14, 16);
if (param.equals("L1")) {
controlData.setUseStartTime1(statTime1);
controlData.setUseCloseTime1(closeTime1);
controlData.setUseStartTime2(statTime2);
controlData.setUseCloseTime2(closeTime2);
} else if (param.equals("L2")) {
controlData.setUseStartTime3(statTime1);
controlData.setUseCloseTime3(closeTime1);
controlData.setUseStartTime4(statTime2);
controlData.setUseCloseTime4(closeTime2);
} else {
controlData.setUseStartTime5(statTime1);
controlData.setUseCloseTime5(closeTime1);
controlData.setUseStartTime6(statTime2);
controlData.setUseCloseTime6(closeTime2);
}
if (!rtData.equals("")) {
pumpData.setTempSet(rtData);
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
controlSetService.saveControlSet(controlData); //保存设置内容
} else if (deviceType.equals("水位开关") && !param.equals("状态")) {
if (brand == null || brand.equals("") || brand.equals("中凯")) {//品牌
deviceCodeParam.setFunCode("17"); //功能码读
deviceCodeParam.setRegisterAddr("0017");
} else if (brand.equals("远向")) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0018");
} else if (brand.equals("顶威")) {
deviceCodeParam.setFunCode("0102"); //功能码读
deviceCodeParam.setRegisterAddr("0102");
} else if (param.equals("实际温度")) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (brand.equals("美的")) {
deviceCodeParam.setRegisterAddr("0007"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0064"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
deviceCodeParam.setDataValue(rtData);
//controlData.setLevelSet(serialPortModel.getDataValue());
//controlSetService.saveControlSet(controlData);
log.info("--------------读取返回数据:" + rtData + "------------------");
} else if (deviceType.equals("水位开关") && param.equals("状态")) {
if (brand.equals("远向")) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0010");
if (!rtData.equals("")) {
pumpData.setWaterTemp(rtData);
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
} else if (param.equals("运行状态")) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (brand.equals("美的")) {
deviceCodeParam.setRegisterAddr("0641"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0BBD"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
//pumpData(rtData);
//pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
} else if (param.equals("时段1")) {
if (brand.equals("美的")) {
//发送指令
deviceCodeParam.setRegisterAddr("0656"); //寄存器地址
deviceCodeParam.setFunCode("03"); //功能码读数据
//保存数据
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
String time = rtData;
if (time.length() == 8) {
String statTime = time.substring(0, 2) + ":" + time.substring(2, 4);
String closeTime = time.substring(4, 6) + ":" + time.substring(6, 8);
pumpData.setStartTime1(statTime);
pumpData.setCloseTime1(closeTime);
}
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
} else if (param.equals("时段2")) {
if (brand.equals("美的")) {
//发送指令
deviceCodeParam.setRegisterAddr("065A"); //寄存器地址
deviceCodeParam.setFunCode("03"); //功能码读数据
//保存数据
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
String time = rtData;
if (time.length() == 8) {
String statTime = time.substring(0, 2) + ":" + time.substring(2, 4);
String closeTime = time.substring(4, 6) + ":" + time.substring(6, 8);
pumpData.setStartTime2(statTime);
pumpData.setCloseTime2(closeTime);
}
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
}
} else if (deviceType.equals("时控")) {
if (param.equals("L1")) {
deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D)
} else if (param.equals("L2")) {
deviceCodeParam.setRegisterAddr("000D");
} else {
deviceCodeParam.setRegisterAddr("0011");
}
deviceCodeParam.setFunCode("03"); //功能码读数据
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
String time = rtData;
if (time.length() == 16) {
//时段1
String statTime1 = time.substring(0, 2) + ":" + time.substring(2, 4);
String closeTime1 = time.substring(4, 6) + ":" + time.substring(6, 8);
//时段2
String statTime2 = time.substring(8, 10) + ":" + time.substring(10, 12);
String closeTime2 = time.substring(12, 14) + ":" + time.substring(14, 16);
} else if (deviceType.equals("温度变送器")) {
if (param.equals("L1")) {
controlData.setUseStartTime1(statTime1);
controlData.setUseCloseTime1(closeTime1);
controlData.setUseStartTime2(statTime2);
controlData.setUseCloseTime2(closeTime2);
} else if (param.equals("L2")) {
controlData.setUseStartTime3(statTime1);
controlData.setUseCloseTime3(closeTime1);
controlData.setUseStartTime4(statTime2);
controlData.setUseCloseTime4(closeTime2);
} else {
controlData.setUseStartTime5(statTime1);
controlData.setUseCloseTime5(closeTime1);
controlData.setUseStartTime6(statTime2);
controlData.setUseCloseTime6(closeTime2);
}
}
controlSetService.saveControlSet(controlData); //保存设置内容
} else if (deviceType.equals("水位开关") && !param.equals("状态")) {
if (brand == null || brand.equals("") || brand.equals("中凯")) {//品牌
deviceCodeParam.setFunCode("17"); //功能码读
deviceCodeParam.setRegisterAddr("0017");
} else if (brand.equals("远向")) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0028");
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
} else if (deviceType.equals("压变")) {
deviceCodeParam.setRegisterAddr("0018");
} else if (brand.equals("顶威")) {
deviceCodeParam.setFunCode("0102"); //功能码读
deviceCodeParam.setRegisterAddr("0102");
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
deviceCodeParam.setDataValue(rtData);
//controlData.setLevelSet(serialPortModel.getDataValue());
//controlSetService.saveControlSet(controlData);
log.info("--------------读取返回数据:" + rtData + "------------------");
} else if (deviceType.equals("水位开关") && param.equals("状态")) {
if (brand.equals("远向")) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0004");
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
} else if (deviceType.equals("水表")) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);
} else if (deviceType.equals("电表")) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);
deviceCodeParam.setRegisterAddr("0010");
}
} else {
return HttpResult.error(500, "fail");
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
} else if (deviceType.equals("温度变送器")) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0028");
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
} else if (deviceType.equals("压变")) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0004");
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
} else if (deviceType.equals("水表")) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);
} else if (deviceType.equals("电表")) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);
}
}
Constant.WEB_FLAG = false; //单抄,恢复采集
@ -394,6 +395,8 @@ public class SerialPortController {
} catch (Exception e) {
Constant.WEB_FLAG = false; //单抄,恢复采集
return HttpResult.error(500, "fail");
} finally {
Constant.WEB_FLAG = false; //单抄,恢复采集
}
}

2
user-service/src/main/java/com/mh/user/mapper/provider/NowDataProvider.java

@ -173,6 +173,7 @@ public class NowDataProvider {
StringBuffer sql = new StringBuffer("");
sql.append("select top 1000 * from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" +
"select top 1000 t1.cur_date,t1.building_id,t2.building_name,t2.sort,convert(decimal(8,1),AVG(convert(float,t1.temp00)))as temp00," +
"convert(decimal(8,1),AVG(convert(float,t1.temp02)))as temp02," +
"convert(decimal(8,1),AVG(convert(float,t1.temp08)))as temp08,convert(decimal(8,1),AVG(convert(float,t1.temp11)))as temp11," +
"convert(decimal(8,1),AVG(convert(float,t1.temp13)))as temp13,convert(decimal(8,1),AVG(convert(float,t1.temp15)))as temp15," +
"convert(decimal(8,1),AVG(convert(float,t1.temp16)))as temp16,convert(decimal(8,1),AVG(convert(float,t1.temp17)))as temp17," +
@ -188,7 +189,6 @@ public class NowDataProvider {
} else if (page == 0){
sql.append(" )T )TT order by TT.cur_date desc ");
}
// System.out.println(sql.toString());
return sql.toString();
}

12
user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java

@ -47,20 +47,8 @@ public class SerialPortSendReceive2 {
public void serialPortSend(String sort, String thread) {
SerialPort serialPort = null;
CacheUtil cacheUtil = CacheUtil.getInstance();
// if (port.contains(comName)){
try {
//生成对应的采集指令
// switch (sort) {
// case "2": //采集水、电、运行状态!
// deviceManageEntityList = deviceCodeParamService.queryCodeParam4(thread);
// break;
// case "3": //采集设定温度、设定水位、故障状态!
// deviceManageEntityList = deviceCodeParamService.queryCodeParam5(thread);
// break;
// default:
// deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread);
// break;
// }
List<DeviceCodeParamEntity> deviceParamsByType = cacheUtil.getDeviceParamsByType(sort);
deviceManageEntityList = deviceParamsByType
.parallelStream()

25
user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java

@ -108,39 +108,40 @@ public class SerialPortSingle {
}
try {
if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId);
rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) {
rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId);
rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("压变")) {
rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId);
rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统
analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) {
rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId);
rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵")) {
rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId);
rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("时控")) {
rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId);
rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) { //热泵状态
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId);
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("温度变送器")) {
rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId);
rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵状态")) {
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId);
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
}
} catch (Exception e) {
log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!");
serialPortUtil.closePort(serialPort);
return "fail";
}
serialPortUtil.closePort(serialPort);
System.out.println("关闭" + serialPort);
Thread.sleep(500);
log.info("-----------------------------" + serialPort + "单抄结束!-----------------------------");
return rtData;
} catch (Exception e) {
log.error("前端设置出现异常==>", e);
return "fail";
} finally {
if (null != serialPort) {
serialPortUtil.closePort(serialPort);
}
}
}

240
user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java

@ -5,12 +5,15 @@ import com.mh.user.service.BuildingService;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.NowDataService;
import com.mh.user.utils.AnalysisReceiveOrder485;
import com.mh.user.utils.ExchangeStringUtil;
import com.mh.user.utils.SendOrderUtils;
import com.mh.user.utils.SpringBeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import purejavacomm.SerialPort;
/**
@ -23,177 +26,102 @@ import purejavacomm.SerialPort;
@Slf4j
public class SerialPortSingle2 {
private String receiveStr = null;
private int baudrate=9600;
private String parity=null;
// 调用service
ApplicationContext context = SpringBeanUtil.getApplicationContext();
AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485();
DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class);
NowDataService nowDataService = context.getBean(NowDataService.class);
BuildingService buildingService = context.getBean(BuildingService.class);
public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity){
SerialPort serialPort = null;
String rtData="";
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 = SerialTool.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
}else{
serialPort = SerialTool.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN);
}
//向串口发送指令
log.info("-----------------------------单抄向串口"+serialPort+"发送指令!-----------------------------");
if (serialPort != null) {
String sendStr=SendOrderUtils.getSendStr(deviceCodeParamEntity);
SerialTool.sendToPort(SerialTool.HexString2Bytes(sendStr), serialPort,sendStr,deviceCodeParamEntity.getDeviceType());
Thread.sleep(1500);
}
}catch(Exception e){
e.printStackTrace();
}
//对返回数据进行相关解析处理
receiveStr=null;
byte[] bytes = SerialTool.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) {
SerialTool.closePort(serialPort);
log.info("单抄串口"+serialPort+"异常,没有数据返回!关闭串口");
}
//返回值全部变成大写
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,"不运行", buildingName); //监控界面状态表热泵在线状态
}
public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity) {
SerialPort serialPort = null;
String rtData = "";
String comName = deviceCodeParamEntity.getDataCom().toUpperCase();
try {
try {
int baudrate = deviceCodeParamEntity.getBaudrate();
String parity = deviceCodeParamEntity.getParity();
if (parity == null || parity.equals("") || parity.equalsIgnoreCase("none")) {
serialPort = SerialTool.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
} else {
serialPort = SerialTool.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN);
}
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, buildingName);
} 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()+"单抄保存数据库失败!");
SerialTool.closePort(serialPort);
//向串口发送指令
log.info("-----------------------------单抄向串口" + serialPort + "发送指令!-----------------------------");
if (serialPort != null) {
String sendStr = SendOrderUtils.getSendStr(deviceCodeParamEntity);
SerialTool.sendToPort(SerialTool.HexString2Bytes(sendStr), serialPort, sendStr, deviceCodeParamEntity.getDeviceType());
Thread.sleep(1500);
}
SerialTool.closePort(serialPort);
System.out.println("关闭"+serialPort);
Thread.sleep(500);
log.info("-----------------------------"+serialPort+"单抄结束!-----------------------------");
return rtData;
}catch (Exception e){
// e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
//}else {
//log.info("串口:"+comName+"不存在!");
//}
return "fail";
}
/**
* 字节数组转16进制字符串
* @param b 字节数组
* @return 16进制字符串
*/
public static String printHexString(byte[] b) {
StringBuilder sbf = new StringBuilder();
for (byte value : b) {
String hex = Integer.toHexString(value & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
//对返回数据进行相关解析处理
byte[] bytes = SerialTool.readFromPort(serialPort); //读取串口数据
if (null == bytes) {
SerialTool.closePort(serialPort);
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口");
return "fail";
}
sbf.append(hex.toUpperCase()).append(" ");
}
return sbf.toString().trim();
}
/**
* 十六进制字符串转byte[]
* @param hex 十六进制字符串
* @return byte[]
*/
public static byte[] hexStr2Byte(String hex) {
if (hex == null) {
return new byte[] {};
}
// 奇数位补0
if (hex.length() % 2 != 0) {
hex = "0" + hex;
}
String receiveStr = null;
receiveStr = ExchangeStringUtil.printHexString(bytes);
//去掉空格和null
receiveStr = receiveStr.replace("null", "").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); //查询楼栋名称
int length = hex.length();
ByteBuffer buffer = ByteBuffer.allocate(length / 2);
for (int i = 0; i < length; i++) {
String hexStr = hex.charAt(i) + "";
i++;
hexStr += hex.charAt(i);
byte b = (byte) Integer.parseInt(hexStr, 16);
buffer.put(b);
}
return buffer.array();
}
/**
* 16进制转换成为string类型字符串
* @param s 待转换字符串
*/
public static String hexStringToString(String s) {
if (s == null || "".equals(s)) {
return null;
}
s = s.replace(" ", "");
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
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, "不运行", buildingName); //监控界面状态表热泵在线状态
}
}
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) {
rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("压变")) {
rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统
analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) {
rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵")) {
rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("时控")) {
rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) { //热泵状态
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("温度变送器")) {
rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵状态")) {
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
}
} catch (Exception e) {
e.printStackTrace();
log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!");
SerialTool.closePort(serialPort);
return "fail";
}
SerialTool.closePort(serialPort);
System.out.println("关闭" + serialPort);
Thread.sleep(200);
log.info("-----------------------------" + serialPort + "单抄结束!-----------------------------");
return rtData;
} catch (Exception e) {
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口", e);
}
try {
s = new String(baKeyword, StandardCharsets.UTF_8);
} catch (Exception e1) {
e1.printStackTrace();
}
return s;
return "fail";
}
}

23
user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java

@ -85,7 +85,7 @@ public class AnalysisReceiveOrder485 {
// });
}
public String analysisMeterOrder4852(final String dataStr,final String registerAddr,final String brand,String buildingId) {
public String analysisMeterOrder4852(final String dataStr,final String registerAddr,final String brand,String buildingId, final String buildingName) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String dateStr = sdf1.format(date);
@ -118,7 +118,6 @@ public class AnalysisReceiveOrder485 {
data = String.format("%08d", Long.parseLong(data));
data = data.substring(0, 6) + "." + data.substring(6, 8);
log.info("电表表号:" + meterId+",电表读数:" + data);
String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
try {
DataResultEntity dataResultEntity = new DataResultEntity();
dataResultEntity.setDeviceAddr(meterId);//通讯编号
@ -202,7 +201,7 @@ public class AnalysisReceiveOrder485 {
}
// 水表
public String analysisWtMeterOrder4852(final String dataStr,final String registerAddr,final String brand,String buildingId) {
public String analysisWtMeterOrder4852(final String dataStr,final String registerAddr,final String brand,String buildingId, String buildingName) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String dateStr = sdf1.format(date);
@ -244,7 +243,6 @@ public class AnalysisReceiveOrder485 {
log.info("水表报文检验失败: " + dataStr);
}
}
String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
log.info("水表表号: " + meterId+",水表读数:" + data);
try {
DataResultEntity dataResultEntity = new DataResultEntity();
@ -451,7 +449,7 @@ public class AnalysisReceiveOrder485 {
// }
}
public String analysisPumpOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) {
public String analysisPumpOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId, final String buildingName) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String dateStr = sdf1.format(date);
@ -464,7 +462,6 @@ public class AnalysisReceiveOrder485 {
if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) {
log.info("热泵报文检验成功: " + receiveData);
String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));
String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
String data = "";
if (brand==null || brand.equals("") || brand.equals("美的")){
if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {//读
@ -674,7 +671,7 @@ public class AnalysisReceiveOrder485 {
}
// 温度变送器,长度42,读功能03
public String analysisMulTempOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) {
public String analysisMulTempOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId, String buildingName) {
String result="fail";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
@ -688,7 +685,6 @@ public class AnalysisReceiveOrder485 {
//log.info("温度变送器报文检验成功: " + receiveData);
String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址
String data = "";
String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读
Map<String,String> map= new HashMap<>();
String L1=checkStr.substring(6, 10); //1路
@ -823,7 +819,7 @@ public class AnalysisReceiveOrder485 {
}
// 压变,长度14,18读功能03
public String analysisPressureOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) {
public String analysisPressureOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId, final String buildingName) {
String result="fail";
String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文
byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr);
@ -837,7 +833,6 @@ public class AnalysisReceiveOrder485 {
String dateStr = sdf1.format(date);
String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址
String data = "";
String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读
Double wtHeight=0.0;
if (brand==null || brand.equals("")){
@ -1023,7 +1018,7 @@ public class AnalysisReceiveOrder485 {
}
// 水位开关,长度42,128
public String analysisRelayOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) {
public String analysisRelayOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId, final String buildingName) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss");
Date date = new Date();
String dateStr = sdf1.format(date);
@ -1037,7 +1032,6 @@ public class AnalysisReceiveOrder485 {
String l8="";
String waterLevelSet="";
String addr="";
String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
if (brand==null || brand.equals("") || brand.equals("中凯")){
// 检验报文
String checkStr = receiveData.substring(0, receiveData.length() - 4); //减去校验码
@ -1335,7 +1329,7 @@ public class AnalysisReceiveOrder485 {
}
// 热泵状态处理(水位开关),长度42,128
public String analysisPumpStateOrder2(final String receiveData, final String registerAddr,final String brand,String buildingId) {
public String analysisPumpStateOrder2(final String receiveData, final String registerAddr,final String brand,String buildingId, String buildingName) {
String result="fail";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
@ -1351,7 +1345,6 @@ public class AnalysisReceiveOrder485 {
String runState="";
String addr="";
Map<String,String> map=new HashMap<String, String>();
String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
if (brand==null || brand.equals("") || brand.equals("顶威")){
String checkStr = receiveData.substring(0, receiveData.length() - 4); //检验报文减,去校验码
String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码
@ -1622,7 +1615,7 @@ public class AnalysisReceiveOrder485 {
}
//时间控制器,长度26、22
public String analysisTimeSetOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId) {
public String analysisTimeSetOrder4852(final String receiveData, final String registerAddr,final String brand,String buildingId, final String buildingName) {
String result="fail";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();

60
user-service/src/test/java/com/mh/user/chart/ChartTest.java

@ -9,55 +9,17 @@ package com.mh.user.chart;
*/
public class ChartTest {
public static void main(String[] args) {
System.out.println(extracted());
}
// Set<Object> objects = new LinkedHashSet<>();
// objects.add("test");
// objects.add("test1");
// objects.add("test");
// objects.add("test1");
// for (Object object :
// objects) {
// System.out.println(object);
// }
// Title title = new Title(false, "COP");
//
// Feature feature = new Feature(
// new boolean[]{false, false, false, false},
// new String[]{"温度", "湿度", "千瓦", "千帕"},
// new String[]{"温度", "湿度", "千瓦", "千帕"},
// new String[]{"温度", "湿度", "千瓦", "千帕"},
// new String[]{"温度", "湿度", "千瓦", "千帕"});
//
// Legend legend = new Legend(
// new String[]{"COP"},
// 200,
// new int[]{25});
//
// XAxis xAxis = new XAxis(new String[]{"前3周","前2周","前1周","本周"});
//
// List<YAxis> yAxisList = new ArrayList<>();
// yAxisList.add(new YAxis("value",
// "COP",
// new SplitLine(false),
// new AxisLine(false,new LineStyle("#FFF")),
// true));
//
// List<Series> seriesList = new ArrayList<>();
// seriesList.add(new Series("COP",
// "bar",
// 0,
// new Double[]{4.7, 5.8, 6.0, 5.3}));
//
// ChartEntity chartEntity = new ChartEntity(title,feature,legend,xAxis,yAxisList,seriesList);
// List<ChartEntity> chartEntities = new ArrayList<>();
// chartEntities.add(chartEntity);
// String json = JSONArray.toJSONString(chartEntities);
// System.out.println(json);
// BigDecimal b1 = BigDecimal.valueOf(Math.PI / 2);
// double a = b1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// System.out.println(a);
String s = "a9fec2c71f90ff03fc0000000100000200000300000400000500000600000700000800000900000a00000b00000c00000d00000e00000f00001000001100001200001300001400001500001600001700001800001900001a00001b00001c00001d00011e00001f00002000002100002200002300002400002500002600002700002800002900002a00002b00002c00002d00002e00002f000030000031000040a8";
System.out.println("大小: " + s.length());
private static String extracted() {
try {
System.out.println("测试");
return "测试了";
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
System.out.println("最后也执行的");
}
}
}

Loading…
Cancel
Save