Merge remote-tracking branch 'origin/master'

master
wangrunpu 5 days ago
commit fbbe447f79

@ -31,4 +31,6 @@ public class SseMessageDto implements Serializable {
*
*/
private String message;
}

@ -68,8 +68,12 @@ public class IotDeviceController extends BaseController {
public R<IotDeviceVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
IotDeviceVo deviceVo = iotDeviceService.queryById(id);
List<String> list = Arrays.stream(deviceVo.getSensorCode().split(",")).toList();
deviceVo.setSensorCodes(list);
if (deviceVo.getSensorCode() == null){
deviceVo.setSensorCodes(null);
}else {
List<String> list = Arrays.stream(deviceVo.getSensorCode().split(",")).toList();
deviceVo.setSensorCodes(list);
}
return R.ok(deviceVo);
}

@ -35,6 +35,7 @@ public class IotDevice extends TenantEntity {
/**
* ()
*/
@TableField(updateStrategy = FieldStrategy.ALWAYS)
private String sensorCode;
/**

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

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

@ -32,7 +32,7 @@ public class IotSensorDataVo implements Serializable {
* time
*/
@ExcelProperty(value = "time主键")
private Long time;
private Date time;
/**
* id

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

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

@ -65,4 +65,6 @@ public interface IIotDeviceService {
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
IotDeviceVo queryByDeviceCode(String deviceCode);
}

@ -67,4 +67,6 @@ public interface IIotSensorService {
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
List<IotSensorVo> queryByNoBound(IotSensorBo bo);
IotSensorVo queryByCode(String sensorCode);
}

@ -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<String> list = Arrays.stream(bo.getSensorCodes()).toList();
for (String s : list) {
IotSensorVo iotSensorVo = iotSensorService.queryById(Long.valueOf(s));
if (bo.getSensorCodes().length > 0){
List<String> 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<IotSensorVo> 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<IotDeviceVo> iotDeviceVos = baseMapper.selectVoByIds(ids);
for (IotDeviceVo iotDeviceVo : iotDeviceVos) {
List<String> 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<String> 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<IotDevice>().eq(IotDevice::getDeviceCode, deviceCode));
}
}

@ -154,6 +154,11 @@ public class IotSensorServiceImpl implements IIotSensorService {
return baseMapper.selectVoList(lqw);
}
@Override
public IotSensorVo queryByCode(String sensorCode) {
return baseMapper.selectVoOne(new LambdaQueryWrapper<IotSensor>().eq(IotSensor::getCode, sensorCode));
}
private LambdaQueryWrapper<IotSensor> buildQueryWrapper1(IotSensorBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<IotSensor> lqw = Wrappers.lambdaQuery();

Loading…
Cancel
Save