【功能新增】IoT:设备状态上传的部分实现
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 情况二:事件上报
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 上报设备属性数据
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user