From f3bf76c05a18eabc5754af34d61f11b187e77939 Mon Sep 17 00:00:00 2001 From: yangxiaozhong <429869597@qq.com> Date: Fri, 12 Dec 2025 09:24:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=AE=A1=E7=90=86=E5=92=8C?= =?UTF-8?q?=E4=BC=A0=E6=84=9F=E5=99=A8=E7=AE=A1=E7=90=86bug=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=8Cmqtt=E6=8E=A5=E6=94=B6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=88=B0=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/sse/dto/SseMessageDto.java | 2 + .../controller/IotDeviceController.java | 8 ++- .../org/dromara/hazard/domain/IotDevice.java | 1 + .../dromara/hazard/domain/IotSensorData.java | 3 +- .../hazard/domain/bo/IotSensorDataBo.java | 4 +- .../hazard/domain/vo/IotSensorDataVo.java | 2 +- .../org/dromara/hazard/handler/DataDto.java | 11 ++++ .../handler/HazardMqttMessageHandler.java | 58 ++++++++++++++++++ .../hazard/service/IIotDeviceService.java | 2 + .../hazard/service/IIotSensorService.java | 2 + .../service/impl/IotDeviceServiceImpl.java | 61 ++++++++++++++----- .../service/impl/IotSensorServiceImpl.java | 5 ++ .../.lck | 0 13 files changed, 138 insertions(+), 21 deletions(-) create mode 100644 ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/handler/DataDto.java create mode 100644 stm32-iot-se888rver-tcp83l6076j43gohoco37690/.lck diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java index a2e1210c6..49a8c9810 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java @@ -26,4 +26,6 @@ public class SseMessageDto implements Serializable { * 需要发送的消息 */ private String message; + + } diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/controller/IotDeviceController.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/controller/IotDeviceController.java index 8357929bb..0991f1b4f 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/controller/IotDeviceController.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/controller/IotDeviceController.java @@ -68,8 +68,12 @@ public class IotDeviceController extends BaseController { public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { IotDeviceVo deviceVo = iotDeviceService.queryById(id); - List list = Arrays.stream(deviceVo.getSensorCode().split(",")).toList(); - deviceVo.setSensorCodes(list); + if (deviceVo.getSensorCode() == null){ + deviceVo.setSensorCodes(null); + }else { + List list = Arrays.stream(deviceVo.getSensorCode().split(",")).toList(); + deviceVo.setSensorCodes(list); + } return R.ok(deviceVo); } diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/IotDevice.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/IotDevice.java index cdbf08598..6462c292f 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/IotDevice.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/IotDevice.java @@ -35,6 +35,7 @@ public class IotDevice extends TenantEntity { /** * 拥有传感器(多个逗号分割) */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String sensorCode; /** diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/IotSensorData.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/IotSensorData.java index bb6c4382c..cc1e6d5d6 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/IotSensorData.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/IotSensorData.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serial; +import java.util.Date; /** * 数据对象 iot_sensor_data @@ -25,7 +26,7 @@ public class IotSensorData extends TenantEntity { * time主键 */ @TableId(value = "time") - private Long time; + private Date time; /** * 设备id diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/bo/IotSensorDataBo.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/bo/IotSensorDataBo.java index 819f3da3b..dd800e130 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/bo/IotSensorDataBo.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/bo/IotSensorDataBo.java @@ -9,6 +9,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; +import java.util.Date; + /** * 数据业务对象 iot_sensor_data * @@ -24,7 +26,7 @@ public class IotSensorDataBo extends BaseEntity { * time主键 */ @NotNull(message = "time主键不能为空", groups = { EditGroup.class }) - private Long time; + private Date time; /** * 设备id diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/vo/IotSensorDataVo.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/vo/IotSensorDataVo.java index 72813c270..317617988 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/vo/IotSensorDataVo.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/domain/vo/IotSensorDataVo.java @@ -32,7 +32,7 @@ public class IotSensorDataVo implements Serializable { * time主键 */ @ExcelProperty(value = "time主键") - private Long time; + private Date time; /** * 设备id diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/handler/DataDto.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/handler/DataDto.java new file mode 100644 index 000000000..fe7a50432 --- /dev/null +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/handler/DataDto.java @@ -0,0 +1,11 @@ +package org.dromara.hazard.handler; + +import lombok.Data; + +@Data +public class DataDto { + private String deviceId; + private String sensorId; + private String value; + private String type; +} diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/handler/HazardMqttMessageHandler.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/handler/HazardMqttMessageHandler.java index d6334688a..8be9436c7 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/handler/HazardMqttMessageHandler.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/handler/HazardMqttMessageHandler.java @@ -1,17 +1,30 @@ package org.dromara.hazard.handler; +import cn.hutool.json.JSONUtil; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.mqtt.handler.MqttMessageHandler; import org.dromara.common.mqtt.server.MqttGateway; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.hazard.domain.bo.IotSensorDataBo; import org.dromara.hazard.domain.dto.Payload; +import org.dromara.hazard.domain.dto.SensorData; +import org.dromara.hazard.domain.vo.IotDeviceVo; +import org.dromara.hazard.domain.vo.IotSensorVo; +import org.dromara.hazard.service.IIotDeviceService; +import org.dromara.hazard.service.IIotSensorDataService; +import org.dromara.hazard.service.IIotSensorService; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Date; import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * 危险源模块的MQTT消息处理器 @@ -24,6 +37,14 @@ public class HazardMqttMessageHandler implements MqttMessageHandler { private static final Logger log = LoggerFactory.getLogger(HazardMqttMessageHandler.class); @Autowired private MqttGateway mqttGateway; + @Autowired + private IIotDeviceService iotDeviceService; + @Autowired + private IIotSensorService iotSensorService; + @Autowired + private IIotSensorDataService iotSensorDataService; + @Autowired + private ScheduledExecutorService scheduledExecutorService; /** * 处理接收到的MQTT消息 @@ -94,6 +115,43 @@ public class HazardMqttMessageHandler implements MqttMessageHandler { // 例如: 解析JSON、保存数据库、触发业务流程等 Payload payload1 = JsonUtils.parseObject(payload, Payload.class); System.out.println(payload1); + String deviceCode = payload1.getDeviceCode(); + List data = payload1.getData(); + if (deviceCode!= null && data != null && data.size() > 0){ + for (SensorData dataBo : data) { + String sensorCode = dataBo.getSensorCode(); + if (sensorCode != null){ + IotSensorVo iotSensorVo = iotSensorService.queryByCode(sensorCode); + IotDeviceVo deviceVo = iotDeviceService.queryByDeviceCode(deviceCode); + Long sensorId = iotSensorVo.getId();//获取传感器id + Long deviceId = deviceVo.getId();//获取设备id + if (sensorId!=null && deviceId != null){//只有当传感器id和设备id不为空时才处理数据,即传感器链接到设备时才会处理数据 + IotSensorDataBo iotSensorDataBo = new IotSensorDataBo(); + iotSensorDataBo.setTime(new Date()); + iotSensorDataBo.setDeviceId(deviceId); + iotSensorDataBo.setSensorCode(sensorId); + iotSensorDataBo.setValue(dataBo.getValue()); + iotSensorDataBo.setRawJson(payload);//保存原始数据 + iotSensorDataService.insertByBo(iotSensorDataBo); + + //sse发送消息到前端 + scheduledExecutorService.schedule(() -> { + SseMessageDto dto = new SseMessageDto(); + DataDto messageData = new DataDto(); + messageData.setDeviceId(String.valueOf(deviceId)); + messageData.setSensorId(String.valueOf(sensorId)); + messageData.setValue(dataBo.getValue()); + messageData.setType(iotSensorVo.getType()); + String jsonStr = JSONUtil.toJsonStr(messageData); + dto.setMessage(topic+jsonStr); + // 如果需要指定特定用户接收消息,可以设置userIds + // dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + }, 0, TimeUnit.SECONDS); + } + } + } + } } diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/IIotDeviceService.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/IIotDeviceService.java index 8231a8517..2465a6c05 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/IIotDeviceService.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/IIotDeviceService.java @@ -65,4 +65,6 @@ public interface IIotDeviceService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + IotDeviceVo queryByDeviceCode(String deviceCode); } diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/IIotSensorService.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/IIotSensorService.java index 69ecda375..062d96402 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/IIotSensorService.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/IIotSensorService.java @@ -67,4 +67,6 @@ public interface IIotSensorService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); List queryByNoBound(IotSensorBo bo); + + IotSensorVo queryByCode(String sensorCode); } diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/impl/IotDeviceServiceImpl.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/impl/IotDeviceServiceImpl.java index 7b1f618b5..025dba354 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/impl/IotDeviceServiceImpl.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/impl/IotDeviceServiceImpl.java @@ -138,22 +138,43 @@ public class IotDeviceServiceImpl implements IIotDeviceService { public Boolean updateByBo(IotDeviceBo bo) { IotDevice update = MapstructUtils.convert(bo, IotDevice.class); validEntityBeforeSave(update); - String join = String.join(",", bo.getSensorCodes()); - //先设置状态为离线 - if (update != null) { - update.setSensorCode(join); + if (bo.getSensorCodes().length > 0 ){ + String join = String.join(",", bo.getSensorCodes()); + if (update != null) { + update.setSensorCode(join); + } + }else { + if (update != null) { + update.setSensorCode(null); + } } + boolean flag = baseMapper.updateById(update) > 0; if (flag){ //将设备id保存到传感器的绑定设备字段中去device_bound - List list = Arrays.stream(bo.getSensorCodes()).toList(); - for (String s : list) { - IotSensorVo iotSensorVo = iotSensorService.queryById(Long.valueOf(s)); + if (bo.getSensorCodes().length > 0){ + List list = Arrays.stream(bo.getSensorCodes()).toList(); + for (String s : list) { + IotSensorVo iotSensorVo = iotSensorService.queryById(Long.valueOf(s)); + IotSensorBo iotSensorBo = new IotSensorBo(); + BeanUtils.copyProperties(iotSensorVo,iotSensorBo); + iotSensorBo.setDeviceBound(String.valueOf(bo.getId())); + iotSensorService.updateByBo(iotSensorBo); + } + }else { IotSensorBo iotSensorBo = new IotSensorBo(); - BeanUtils.copyProperties(iotSensorVo,iotSensorBo); iotSensorBo.setDeviceBound(String.valueOf(bo.getId())); - iotSensorService.updateByBo(iotSensorBo); + List iotSensorVos = iotSensorService.queryList(iotSensorBo); + if (!iotSensorVos.isEmpty() && iotSensorVos.size()>0){ + for (IotSensorVo iotSensorVo : iotSensorVos) { + IotSensorBo iotSensorBo1 = new IotSensorBo(); + BeanUtils.copyProperties(iotSensorVo,iotSensorBo1); + iotSensorBo1.setDeviceBound(null); + iotSensorService.updateByBo(iotSensorBo1); + } + } } + } return flag; } @@ -181,15 +202,23 @@ public class IotDeviceServiceImpl implements IIotDeviceService { //查询设备列表 List iotDeviceVos = baseMapper.selectVoByIds(ids); for (IotDeviceVo iotDeviceVo : iotDeviceVos) { - List list = Arrays.asList(iotDeviceVo.getSensorCode().split(",")); - for (String s : list) { - IotSensorVo iotSensorVo = iotSensorService.queryById(Long.valueOf(s)); - IotSensorBo iotSensorBo = new IotSensorBo(); - BeanUtils.copyProperties(iotSensorVo,iotSensorBo); - iotSensorBo.setDeviceBound(null); - iotSensorService.updateByBo(iotSensorBo); + if (iotDeviceVo!=null && iotDeviceVo.getSensorCode()!=null){ + List list = Arrays.asList(iotDeviceVo.getSensorCode().split(",")); + for (String s : list) { + IotSensorVo iotSensorVo = iotSensorService.queryById(Long.valueOf(s)); + IotSensorBo iotSensorBo = new IotSensorBo(); + BeanUtils.copyProperties(iotSensorVo,iotSensorBo); + iotSensorBo.setDeviceBound(null); + iotSensorService.updateByBo(iotSensorBo); + } } + } return baseMapper.deleteByIds(ids) > 0; } + + @Override + public IotDeviceVo queryByDeviceCode(String deviceCode) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(IotDevice::getDeviceCode, deviceCode)); + } } diff --git a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/impl/IotSensorServiceImpl.java b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/impl/IotSensorServiceImpl.java index 79eb53e05..c88ced370 100644 --- a/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/impl/IotSensorServiceImpl.java +++ b/ruoyi-modules/ruoyi-hazard/src/main/java/org/dromara/hazard/service/impl/IotSensorServiceImpl.java @@ -154,6 +154,11 @@ public class IotSensorServiceImpl implements IIotSensorService { return baseMapper.selectVoList(lqw); } + @Override + public IotSensorVo queryByCode(String sensorCode) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(IotSensor::getCode, sensorCode)); + } + private LambdaQueryWrapper buildQueryWrapper1(IotSensorBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); diff --git a/stm32-iot-se888rver-tcp83l6076j43gohoco37690/.lck b/stm32-iot-se888rver-tcp83l6076j43gohoco37690/.lck new file mode 100644 index 000000000..e69de29bb