【代码新增】IoT:增加 IotDeviceDownstreamHandler 接口的定义,以及 IotDeviceDownstreamServer 的部分实现
This commit is contained in:
parent
6a7aa3c3fc
commit
2d18e218c7
|
@ -1,9 +1,9 @@
|
||||||
package cn.iocoder.yudao.module.iot.api.device;
|
package cn.iocoder.yudao.module.iot.api.device;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
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.control.upstream.IotDeviceEventReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.enums.ApiConstants;
|
import cn.iocoder.yudao.module.iot.enums.ApiConstants;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IoT 设备下行的抽象 Request DTO
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public abstract class IotDeviceDownstreamAbstractReqDTO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求编号
|
||||||
|
*/
|
||||||
|
private String requestId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 产品标识
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "产品标识不能为空")
|
||||||
|
private String productKey;
|
||||||
|
/**
|
||||||
|
* 设备名称
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "设备名称不能为空")
|
||||||
|
private String deviceName;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IoT 设备【属性】获取 Request DTO
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class IotDevicePropertyGetReqDTO extends IotDeviceDownstreamAbstractReqDTO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 属性标识数组
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "属性标识数组不能为空")
|
||||||
|
private List<String> identifiers;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IoT 设备【属性】设置 Request DTO
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class IotDevicePropertySetReqDTO extends IotDeviceDownstreamAbstractReqDTO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 属性参数
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "属性参数不能为空")
|
||||||
|
private Map<String, Object> properties;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IoT 设备【服务】调用 Request DTO
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class IotDeviceServiceInvokeReqDTO extends IotDeviceDownstreamAbstractReqDTO {
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.yudao.module.iot.api.device.dto;
|
package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream;
|
||||||
|
|
||||||
import jakarta.validation.constraints.NotEmpty;
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
@ -6,7 +6,7 @@ import lombok.Data;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IoT 设备【事件】数据上报 Request DTO
|
* IoT 设备【事件】上报 Request DTO
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class IotDeviceEventReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {
|
public class IotDeviceEventReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.yudao.module.iot.api.device.dto;
|
package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream;
|
||||||
|
|
||||||
import jakarta.validation.constraints.NotEmpty;
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
@ -6,7 +6,7 @@ import lombok.Data;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IoT 设备【属性】数据上报 Request DTO
|
* IoT 设备【属性】上报 Request DTO
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class IotDevicePropertyReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {
|
public class IotDevicePropertyReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.yudao.module.iot.api.device.dto;
|
package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
|
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
|
||||||
|
@ -6,7 +6,7 @@ import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IoT 设备状态更新 Request DTO
|
* IoT 设备【状态】更新 Request DTO
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class IotDeviceStateUpdateReqDTO extends IotDeviceUpstreamAbstractReqDTO {
|
public class IotDeviceStateUpdateReqDTO extends IotDeviceUpstreamAbstractReqDTO {
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.yudao.module.iot.api.device.dto;
|
package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeSerializer;
|
import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeSerializer;
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
|
@ -0,0 +1,4 @@
|
||||||
|
/**
|
||||||
|
* TODO 芋艿:占位
|
||||||
|
*/
|
||||||
|
package cn.iocoder.yudao.module.iot.api.device.dto;
|
|
@ -1,9 +1,9 @@
|
||||||
package cn.iocoder.yudao.module.iot.api.device;
|
package cn.iocoder.yudao.module.iot.api.device;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
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.control.upstream.IotDeviceEventReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.service.device.control.IotDeviceUpstreamService;
|
import cn.iocoder.yudao.module.iot.service.device.control.IotDeviceUpstreamService;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
|
@ -5,7 +5,7 @@ import cn.hutool.core.util.IdUtil;
|
||||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||||
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
|
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
|
||||||
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
|
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
|
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
|
||||||
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
|
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
|
||||||
import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
|
import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
|
||||||
|
|
|
@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.mq.consumer.device;
|
||||||
|
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
|
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.IotDeviceMessageIdentifierEnum;
|
||||||
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
|
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
|
||||||
|
|
|
@ -1,10 +1,17 @@
|
||||||
package cn.iocoder.yudao.module.iot.service.device.control;
|
package cn.iocoder.yudao.module.iot.service.device.control;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceSimulationUpstreamReqVO;
|
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceSimulationUpstreamReqVO;
|
||||||
|
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.service.device.IotDeviceService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设备下行 Service 实现类
|
* 设备下行 Service 实现类
|
||||||
*
|
*
|
||||||
|
@ -15,9 +22,53 @@ import org.springframework.validation.annotation.Validated;
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class IotDeviceDownstreamServiceImpl implements IotDeviceDownstreamService {
|
public class IotDeviceDownstreamServiceImpl implements IotDeviceDownstreamService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IotDeviceService deviceService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void simulationDeviceDownstream(IotDeviceSimulationUpstreamReqVO downstreamReqVO) {
|
public void simulationDeviceDownstream(IotDeviceSimulationUpstreamReqVO downstreamReqVO) {
|
||||||
|
// 校验设备是否存在
|
||||||
|
IotDeviceDO device = deviceService.validateDeviceExists(downstreamReqVO.getId());
|
||||||
|
// TODO 芋艿:父设备的处理
|
||||||
|
IotDeviceDO parentDevice = null;
|
||||||
|
|
||||||
|
// 服务调用
|
||||||
|
if (Objects.equals(downstreamReqVO.getType(), IotDeviceMessageTypeEnum.SERVICE.getType())) {
|
||||||
|
invokeDeviceService(downstreamReqVO, device, parentDevice);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 属性相关
|
||||||
|
if (Objects.equals(downstreamReqVO.getType(), IotDeviceMessageTypeEnum.PROPERTY.getType()))
|
||||||
|
// 属性设置
|
||||||
|
if (Objects.equals(downstreamReqVO.getIdentifier(), IotDeviceMessageIdentifierEnum.PROPERTY_SET.getIdentifier())) {
|
||||||
|
setDeviceProperty(downstreamReqVO, device, parentDevice);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 属性设置
|
||||||
|
if (Objects.equals(downstreamReqVO.getIdentifier(), IotDeviceMessageIdentifierEnum.PROPERTY_GET.getIdentifier())) {
|
||||||
|
getDeviceProperty(downstreamReqVO, device, parentDevice);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// TODO 芋艿:ota 升级
|
||||||
|
// TODO 芋艿:配置下发
|
||||||
|
}
|
||||||
|
|
||||||
|
private void invokeDeviceService(IotDeviceSimulationUpstreamReqVO downstreamReqVO,
|
||||||
|
IotDeviceDO device, IotDeviceDO parentDevice) {
|
||||||
|
// 校验服务是否存在
|
||||||
|
// TODO 芋艿:这里需要校验服务是否存在
|
||||||
|
// 调用服务
|
||||||
|
// TODO 芋艿:这里需要调用服务
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setDeviceProperty(IotDeviceSimulationUpstreamReqVO downstreamReqVO,
|
||||||
|
IotDeviceDO device, IotDeviceDO parentDevice) {
|
||||||
|
// TODO 芋艿:这里需要设置设备属性
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getDeviceProperty(IotDeviceSimulationUpstreamReqVO downstreamReqVO,
|
||||||
|
IotDeviceDO device, IotDeviceDO parentDevice) {
|
||||||
|
// TODO 芋艿:这里需要获取设备属性
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package cn.iocoder.yudao.module.iot.service.device.control;
|
package cn.iocoder.yudao.module.iot.service.device.control;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceSimulationUpstreamReqVO;
|
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceSimulationUpstreamReqVO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,10 @@ import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
|
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
|
||||||
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
|
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.control.upstream.IotDeviceEventReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceUpstreamAbstractReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceUpstreamAbstractReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceSimulationUpstreamReqVO;
|
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceSimulationUpstreamReqVO;
|
||||||
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
|
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.IotDeviceMessageIdentifierEnum;
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
</description>
|
</description>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<!-- TODO 芋艿:依赖整理 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
<artifactId>yudao-common</artifactId>
|
<artifactId>yudao-common</artifactId>
|
||||||
|
@ -29,28 +30,27 @@
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 其他依赖项 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- PF4J -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.pf4j</groupId>
|
|
||||||
<artifactId>pf4j-spring</artifactId>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>org.slf4j</groupId>
|
|
||||||
<artifactId>slf4j-log4j12</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 其他依赖项 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Vert.x Web -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.vertx</groupId>
|
||||||
|
<artifactId>vertx-web</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package cn.iocoder.yudao.module.iot.plugin.common.config;
|
package cn.iocoder.yudao.module.iot.plugin.common.config;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
|
import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
|
||||||
import cn.iocoder.yudao.module.iot.plugin.common.api.DeviceDataApiClient;
|
import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.IotDeviceDownstreamHandler;
|
||||||
|
import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.IotDeviceDownstreamServer;
|
||||||
|
import cn.iocoder.yudao.module.iot.plugin.common.core.upstream.IotDeviceUpstreamClient;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
import org.springframework.boot.web.client.RestTemplateBuilder;
|
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||||
|
@ -10,6 +12,7 @@ import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
|
||||||
|
// TODO @芋艿:配置类的名字
|
||||||
/**
|
/**
|
||||||
* 设备数据 API 初始化器
|
* 设备数据 API 初始化器
|
||||||
*
|
*
|
||||||
|
@ -31,8 +34,8 @@ public class YudaoDeviceDataApiAutoConfiguration {
|
||||||
public RestTemplate restTemplate() {
|
public RestTemplate restTemplate() {
|
||||||
// 如果你有更多的自定义需求,比如连接池、超时时间等,可以在这里设置
|
// 如果你有更多的自定义需求,比如连接池、超时时间等,可以在这里设置
|
||||||
return new RestTemplateBuilder()
|
return new RestTemplateBuilder()
|
||||||
.setConnectTimeout(Duration.ofMillis(5000)) // 设置连接超时时间
|
.connectTimeout(Duration.ofMillis(5000)) // 设置连接超时时间
|
||||||
.setReadTimeout(Duration.ofMillis(5000)) // 设置读取超时时间
|
.readTimeout(Duration.ofMillis(5000)) // 设置读取超时时间
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,7 +47,13 @@ public class YudaoDeviceDataApiAutoConfiguration {
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public IotDeviceUpstreamApi deviceDataApi(RestTemplate restTemplate) {
|
public IotDeviceUpstreamApi deviceDataApi(RestTemplate restTemplate) {
|
||||||
return new DeviceDataApiClient(restTemplate, deviceDataUrl);
|
return new IotDeviceUpstreamClient(restTemplate, deviceDataUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(initMethod = "start", destroyMethod = "stop")
|
||||||
|
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
|
||||||
|
public IotDeviceDownstreamServer deviceDownstreamServer(IotDeviceDownstreamHandler deviceDownstreamHandler) {
|
||||||
|
return new IotDeviceDownstreamServer(deviceDownstreamHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package cn.iocoder.yudao.module.iot.plugin.common.core.downstream;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDevicePropertyGetReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDevicePropertySetReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDeviceServiceInvokeReqDTO;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IoT 设备下行处理器
|
||||||
|
*
|
||||||
|
* 目的:每个 plugin 需要实现,用于处理 server 下行的指令(请求),从而实现从 server => plugin => device 的下行流程
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
public interface IotDeviceDownstreamHandler {
|
||||||
|
|
||||||
|
CommonResult<Boolean> invokeDeviceService(IotDeviceServiceInvokeReqDTO invokeReqDTO);
|
||||||
|
|
||||||
|
CommonResult<Boolean> getDeviceProperty(IotDevicePropertyGetReqDTO getReqDTO);
|
||||||
|
|
||||||
|
CommonResult<Boolean> setDeviceProperty(IotDevicePropertySetReqDTO setReqDTO);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
package cn.iocoder.yudao.module.iot.plugin.common.core.downstream;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.router.IotDeviceServiceInvokeVertxHandler;
|
||||||
|
import io.vertx.core.Vertx;
|
||||||
|
import io.vertx.core.http.HttpServer;
|
||||||
|
import io.vertx.ext.web.Router;
|
||||||
|
import io.vertx.ext.web.handler.BodyHandler;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class IotDeviceDownstreamServer {
|
||||||
|
|
||||||
|
private final Vertx vertx;
|
||||||
|
private final HttpServer server;
|
||||||
|
|
||||||
|
public IotDeviceDownstreamServer(IotDeviceDownstreamHandler deviceDownstreamHandler) {
|
||||||
|
// 创建 Vertx 实例
|
||||||
|
this.vertx = Vertx.vertx();
|
||||||
|
// 创建 Router 实例
|
||||||
|
Router router = Router.router(vertx);
|
||||||
|
router.route().handler(BodyHandler.create()); // 处理 Body
|
||||||
|
router.post(IotDeviceServiceInvokeVertxHandler.PATH).handler(
|
||||||
|
new IotDeviceServiceInvokeVertxHandler(deviceDownstreamHandler)); // 处理 Service Invoke
|
||||||
|
// 创建 HttpServer 实例
|
||||||
|
this.server = vertx.createHttpServer().requestHandler(router);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
log.info("[start][开始启动]");
|
||||||
|
server.listen(0) // 通过 0 自动选择端口
|
||||||
|
.toCompletionStage()
|
||||||
|
.toCompletableFuture()
|
||||||
|
.join();
|
||||||
|
log.info("[start][启动完成,端口({})]", this.server.actualPort());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
log.info("[stop][开始关闭]");
|
||||||
|
try {
|
||||||
|
// 关闭 HTTP 服务器
|
||||||
|
if (server != null) {
|
||||||
|
server.close()
|
||||||
|
.toCompletionStage()
|
||||||
|
.toCompletableFuture()
|
||||||
|
.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关闭 Vertx 实例
|
||||||
|
if (vertx != null) {
|
||||||
|
vertx.close()
|
||||||
|
.toCompletionStage()
|
||||||
|
.toCompletableFuture()
|
||||||
|
.join();
|
||||||
|
}
|
||||||
|
log.info("[stop][关闭完成]");
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("[stop][关闭异常]", e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得端口
|
||||||
|
*
|
||||||
|
* @return 端口
|
||||||
|
*/
|
||||||
|
public int getPort() {
|
||||||
|
return this.server.actualPort();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package cn.iocoder.yudao.module.iot.plugin.common.core.downstream.router;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.IotDeviceDownstreamHandler;
|
||||||
|
import io.vertx.core.Handler;
|
||||||
|
import io.vertx.ext.web.RoutingContext;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class IotDeviceServiceInvokeVertxHandler implements Handler<RoutingContext> {
|
||||||
|
|
||||||
|
public static final String PATH = "/sys/:productKey/:deviceName/thing/service/:identifier";
|
||||||
|
|
||||||
|
private final IotDeviceDownstreamHandler deviceDownstreamHandler;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(RoutingContext routingContext) {
|
||||||
|
// TODO 芋艿:这里没实现
|
||||||
|
deviceDownstreamHandler.invokeDeviceService(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,19 +1,24 @@
|
||||||
package cn.iocoder.yudao.module.iot.plugin.common.api;
|
package cn.iocoder.yudao.module.iot.plugin.common.core.upstream;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
|
import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
// TODO @haohao:类注释,写一下,比较好
|
/**
|
||||||
// TODO @haohao:类名要改下
|
* 设备数据 Upstream 上行客户端
|
||||||
|
*
|
||||||
|
* 通过 HTTP 调用远程的 IotDeviceUpstreamApi 接口
|
||||||
|
*
|
||||||
|
* @author haohao
|
||||||
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class DeviceDataApiClient implements IotDeviceUpstreamApi {
|
public class IotDeviceUpstreamClient implements IotDeviceUpstreamApi {
|
||||||
|
|
||||||
public static final String URL_PREFIX = "/rpc-api/iot/device/upstream";
|
public static final String URL_PREFIX = "/rpc-api/iot/device/upstream";
|
||||||
|
|
||||||
|
@ -22,7 +27,7 @@ public class DeviceDataApiClient implements IotDeviceUpstreamApi {
|
||||||
|
|
||||||
// 可以通过构造器把 RestTemplate 和 baseUrl 注入进来
|
// 可以通过构造器把 RestTemplate 和 baseUrl 注入进来
|
||||||
// TODO @haohao:可以用 lombok 简化
|
// TODO @haohao:可以用 lombok 简化
|
||||||
public DeviceDataApiClient(RestTemplate restTemplate, String deviceDataUrl) {
|
public IotDeviceUpstreamClient(RestTemplate restTemplate, String deviceDataUrl) {
|
||||||
this.restTemplate = restTemplate;
|
this.restTemplate = restTemplate;
|
||||||
this.deviceDataUrl = deviceDataUrl;
|
this.deviceDataUrl = deviceDataUrl;
|
||||||
}
|
}
|
|
@ -121,12 +121,20 @@
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<!-- TODO 芋艿:优化下 -->
|
||||||
<!-- 项目依赖 -->
|
<!-- 项目依赖 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
<artifactId>yudao-module-iot-plugin-common</artifactId>
|
<artifactId>yudao-module-iot-plugin-common</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 其他依赖项 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- Vert.x Web -->
|
<!-- Vert.x Web -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.vertx</groupId>
|
<groupId>io.vertx</groupId>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.yudao.module.iot.plugin.http.config;
|
package cn.iocoder.yudao.module.iot.plugin.http.config;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
|
import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
|
||||||
import cn.iocoder.yudao.module.iot.plugin.http.service.HttpVertxHandler;
|
import cn.iocoder.yudao.module.iot.plugin.http.framework.upstream.HttpVertxHandler;
|
||||||
import io.vertx.core.Vertx;
|
import io.vertx.core.Vertx;
|
||||||
import io.vertx.ext.web.Router;
|
import io.vertx.ext.web.Router;
|
||||||
import io.vertx.ext.web.handler.BodyHandler;
|
import io.vertx.ext.web.handler.BodyHandler;
|
||||||
|
@ -34,7 +34,7 @@ public class HttpVertxPluginConfiguration {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建路由
|
* 创建路由
|
||||||
*
|
*
|
||||||
* @param vertx Vertx 实例
|
* @param vertx Vertx 实例
|
||||||
* @param httpVertxHandler HttpVertxHandler 实例
|
* @param httpVertxHandler HttpVertxHandler 实例
|
||||||
* @return Router 实例
|
* @return Router 实例
|
||||||
|
@ -68,7 +68,7 @@ public class HttpVertxPluginConfiguration {
|
||||||
/**
|
/**
|
||||||
* 定义一个 VertxService 来管理服务器启动逻辑
|
* 定义一个 VertxService 来管理服务器启动逻辑
|
||||||
* 无论是独立运行还是插件方式,都可以共用此类
|
* 无论是独立运行还是插件方式,都可以共用此类
|
||||||
*
|
*
|
||||||
* @param vertx Vertx 实例
|
* @param vertx Vertx 实例
|
||||||
* @param router Router 实例
|
* @param router Router 实例
|
||||||
* @return VertxService 实例
|
* @return VertxService 实例
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
package cn.iocoder.yudao.module.iot.plugin.http.framework.downstream;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDevicePropertyGetReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDevicePropertySetReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDeviceServiceInvokeReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.IotDeviceDownstreamHandler;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component // TODO @芋艿:后续统一处理
|
||||||
|
public class IotDeviceDownstreamHandlerImpl implements IotDeviceDownstreamHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<Boolean> invokeDeviceService(IotDeviceServiceInvokeReqDTO invokeReqDTO) {
|
||||||
|
// TODO @芋艿:待实现
|
||||||
|
System.out.println();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<Boolean> getDeviceProperty(IotDevicePropertyGetReqDTO getReqDTO) {
|
||||||
|
// TODO @芋艿:待实现
|
||||||
|
System.out.println();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<Boolean> setDeviceProperty(IotDevicePropertySetReqDTO setReqDTO) {
|
||||||
|
// TODO @芋艿:待实现
|
||||||
|
System.out.println();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
package cn.iocoder.yudao.module.iot.plugin.http.framework;
|
|
@ -1,11 +1,11 @@
|
||||||
package cn.iocoder.yudao.module.iot.plugin.http.service;
|
package cn.iocoder.yudao.module.iot.plugin.http.framework.upstream;
|
||||||
|
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
|
import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
|
import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
|
||||||
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
|
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
|
||||||
import io.vertx.core.Handler;
|
import io.vertx.core.Handler;
|
||||||
import io.vertx.ext.web.RequestBody;
|
import io.vertx.ext.web.RequestBody;
|
Loading…
Reference in New Issue