diff --git a/zh-module-applet/zh-applet-admin/src/main/java/org/jeecg/modules/appmana/controller/SurvDeviceDeployController.java b/zh-module-applet/zh-applet-admin/src/main/java/org/jeecg/modules/appmana/controller/SurvDeviceDeployController.java index fcb1c96..144f1bf 100644 --- a/zh-module-applet/zh-applet-admin/src/main/java/org/jeecg/modules/appmana/controller/SurvDeviceDeployController.java +++ b/zh-module-applet/zh-applet-admin/src/main/java/org/jeecg/modules/appmana/controller/SurvDeviceDeployController.java @@ -412,16 +412,32 @@ public class SurvDeviceDeployController extends JeecgController relays = relaygroupService.getRelayByGroup(deploy.getId()); deviceRelayVo.setModuleList(relays); + List variables = new ArrayList<>();//收集所有查询变量 //初始化指令 if(!relays.isEmpty()){ for (SurvDeviceDeployRelaygroup relaygroup : relays) { List r = relayService.initCmd(relaygroup.getRelayList()); relaygroup.setRelayList(r); + if(!r.isEmpty()){ + for (SurvDeviceDeployRelay survDeviceDeployRelay : r) { + if(StringUtils.isNotBlank(survDeviceDeployRelay.getRelayKey())) { + variables.add(survDeviceDeployRelay.getRelayKey()); + } + } + } } } - List runs = runService.listByDeploy(deploy.getId()); deviceRelayVo.setRunStatus(runs); + if(runs!=null && !runs.isEmpty()){ + for (SurvDeviceDeployRun run : runs) { + if(StringUtils.isNotBlank(run.getRunKey())) { + variables.add(run.getRunKey()); + } + } + } + //拉取完后,顺便触发一次查询所有继电器和运行状态 + boolean b= p3Service.sendMqttDeviceQuery(deploy,variables); break; default: List pageList = relayService.relayList(deployId,null); diff --git a/zh-module-applet/zh-applet-admin/src/main/java/org/jeecg/modules/appmana/service/impl/IotCommonP3ServiceImpl.java b/zh-module-applet/zh-applet-admin/src/main/java/org/jeecg/modules/appmana/service/impl/IotCommonP3ServiceImpl.java index 05e72ee..7240cec 100644 --- a/zh-module-applet/zh-applet-admin/src/main/java/org/jeecg/modules/appmana/service/impl/IotCommonP3ServiceImpl.java +++ b/zh-module-applet/zh-applet-admin/src/main/java/org/jeecg/modules/appmana/service/impl/IotCommonP3ServiceImpl.java @@ -2,6 +2,7 @@ package org.jeecg.modules.appmana.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -9,8 +10,10 @@ import org.jeecg.common.constant.IotConstants; import org.jeecg.common.constant.PollutionConstants; import org.jeecg.common.constant.enums.PollutionEnum; import org.jeecg.common.entity.*; +import org.jeecg.common.iot.lhiot.QueryCmd; import org.jeecg.common.util.DateUtilTools; import org.jeecg.common.util.EntityFieldUtil; +import org.jeecg.common.util.LhIotUtil; import org.jeecg.common.vo.*; import org.jeecg.common.vo.statistic.DTOIotSummray; import org.jeecg.modules.appmana.service.IScEquZhibiaoService; @@ -729,4 +732,15 @@ public class IotCommonP3ServiceImpl { } return true; } + + public boolean sendMqttDeviceQuery(SurvDeviceDeploy deploy, List variables) { + boolean result = true; + log.error("===========预发送指令========={}============",variables.size()); + if(deploy!=null && variables!=null && !variables.isEmpty()){ + QueryCmd queryCmd = LhIotUtil.ConstructCmd(variables); + String cmdStr = JSONObject.toJSONString(queryCmd); + mqttService.publish(deploy.getDeviceIotUrl(),cmdStr); + } + return result; + } } diff --git a/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/QueryCmd.java b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/QueryCmd.java new file mode 100644 index 0000000..075e07e --- /dev/null +++ b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/QueryCmd.java @@ -0,0 +1,10 @@ +package org.jeecg.common.iot.lhiot; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QueryCmd { + @ApiModelProperty("指令") + private QueryCmdDetail rw_prot; +} diff --git a/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/QueryCmdDetail.java b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/QueryCmdDetail.java new file mode 100644 index 0000000..57b2a5d --- /dev/null +++ b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/QueryCmdDetail.java @@ -0,0 +1,49 @@ +package org.jeecg.common.iot.lhiot; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +@Data +public class QueryCmdDetail { + + + private static final AtomicInteger counter = new AtomicInteger(0); + private static final DateTimeFormatter FORMATTER = + DateTimeFormatter.ofPattern("yyyyMMddHHmmss") + .withZone(ZoneId.systemDefault()); + + + @ApiModelProperty("指令类型") + private String dir = "down"; + + @ApiModelProperty("指令id") + private String id = generate(); + + @ApiModelProperty("寄存器编号集合") + private List r_data; + + + + /** + * 线程安全的高并发版本 + */ + public static String generate() { + // 1. 生成时间戳部分 + String timestamp = FORMATTER.format(Instant.now()); + + // 2. 生成4位随机数(使用AtomicInteger保证线程安全) + int random = counter.incrementAndGet() % 10000; + if (random < 0) { + random = -random; + } + String randomStr = String.format("%04d", random); + + return timestamp + randomStr; + } +} diff --git a/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/QueryCmdRegister.java b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/QueryCmdRegister.java new file mode 100644 index 0000000..4862acb --- /dev/null +++ b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/QueryCmdRegister.java @@ -0,0 +1,11 @@ +package org.jeecg.common.iot.lhiot; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QueryCmdRegister { + + @ApiModelProperty("寄存器编号") + private String name; +} diff --git a/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/ResponseCmd.java b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/ResponseCmd.java new file mode 100644 index 0000000..8fb5a44 --- /dev/null +++ b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/ResponseCmd.java @@ -0,0 +1,10 @@ +package org.jeecg.common.iot.lhiot; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ResponseCmd { + @ApiModelProperty("指令") + private ResponseCmdDetail rw_prot; +} diff --git a/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/ResponseCmdData.java b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/ResponseCmdData.java new file mode 100644 index 0000000..879438f --- /dev/null +++ b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/ResponseCmdData.java @@ -0,0 +1,17 @@ +package org.jeecg.common.iot.lhiot; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ResponseCmdData { + + @ApiModelProperty("寄存器编号") + private String name; + + @ApiModelProperty("寄存器值") + private String value; + + @ApiModelProperty("是否报错") + private String err; +} diff --git a/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/ResponseCmdDetail.java b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/ResponseCmdDetail.java new file mode 100644 index 0000000..2e0a141 --- /dev/null +++ b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/iot/lhiot/ResponseCmdDetail.java @@ -0,0 +1,18 @@ +package org.jeecg.common.iot.lhiot; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class ResponseCmdDetail { + @ApiModelProperty("指令类型") + private String dir; + + @ApiModelProperty("指令id") + private String id; + + @ApiModelProperty("数据") + private List r_data; +} diff --git a/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/util/LhIotUtil.java b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/util/LhIotUtil.java new file mode 100644 index 0000000..9ae95af --- /dev/null +++ b/zh-module-applet/zh-applet-common/src/main/java/org/jeecg/common/util/LhIotUtil.java @@ -0,0 +1,35 @@ +package org.jeecg.common.util; + +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.entity.SurvDeviceDeploy; +import org.jeecg.common.iot.lhiot.QueryCmd; +import org.jeecg.common.iot.lhiot.QueryCmdDetail; +import org.jeecg.common.iot.lhiot.QueryCmdRegister; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class LhIotUtil { + + /** + * 指令构造器 + */ + public static QueryCmd ConstructCmd(List codes){ + QueryCmd queryCmd = new QueryCmd(); + if(codes!=null && !codes.isEmpty()){ + List registers = new ArrayList<>(); + for (String code : codes) { + QueryCmdRegister queryCmdRegister = new QueryCmdRegister(); + queryCmdRegister.setName(code); + registers.add(queryCmdRegister); + } + QueryCmdDetail queryCmdDetail = new QueryCmdDetail(); + queryCmdDetail.setR_data(registers); + queryCmd.setRw_prot(queryCmdDetail); + return queryCmd; + }else{ + return null; + } + } +}