Commit 5f7bb8041f984980e9b56b66947e60a6dc2c6152
1 parent
d718f801
【功能新增】IoT:设备注册 register 逻辑
Showing
13 changed files
with
146 additions
and
35 deletions
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/IotDeviceUpstreamApi.java
| 1 | package cn.iocoder.yudao.module.iot.api.device; | 1 | package cn.iocoder.yudao.module.iot.api.device; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO; | ||
| 5 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO; | ||
| 6 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO; | ||
| 7 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotPluginInstanceHeartbeatReqDTO; | 4 | +import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.*; |
| 8 | import cn.iocoder.yudao.module.iot.enums.ApiConstants; | 5 | import cn.iocoder.yudao.module.iot.enums.ApiConstants; |
| 9 | import jakarta.validation.Valid; | 6 | import jakarta.validation.Valid; |
| 10 | import org.springframework.web.bind.annotation.PostMapping; | 7 | import org.springframework.web.bind.annotation.PostMapping; |
| @@ -47,6 +44,15 @@ public interface IotDeviceUpstreamApi { | @@ -47,6 +44,15 @@ public interface IotDeviceUpstreamApi { | ||
| 47 | @PostMapping(PREFIX + "/report-event") | 44 | @PostMapping(PREFIX + "/report-event") |
| 48 | CommonResult<Boolean> reportDeviceEvent(@Valid @RequestBody IotDeviceEventReportReqDTO reportReqDTO); | 45 | CommonResult<Boolean> reportDeviceEvent(@Valid @RequestBody IotDeviceEventReportReqDTO reportReqDTO); |
| 49 | 46 | ||
| 47 | + // TODO @芋艿:这个需要 plugins 接入下 | ||
| 48 | + /** | ||
| 49 | + * 注册设备 | ||
| 50 | + * | ||
| 51 | + * @param registerReqDTO 注册设备 DTO | ||
| 52 | + */ | ||
| 53 | + @PostMapping(PREFIX + "/register") | ||
| 54 | + CommonResult<Boolean> registerDevice(@Valid @RequestBody IotDeviceRegisterReqDTO registerReqDTO); | ||
| 55 | + | ||
| 50 | // ========== 插件相关 ========== | 56 | // ========== 插件相关 ========== |
| 51 | 57 | ||
| 52 | /** | 58 | /** |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceRegisterReqDTO.java
0 → 100644
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceMessageIdentifierEnum.java
| @@ -26,7 +26,11 @@ public enum IotDeviceMessageIdentifierEnum { | @@ -26,7 +26,11 @@ public enum IotDeviceMessageIdentifierEnum { | ||
| 26 | OTA_UPGRADE("upgrade"), // 下行 | 26 | OTA_UPGRADE("upgrade"), // 下行 |
| 27 | OTA_PULL("pull"), // 上行 | 27 | OTA_PULL("pull"), // 上行 |
| 28 | OTA_PROGRESS("progress"), // 上行 | 28 | OTA_PROGRESS("progress"), // 上行 |
| 29 | - OTA_REPORT("report"),; // 上行 | 29 | + OTA_REPORT("report"), // 上行 |
| 30 | + | ||
| 31 | + REGISTER_REGISTER("register"), // 上行 | ||
| 32 | + REGISTER_SUB_REGISTER("sub_register"), // 上行 | ||
| 33 | + REGISTER_SUB_UNREGISTER("sub_unregister"),; // 下行 | ||
| 30 | 34 | ||
| 31 | /** | 35 | /** |
| 32 | * 标志符 | 36 | * 标志符 |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceMessageTypeEnum.java
| @@ -14,11 +14,12 @@ import java.util.Arrays; | @@ -14,11 +14,12 @@ import java.util.Arrays; | ||
| 14 | public enum IotDeviceMessageTypeEnum implements ArrayValuable<String> { | 14 | public enum IotDeviceMessageTypeEnum implements ArrayValuable<String> { |
| 15 | 15 | ||
| 16 | STATE("state"), // 设备状态 | 16 | STATE("state"), // 设备状态 |
| 17 | - PROPERTY("property"), // 设备属性 | ||
| 18 | - EVENT("event"), // 设备事件 | ||
| 19 | - SERVICE("service"), // 设备服务 | ||
| 20 | - CONFIG("config"), // 设备配置 | ||
| 21 | - OTA("ota"),; // 设备 OTA | 17 | + PROPERTY("property"), // 设备属性:可参考 https://help.aliyun.com/zh/iot/user-guide/device-properties-events-and-services 设备属性、事件、服务 |
| 18 | + EVENT("event"), // 设备事件:可参考 https://help.aliyun.com/zh/iot/user-guide/device-properties-events-and-services 设备属性、事件、服务 | ||
| 19 | + SERVICE("service"), // 设备服务:可参考 https://help.aliyun.com/zh/iot/user-guide/device-properties-events-and-services 设备属性、事件、服务 | ||
| 20 | + CONFIG("config"), // 设备配置:可参考 https://help.aliyun.com/zh/iot/user-guide/remote-configuration-1 远程配置 | ||
| 21 | + OTA("ota"), // 设备 OTA:可参考 https://help.aliyun.com/zh/iot/user-guide/ota-update OTA 升级 | ||
| 22 | + REGISTER("register"),; // 设备注册:可参考 https://help.aliyun.com/zh/iot/user-guide/register-devices 设备身份注册 | ||
| 22 | 23 | ||
| 23 | public static final String[] ARRAYS = Arrays.stream(values()).map(IotDeviceMessageTypeEnum::getType).toArray(String[]::new); | 24 | public static final String[] ARRAYS = Arrays.stream(values()).map(IotDeviceMessageTypeEnum::getType).toArray(String[]::new); |
| 24 | 25 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/api/device/IoTDeviceUpstreamApiImpl.java
| 1 | package cn.iocoder.yudao.module.iot.api.device; | 1 | package cn.iocoder.yudao.module.iot.api.device; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO; | ||
| 5 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO; | ||
| 6 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO; | ||
| 7 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotPluginInstanceHeartbeatReqDTO; | 4 | +import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.*; |
| 8 | import cn.iocoder.yudao.module.iot.service.device.control.IotDeviceUpstreamService; | 5 | import cn.iocoder.yudao.module.iot.service.device.control.IotDeviceUpstreamService; |
| 9 | import cn.iocoder.yudao.module.iot.service.plugin.IotPluginInstanceService; | 6 | import cn.iocoder.yudao.module.iot.service.plugin.IotPluginInstanceService; |
| 10 | import org.springframework.validation.annotation.Validated; | 7 | import org.springframework.validation.annotation.Validated; |
| @@ -46,6 +43,12 @@ public class IoTDeviceUpstreamApiImpl implements IotDeviceUpstreamApi { | @@ -46,6 +43,12 @@ public class IoTDeviceUpstreamApiImpl implements IotDeviceUpstreamApi { | ||
| 46 | return success(true); | 43 | return success(true); |
| 47 | } | 44 | } |
| 48 | 45 | ||
| 46 | + @Override | ||
| 47 | + public CommonResult<Boolean> registerDevice(IotDeviceRegisterReqDTO registerReqDTO) { | ||
| 48 | + deviceUpstreamService.registerDevice(registerReqDTO); | ||
| 49 | + return success(true); | ||
| 50 | + } | ||
| 51 | + | ||
| 49 | // ========== 插件相关 ========== | 52 | // ========== 插件相关 ========== |
| 50 | 53 | ||
| 51 | @Override | 54 | @Override |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceSaveReqVO.java
| 1 | package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; | 1 | package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; |
| 2 | 2 | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | +import jakarta.validation.constraints.NotEmpty; | ||
| 4 | import jakarta.validation.constraints.Size; | 5 | import jakarta.validation.constraints.Size; |
| 5 | import lombok.Data; | 6 | import lombok.Data; |
| 6 | 7 | ||
| @@ -18,6 +19,7 @@ public class IotDeviceSaveReqVO { | @@ -18,6 +19,7 @@ public class IotDeviceSaveReqVO { | ||
| 18 | private String deviceKey; | 19 | private String deviceKey; |
| 19 | 20 | ||
| 20 | @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") | 21 | @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") |
| 22 | + @NotEmpty(message = "设备名称不能为空") | ||
| 21 | private String deviceName; | 23 | private String deviceName; |
| 22 | 24 | ||
| 23 | @Schema(description = "备注名称", example = "张三") | 25 | @Schema(description = "备注名称", example = "张三") |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/product/IotProductDO.java
| 1 | package cn.iocoder.yudao.module.iot.dal.dataobject.product; | 1 | package cn.iocoder.yudao.module.iot.dal.dataobject.product; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 3 | +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; |
| 4 | import com.baomidou.mybatisplus.annotation.KeySequence; | 4 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 5 | import com.baomidou.mybatisplus.annotation.TableId; | 5 | import com.baomidou.mybatisplus.annotation.TableId; |
| 6 | import com.baomidou.mybatisplus.annotation.TableName; | 6 | import com.baomidou.mybatisplus.annotation.TableName; |
| @@ -19,7 +19,7 @@ import lombok.*; | @@ -19,7 +19,7 @@ import lombok.*; | ||
| 19 | @Builder | 19 | @Builder |
| 20 | @NoArgsConstructor | 20 | @NoArgsConstructor |
| 21 | @AllArgsConstructor | 21 | @AllArgsConstructor |
| 22 | -public class IotProductDO extends BaseDO { | 22 | +public class IotProductDO extends TenantBaseDO { |
| 23 | 23 | ||
| 24 | /** | 24 | /** |
| 25 | * 产品 ID | 25 | * 产品 ID |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java
| @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*; | 4 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*; |
| 5 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; | 5 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; |
| 6 | import jakarta.validation.Valid; | 6 | import jakarta.validation.Valid; |
| 7 | +import jakarta.validation.constraints.NotEmpty; | ||
| 7 | 8 | ||
| 8 | import javax.annotation.Nullable; | 9 | import javax.annotation.Nullable; |
| 9 | import java.util.Collection; | 10 | import java.util.Collection; |
| @@ -17,7 +18,7 @@ import java.util.List; | @@ -17,7 +18,7 @@ import java.util.List; | ||
| 17 | public interface IotDeviceService { | 18 | public interface IotDeviceService { |
| 18 | 19 | ||
| 19 | /** | 20 | /** |
| 20 | - * 创建设备 | 21 | + * 【管理员】创建设备 |
| 21 | * | 22 | * |
| 22 | * @param createReqVO 创建信息 | 23 | * @param createReqVO 创建信息 |
| 23 | * @return 编号 | 24 | * @return 编号 |
| @@ -25,6 +26,16 @@ public interface IotDeviceService { | @@ -25,6 +26,16 @@ public interface IotDeviceService { | ||
| 25 | Long createDevice(@Valid IotDeviceSaveReqVO createReqVO); | 26 | Long createDevice(@Valid IotDeviceSaveReqVO createReqVO); |
| 26 | 27 | ||
| 27 | /** | 28 | /** |
| 29 | + * 【设备注册】创建设备 | ||
| 30 | + * | ||
| 31 | + * @param productKey 产品标识 | ||
| 32 | + * @param deviceName 设备名称 | ||
| 33 | + * @return 设备 | ||
| 34 | + */ | ||
| 35 | + IotDeviceDO createDevice(@NotEmpty(message = "产品标识不能为空") String productKey, | ||
| 36 | + @NotEmpty(message = "设备名称不能为空") String deviceName); | ||
| 37 | + | ||
| 38 | + /** | ||
| 28 | * 更新设备 | 39 | * 更新设备 |
| 29 | * | 40 | * |
| 30 | * @param updateReqVO 更新信息 | 41 | * @param updateReqVO 更新信息 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java
| @@ -71,7 +71,7 @@ public class IotDeviceServiceImpl implements IotDeviceService { | @@ -71,7 +71,7 @@ public class IotDeviceServiceImpl implements IotDeviceService { | ||
| 71 | } | 71 | } |
| 72 | }); | 72 | }); |
| 73 | // 1.3 校验设备名称在同一产品下是否唯一 | 73 | // 1.3 校验设备名称在同一产品下是否唯一 |
| 74 | - if (deviceMapper.selectByProductKeyAndDeviceName(product.getProductKey(), createReqVO.getDeviceKey()) != null) { | 74 | + if (deviceMapper.selectByProductKeyAndDeviceName(product.getProductKey(), createReqVO.getDeviceName()) != null) { |
| 75 | throw exception(DEVICE_NAME_EXISTS); | 75 | throw exception(DEVICE_NAME_EXISTS); |
| 76 | } | 76 | } |
| 77 | // 1.4 校验父设备是否为合法网关 | 77 | // 1.4 校验父设备是否为合法网关 |
| @@ -82,24 +82,55 @@ public class IotDeviceServiceImpl implements IotDeviceService { | @@ -82,24 +82,55 @@ public class IotDeviceServiceImpl implements IotDeviceService { | ||
| 82 | // 1.5 校验分组存在 | 82 | // 1.5 校验分组存在 |
| 83 | deviceGroupService.validateDeviceGroupExists(createReqVO.getGroupIds()); | 83 | deviceGroupService.validateDeviceGroupExists(createReqVO.getGroupIds()); |
| 84 | 84 | ||
| 85 | - // 2.1 转换 VO 为 DO | ||
| 86 | - // TODO @芋艿:各种 mqtt 是不是可以简化! | ||
| 87 | - IotDeviceDO device = BeanUtils.toBean(createReqVO, IotDeviceDO.class, o -> { | ||
| 88 | - o.setProductKey(product.getProductKey()).setDeviceType(product.getDeviceType()); | ||
| 89 | - // 生成并设置必要的字段 | ||
| 90 | - o.setDeviceSecret(generateDeviceSecret()) | ||
| 91 | - .setMqttClientId(generateMqttClientId()) | ||
| 92 | - .setMqttUsername(generateMqttUsername(o.getDeviceName(), o.getProductKey())) | ||
| 93 | - .setMqttPassword(generateMqttPassword()); | ||
| 94 | - // 设置设备状态为未激活 | ||
| 95 | - o.setState(IotDeviceStateEnum.INACTIVE.getState()); | ||
| 96 | - }); | ||
| 97 | - // 2.2 插入到数据库 | 85 | + // 2. 插入到数据库 |
| 86 | + IotDeviceDO device = BeanUtils.toBean(createReqVO, IotDeviceDO.class); | ||
| 87 | + initDevice(device, product); | ||
| 98 | deviceMapper.insert(device); | 88 | deviceMapper.insert(device); |
| 99 | return device.getId(); | 89 | return device.getId(); |
| 100 | } | 90 | } |
| 101 | 91 | ||
| 102 | @Override | 92 | @Override |
| 93 | + public IotDeviceDO createDevice(String productKey, String deviceName) { | ||
| 94 | + // 1.1 校验产品是否存在 | ||
| 95 | + IotProductDO product = TenantUtils.executeIgnore(() -> | ||
| 96 | + productService.getProductByProductKey(productKey)); | ||
| 97 | + if (product == null) { | ||
| 98 | + throw exception(PRODUCT_NOT_EXISTS); | ||
| 99 | + } | ||
| 100 | + // 1.2 校验设备标识是否唯一 | ||
| 101 | + String deviceKey = generateDeviceKey(); | ||
| 102 | + TenantUtils.executeIgnore(() -> { | ||
| 103 | + if (deviceMapper.selectByDeviceKey(deviceKey) != null) { | ||
| 104 | + throw exception(PRODUCT_KEY_EXISTS); | ||
| 105 | + } | ||
| 106 | + }); | ||
| 107 | + return TenantUtils.execute(product.getTenantId(), () -> { | ||
| 108 | + // 1.3 校验设备名称在同一产品下是否唯一 | ||
| 109 | + if (deviceMapper.selectByProductKeyAndDeviceName(product.getProductKey(), deviceName) != null) { | ||
| 110 | + throw exception(DEVICE_NAME_EXISTS); | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + // 2. 插入到数据库 | ||
| 114 | + IotDeviceDO device = new IotDeviceDO().setDeviceName(deviceName).setDeviceKey(deviceKey); | ||
| 115 | + initDevice(device, product); | ||
| 116 | + deviceMapper.insert(device); | ||
| 117 | + return device; | ||
| 118 | + }); | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + private void initDevice(IotDeviceDO device, IotProductDO product) { | ||
| 122 | + device.setProductId(product.getId()).setProductKey(product.getProductKey()).setDeviceType(product.getDeviceType()); | ||
| 123 | + // 生成并设置必要的字段 | ||
| 124 | + // TODO @芋艿:各种 mqtt 是不是可以简化! | ||
| 125 | + device.setDeviceSecret(generateDeviceSecret()) | ||
| 126 | + .setMqttClientId(generateMqttClientId()) | ||
| 127 | + .setMqttUsername(generateMqttUsername(device.getDeviceName(), device.getProductKey())) | ||
| 128 | + .setMqttPassword(generateMqttPassword()); | ||
| 129 | + // 设置设备状态为未激活 | ||
| 130 | + device.setState(IotDeviceStateEnum.INACTIVE.getState()); | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + @Override | ||
| 103 | public void updateDevice(IotDeviceSaveReqVO updateReqVO) { | 134 | public void updateDevice(IotDeviceSaveReqVO updateReqVO) { |
| 104 | updateReqVO.setDeviceKey(null).setDeviceName(null).setProductId(null); // 不允许更新 | 135 | updateReqVO.setDeviceKey(null).setDeviceName(null).setProductId(null); // 不允许更新 |
| 105 | // 1.1 校验存在 | 136 | // 1.1 校验存在 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamService.java
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.service.device.control; | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.service.device.control; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO; | 3 | import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO; |
| 4 | import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO; | 4 | import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO; |
| 5 | +import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceRegisterReqDTO; | ||
| 5 | import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO; | 6 | import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO; |
| 6 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceUpstreamReqVO; | 7 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceUpstreamReqVO; |
| 7 | import jakarta.validation.Valid; | 8 | import jakarta.validation.Valid; |
| @@ -43,4 +44,11 @@ public interface IotDeviceUpstreamService { | @@ -43,4 +44,11 @@ public interface IotDeviceUpstreamService { | ||
| 43 | */ | 44 | */ |
| 44 | void reportDeviceEvent(IotDeviceEventReportReqDTO reportReqDTO); | 45 | void reportDeviceEvent(IotDeviceEventReportReqDTO reportReqDTO); |
| 45 | 46 | ||
| 47 | + /** | ||
| 48 | + * 注册设备 | ||
| 49 | + * | ||
| 50 | + * @param registerReqDTO 注册设备 DTO | ||
| 51 | + */ | ||
| 52 | + void registerDevice(IotDeviceRegisterReqDTO registerReqDTO); | ||
| 53 | + | ||
| 46 | } | 54 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamServiceImpl.java
| @@ -7,10 +7,7 @@ import cn.hutool.core.util.StrUtil; | @@ -7,10 +7,7 @@ import cn.hutool.core.util.StrUtil; | ||
| 7 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 7 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 8 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 8 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 9 | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; | 9 | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; |
| 10 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO; | ||
| 11 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO; | ||
| 12 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO; | ||
| 13 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceUpstreamAbstractReqDTO; | 10 | +import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.*; |
| 14 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceUpstreamReqVO; | 11 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceUpstreamReqVO; |
| 15 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; | 12 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; |
| 16 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; | 13 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; |
| @@ -165,6 +162,29 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService { | @@ -165,6 +162,29 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService { | ||
| 165 | sendDeviceMessage(message, device); | 162 | sendDeviceMessage(message, device); |
| 166 | } | 163 | } |
| 167 | 164 | ||
| 165 | + @Override | ||
| 166 | + public void registerDevice(IotDeviceRegisterReqDTO registerReqDTO) { | ||
| 167 | + // 1.1 注册设备 | ||
| 168 | + log.info("[registerDevice][注册设备: {}]", registerReqDTO); | ||
| 169 | + IotDeviceDO device = deviceService.getDeviceByProductKeyAndDeviceNameFromCache( | ||
| 170 | + registerReqDTO.getProductKey(), registerReqDTO.getDeviceName()); | ||
| 171 | + boolean register = device == null; | ||
| 172 | + if (device == null) { | ||
| 173 | + device = deviceService.createDevice(registerReqDTO.getProductKey(), registerReqDTO.getDeviceName()); | ||
| 174 | + log.info("[registerDevice][请求({}) 成功注册设备({})]", registerReqDTO, device); | ||
| 175 | + } | ||
| 176 | + // 1.2 记录设备的最后时间 | ||
| 177 | + updateDeviceLastTime(device, registerReqDTO); | ||
| 178 | + | ||
| 179 | + // 2. 发送设备消息 | ||
| 180 | + if (register) { | ||
| 181 | + IotDeviceMessage message = BeanUtils.toBean(registerReqDTO, IotDeviceMessage.class) | ||
| 182 | + .setType(IotDeviceMessageTypeEnum.REGISTER.getType()) | ||
| 183 | + .setIdentifier(IotDeviceMessageIdentifierEnum.REGISTER_REGISTER.getIdentifier()); | ||
| 184 | + sendDeviceMessage(message, device); | ||
| 185 | + } | ||
| 186 | + } | ||
| 187 | + | ||
| 168 | private void updateDeviceLastTime(IotDeviceDO device, IotDeviceUpstreamAbstractReqDTO reqDTO) { | 188 | private void updateDeviceLastTime(IotDeviceDO device, IotDeviceUpstreamAbstractReqDTO reqDTO) { |
| 169 | // 1. 【异步】记录设备与插件实例的映射 | 189 | // 1. 【异步】记录设备与插件实例的映射 |
| 170 | pluginInstanceService.updateDevicePluginInstanceProcessIdAsync(device.getDeviceKey(), reqDTO.getProcessId()); | 190 | pluginInstanceService.updateDevicePluginInstanceProcessIdAsync(device.getDeviceKey(), reqDTO.getProcessId()); |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductService.java
| @@ -46,6 +46,14 @@ public interface IotProductService { | @@ -46,6 +46,14 @@ public interface IotProductService { | ||
| 46 | IotProductDO getProduct(Long id); | 46 | IotProductDO getProduct(Long id); |
| 47 | 47 | ||
| 48 | /** | 48 | /** |
| 49 | + * 根据产品 key 获得产品 | ||
| 50 | + * | ||
| 51 | + * @param productKey 产品 key | ||
| 52 | + * @return 产品 | ||
| 53 | + */ | ||
| 54 | + IotProductDO getProductByProductKey(String productKey); | ||
| 55 | + | ||
| 56 | + /** | ||
| 49 | * 校验产品存在 | 57 | * 校验产品存在 |
| 50 | * | 58 | * |
| 51 | * @param id 编号 | 59 | * @param id 编号 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductServiceImpl.java
| @@ -106,6 +106,11 @@ public class IotProductServiceImpl implements IotProductService { | @@ -106,6 +106,11 @@ public class IotProductServiceImpl implements IotProductService { | ||
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | @Override | 108 | @Override |
| 109 | + public IotProductDO getProductByProductKey(String productKey) { | ||
| 110 | + return productMapper.selectByProductKey(productKey); | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + @Override | ||
| 109 | public PageResult<IotProductDO> getProductPage(IotProductPageReqVO pageReqVO) { | 114 | public PageResult<IotProductDO> getProductPage(IotProductPageReqVO pageReqVO) { |
| 110 | return productMapper.selectPage(pageReqVO); | 115 | return productMapper.selectPage(pageReqVO); |
| 111 | } | 116 | } |