增加拉取继电器时,同时查询Mqtt

This commit is contained in:
zy 2026-03-30 18:16:22 +08:00
parent 5e3d392722
commit 3a1a541144
9 changed files with 181 additions and 1 deletions

View File

@ -412,16 +412,32 @@ public class SurvDeviceDeployController extends JeecgController<SurvDeviceDeploy
case IotConstants.lhviot_standard:
List<SurvDeviceDeployRelaygroup> relays = relaygroupService.getRelayByGroup(deploy.getId());
deviceRelayVo.setModuleList(relays);
List<String> variables = new ArrayList<>();//收集所有查询变量
//初始化指令
if(!relays.isEmpty()){
for (SurvDeviceDeployRelaygroup relaygroup : relays) {
List<SurvDeviceDeployRelay> 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<SurvDeviceDeployRun> 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<SurvDeviceDeployRelay> pageList = relayService.relayList(deployId,null);

View File

@ -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<String> 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;
}
}

View File

@ -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;
}

View File

@ -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<QueryCmdRegister> 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;
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<ResponseCmdData> r_data;
}

View File

@ -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<String> codes){
QueryCmd queryCmd = new QueryCmd();
if(codes!=null && !codes.isEmpty()){
List<QueryCmdRegister> 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;
}
}
}