Browse Source

1、设备更换,优化采集指令动态生成;2、定时采集动态获取对应的线程数

prod_202403
mh 8 months ago
parent
commit
6aa5718d6a
  1. 18
      user-service/src/main/java/com/mh/user/job/DealDataJob.java
  2. 2
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java
  3. 3
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  4. 2
      user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java
  5. 9
      user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java
  6. 46
      user-service/src/test/java/com/mh/user/TestJwtUtils.java
  7. 4
      热水新增脚本.sql

18
user-service/src/main/java/com/mh/user/job/DealDataJob.java

@ -1,9 +1,11 @@
package com.mh.user.job;
import com.mh.user.constants.Constant;
import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.serialport.SerialPortThread;
import com.mh.user.service.DeviceCodeParamService;
import com.mh.user.service.DealDataService;
import com.mh.user.utils.CacheUtil;
import com.mh.user.utils.ComThreadPoolService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -12,8 +14,11 @@ import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.stream.Collectors;
/**
* @author ljf
@ -74,6 +79,7 @@ public class DealDataJob {
if (!Constant.WEB_FLAG) {
Constant.FLAG = true;
log.info("------Constant.WEB_FLAG==" + false + "------");
CacheUtil cacheUtil = CacheUtil.getInstance();
for (int i = 1; i <= 4; i++) {
if (Constant.WEB_FLAG) {
break;
@ -89,13 +95,19 @@ public class DealDataJob {
threadName = "3";
log.info("------采集设定温度、设定水位、故障状态!" + i + "------");
}
CountDownLatch countDownLatch = new CountDownLatch(10);
for (int j = 1; j < 11; j++) {
// 从缓存中获取到对应的采集内容
List<DeviceCodeParamEntity> deviceParamsByType = cacheUtil.getDeviceParamsByType(threadName);
// 分组data_com
Map<String, List<DeviceCodeParamEntity>> dataComMap = deviceParamsByType.stream().collect(Collectors.groupingBy(DeviceCodeParamEntity::getDataCom));
CountDownLatch countDownLatch = new CountDownLatch(dataComMap.size());
for (int j = 0; j < dataComMap.size(); j++) {
if (Constant.WEB_FLAG) {
break;
}
// 获取data_com口
String dataCom = dataComMap.keySet().toArray(new String[0])[j];
SerialPortThread myThread = new SerialPortThread();
myThread.setName(threadName, String.valueOf(j), countDownLatch);
myThread.setName(threadName, dataCom.toLowerCase().replace("com", ""), countDownLatch);
Thread thread = new Thread(myThread);
comThreadPool.execute(thread);
}

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

@ -113,7 +113,7 @@ public class SerialPortSingle2 {
}
}
try {
if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 72 || 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);

3
user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java

@ -117,6 +117,7 @@ public class DeviceControlServiceImpl implements DeviceControlService {
&& (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2"))
&& !rtData.equals(Constant.FAIL)) {
deviceCodeParam.setFunCode("06");
log.info("开启热泵定时==>{}", deviceCodeParam.getParam() + deviceCodeParam.getRegisterAddr());
// 开启热泵定时
if ("0028".equals(deviceCodeParam.getRegisterAddr())) {
deviceCodeParam.setRegisterAddr("00230001");
@ -143,7 +144,7 @@ public class DeviceControlServiceImpl implements DeviceControlService {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);
// 要添加校准值
Double deviationValue = deviceInstallService.selectDeviceDeviation(deviceCodeParam.getDeviceAddr(),deviceCodeParam.getDeviceType(), deviceCodeParam.getBuildingId());
if (null != deviationValue && !"fail".equals(rtData)) {
if (null != deviationValue && !StringUtils.isBlank(rtData) && !"fail".equals(rtData)) {
rtData = new BigDecimal(rtData).add(BigDecimal.valueOf(deviationValue)).toString();
}
return rtData;

2
user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java

@ -51,7 +51,7 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
DeviceCodeParamEntity deviceCodeParamEntity = new DeviceCodeParamEntity();
BeanUtils.copyProperties(deviceInstallEntity,deviceCodeParamEntity);
deviceCodeParamEntity.setBaudrate(deviceInstallEntity.getBaudRate());
deviceCodeParamEntity.setThread(String.valueOf(new Random().nextInt(10)));
deviceCodeParamEntity.setThread(deviceInstallEntity.getDataCom().toLowerCase().replace("com",""));
// 顺便生成采集信息
switch (deviceInstallEntity.getDeviceType()) {
case "压变":

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

@ -2,6 +2,7 @@ package com.mh.user.utils;
import com.alibaba.fastjson2.JSON;
import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant;
import com.mh.user.entity.*;
import com.mh.user.service.*;
import lombok.extern.slf4j.Slf4j;
@ -205,7 +206,8 @@ public class AnalysisReceiveOrder485 {
Date date = new Date();
String data = "";
String meterId = "";
if (dataStr.length() == 44 || dataStr.length() == 70) {
// 68 10 3987835C03000081B31CDA1C006502002C006502002C0000000000000000FF3416
if (dataStr.length() == 44 || dataStr.length() == 70 || dataStr.length() == 72) {
String checkStr = dataStr.substring(0, dataStr.length() - 4);//减去校验码
String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码
if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) {
@ -223,6 +225,7 @@ public class AnalysisReceiveOrder485 {
data = data.substring(0, 6) + "." + data.substring(6, 8);
} else {
log.info("水表报文检验失败: " + dataStr);
return data;
}
} else if (dataStr.length() == 18) {
String checkStr = dataStr.substring(0, dataStr.length() - 4);//检验报文
@ -237,6 +240,7 @@ public class AnalysisReceiveOrder485 {
}
} else {
log.info("水表报文检验失败: " + dataStr);
return data;
}
}
log.info("水表表号: " + meterId + ",水表读数:" + data);
@ -516,6 +520,7 @@ public class AnalysisReceiveOrder485 {
}
} else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
return Constant.SUCCESS;
}
rtData = sValue;
} else if (brand.equals("美的2")) {
@ -588,6 +593,7 @@ public class AnalysisReceiveOrder485 {
rtData = sValue;
} else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
return Constant.SUCCESS;
}
} else if (brand.equals("瑞星")) {
if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {//读
@ -651,6 +657,7 @@ public class AnalysisReceiveOrder485 {
}
} else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
return Constant.SUCCESS;
}
rtData = sValue;
}

46
user-service/src/test/java/com/mh/user/TestJwtUtils.java

@ -1,10 +1,15 @@
package com.mh.user;
import com.alibaba.fastjson2.JSONObject;
import com.mh.user.model.SysUser;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import sun.security.provider.MD5;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ -136,24 +141,39 @@ public class TestJwtUtils {
*/
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("no", "abc");
jsonObject.put("model", 1);
jsonObject.put("scheme", 202);
String inputString = "85b5cebb6132a189570d51bf5e34d93c"+jsonObject.toJSONString();
SysUser user = new SysUser();
user.setId((long) 1);
user.setUserName("admin");
String token = generateJsonWebToken(user);
try {
// 获取MessageDigest实例用于MD5算法
MessageDigest md = MessageDigest.getInstance("MD5");
// 将输入字符串转换为字节数组并进行更新
byte[] messageBytes = inputString.getBytes();
md.update(messageBytes);
// 完成哈希计算并获取结果字节数组
byte[] digestBytes = md.digest();
System.out.println(token);
// 将字节数组转换为大写的十六进制字符串表示形式
BigInteger no = new BigInteger(1, digestBytes);
String hashtext = no.toString(16);
Claims claims = checkJWT(token);
if (claims != null) {
String id = claims.get("id").toString();
String name = claims.get("name").toString();
// 如果生成的十六进制字符串长度小于32,则前面补0以达到32位
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("MD5 Hash: " + hashtext);
}
} catch (NoSuchAlgorithmException e) {
// 处理MD5算法不可用的情况
e.printStackTrace();
}
}
}
}

4
热水新增脚本.sql

@ -4,6 +4,10 @@ create index pump_set_pump_id_building_id on pump_set(pump_id, building_id);
create index now_data_building_id on pump_set(building_id);
create index now_data_pump_id on pump_set(pump_id);
-- 2023-12-19 添加偏差值
alter table device_install add deviation_value numeric(24,2) null;
exec sp_addextendedproperty N'MS_Description', N'偏差值', N'schema', N'dbo',N'table', N'device_install', N'column', N'deviation_value';
-- 2024-01-08 新增字段,waterLevel表
alter table waterLevel add device_addr varchar(32) not null default '';
exec sp_addextendedproperty N'MS_Description', N'设备地址', N'schema', N'dbo',N'table', N'waterLevel', N'column', N'device_addr';

Loading…
Cancel
Save