【功能新增】IoT:设备状态上传的部分实现

This commit is contained in:
YunaiV
2025-01-29 11:38:51 +08:00
parent f6366d9b55
commit f5f8c418dc
14 changed files with 96 additions and 52 deletions

View File

@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.api.device;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStatusUpdateReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
@@ -23,8 +23,8 @@ public class IoTDeviceUpstreamApiImpl implements IotDeviceUpstreamApi {
private IotDeviceUpstreamService deviceUpstreamService;
@Override
public CommonResult<Boolean> updateDeviceStatus(IotDeviceStatusUpdateReqDTO updateReqDTO) {
deviceUpstreamService.updateDeviceStatus(updateReqDTO);
public CommonResult<Boolean> updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) {
deviceUpstreamService.updateDeviceState(updateReqDTO);
return success(true);
}

View File

@@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.iot.emq.service;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
import cn.iocoder.yudao.module.iot.service.device.data.IotDevicePropertyService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@@ -34,11 +33,11 @@ public class EmqxServiceImpl implements EmqxService {
String productKey = topic.split("/")[2];
String deviceName = topic.split("/")[3];
String message = new String(mqttMessage.getPayload());
IotDevicePropertyReportReqDTO createDTO = IotDevicePropertyReportReqDTO.builder()
// IotDevicePropertyReportReqDTO createDTO = IotDevicePropertyReportReqDTO.builder()
// .productKey(productKey)
// .deviceName(deviceName)
// .properties(message) // TODO 芋艿:临时去掉,看看
.build();
// .build();
// iotDeviceDataService.saveDeviceProperty(createDTO);
}
}

View File

@@ -395,10 +395,10 @@ public class IotDeviceServiceImpl implements IotDeviceService {
// 2.1 情况一:属性上报
String requestId = IdUtil.fastSimpleUUID();
if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.PROPERTY.getType())) {
deviceUpstreamService.reportDeviceProperty(IotDevicePropertyReportReqDTO.builder()
.requestId(requestId).reportTime(LocalDateTime.now())
.productKey(device.getProductKey()).deviceName(device.getDeviceName())
.properties((Map<String, Object>) reportReqVO.getData()).build());
deviceUpstreamService.reportDeviceProperty(((IotDevicePropertyReportReqDTO)
new IotDevicePropertyReportReqDTO().setRequestId(requestId).setReportTime(LocalDateTime.now())
.setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))
.setProperties((Map<String, Object>) reportReqVO.getData()));
return;
}
// 2.2 情况二:事件上报

View File

@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.service.device.upstream;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStatusUpdateReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
/**
* 设备上行 Service 接口
@@ -18,7 +18,7 @@ public interface IotDeviceUpstreamService {
*
* @param updateReqDTO 更新设备状态 DTO
*/
void updateDeviceStatus(IotDeviceStatusUpdateReqDTO updateReqDTO);
void updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO);
/**
* 上报设备属性数据

View File

@@ -1,15 +1,20 @@
package cn.iocoder.yudao.module.iot.service.device.upstream;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStatusUpdateReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceUpstreamAbstractReqDTO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
import cn.iocoder.yudao.module.iot.mq.producer.device.IotDeviceProducer;
import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
@@ -19,6 +24,7 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* 设备上行 Service 实现类
@@ -37,9 +43,39 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService {
private IotDeviceProducer deviceProducer;
@Override
public void updateDeviceStatus(IotDeviceStatusUpdateReqDTO updateReqDTO) {
log.info("[updateDeviceStatus][更新设备状态: {}]", updateReqDTO);
// TODO 芋艿:插件状态
public void updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) {
Assert.isTrue(ObjectUtils.equalsAny(updateReqDTO.getState(),
IotDeviceStateEnum.ONLINE.getState(), IotDeviceStateEnum.OFFLINE.getState()),
"状态不合法");
// 1.1 获得设备
log.info("[updateDeviceState][更新设备状态: {}]", updateReqDTO);
IotDeviceDO device = deviceService.getDeviceByProductKeyAndDeviceNameFromCache(
updateReqDTO.getProductKey(), updateReqDTO.getDeviceName());
if (device == null) {
log.error("[updateDeviceState][设备({}/{}) 不存在]",
updateReqDTO.getProductKey(), updateReqDTO.getDeviceName());
return;
}
// 1.2 记录设备的最后时间
updateDeviceLastTime(device, updateReqDTO);
// 1.3 当前状态一致,不处理
if (Objects.equals(device.getState(), updateReqDTO.getState())) {
return;
}
// 2. 更新设备状态
TenantUtils.executeIgnore(() ->
deviceService.updateDeviceState(device.getId(), updateReqDTO.getState()));
// 3. TODO 芋艿:子设备的关联
// 4. 发送设备消息
IotDeviceMessage message = BeanUtils.toBean(updateReqDTO, IotDeviceMessage.class)
.setType(IotDeviceMessageTypeEnum.STATE.getType())
.setIdentifier(ObjUtil.equals(updateReqDTO.getState(), IotDeviceStateEnum.ONLINE.getState())
? IotDeviceMessageIdentifierEnum.STATE_ONLINE.getIdentifier()
: IotDeviceMessageIdentifierEnum.STATE_OFFLINE.getIdentifier());
sendDeviceMessage(message, device);
}
@Override