Commit 5110948db813ae41c466432b3c8064d4c1e7feb1

Authored by YunaiV
1 parent 911c8c74

【代码优化】IoT:设备下行实现前,相关代码的整理

Showing 25 changed files with 44 additions and 392 deletions
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginDeployTypeEnum.java
@@ -33,17 +33,13 @@ public enum IotPluginDeployTypeEnum implements ArrayValuable<Integer> { @@ -33,17 +33,13 @@ public enum IotPluginDeployTypeEnum implements ArrayValuable<Integer> {
33 this.name = name; 33 this.name = name;
34 } 34 }
35 35
36 - public static IotPluginDeployTypeEnum fromDeployType(Integer deployType) { 36 + public static IotPluginDeployTypeEnum valueOf(Integer deployType) {
37 return Arrays.stream(values()) 37 return Arrays.stream(values())
38 .filter(value -> value.getDeployType().equals(deployType)) 38 .filter(value -> value.getDeployType().equals(deployType))
39 .findFirst() 39 .findFirst()
40 .orElse(null); 40 .orElse(null);
41 } 41 }
42 42
43 - public static boolean isValidDeployType(Integer deployType) {  
44 - return fromDeployType(deployType) != null;  
45 - }  
46 -  
47 @Override 43 @Override
48 public Integer[] array() { 44 public Integer[] array() {
49 return ARRAYS; 45 return ARRAYS;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/PluginInfoController.java
@@ -3,11 +3,11 @@ package cn.iocoder.yudao.module.iot.controller.admin.plugin; @@ -3,11 +3,11 @@ package cn.iocoder.yudao.module.iot.controller.admin.plugin;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoImportReqVO;  
7 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;  
8 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoRespVO;  
9 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;  
10 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO; 6 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info.PluginInfoImportReqVO;
  7 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info.PluginInfoPageReqVO;
  8 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info.PluginInfoRespVO;
  9 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info.PluginInfoSaveReqVO;
  10 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.PluginInfoDO;
11 import cn.iocoder.yudao.module.iot.service.plugin.PluginInfoService; 11 import cn.iocoder.yudao.module.iot.service.plugin.PluginInfoService;
12 import io.swagger.v3.oas.annotations.Operation; 12 import io.swagger.v3.oas.annotations.Operation;
13 import io.swagger.v3.oas.annotations.Parameter; 13 import io.swagger.v3.oas.annotations.Parameter;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstanceSaveReqVO.java deleted
1 -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo;  
2 -  
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.*;  
5 -import jakarta.validation.constraints.*;  
6 -  
7 -@Schema(description = "管理后台 - IoT 插件实例新增/修改 Request VO")  
8 -@Data  
9 -public class PluginInstanceSaveReqVO {  
10 -  
11 - @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23864")  
12 - private Long id;  
13 -  
14 - @Schema(description = "插件主程序id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23738")  
15 - @NotEmpty(message = "插件主程序id不能为空")  
16 - private String mainId;  
17 -  
18 - @Schema(description = "插件id", requiredMode = Schema.RequiredMode.REQUIRED, example = "26498")  
19 - @NotNull(message = "插件id不能为空")  
20 - private Long pluginId;  
21 -  
22 - @Schema(description = "插件主程序所在ip", requiredMode = Schema.RequiredMode.REQUIRED)  
23 - @NotEmpty(message = "插件主程序所在ip不能为空")  
24 - private String ip;  
25 -  
26 - @Schema(description = "插件主程序端口", requiredMode = Schema.RequiredMode.REQUIRED)  
27 - @NotNull(message = "插件主程序端口不能为空")  
28 - private Integer port;  
29 -  
30 - @Schema(description = "心跳时间,心路时间超过30秒需要剔除", requiredMode = Schema.RequiredMode.REQUIRED)  
31 - @NotNull(message = "心跳时间,心路时间超过30秒需要剔除不能为空")  
32 - private Long heartbeatAt;  
33 -  
34 -}  
35 \ No newline at end of file 0 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoImportReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/info/PluginInfoImportReqVO.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo; 1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info;
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.NotNull; 4 import jakarta.validation.constraints.NotNull;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoPageReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/info/PluginInfoPageReqVO.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo; 1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.validation.InEnum; 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoRespVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/info/PluginInfoRespVO.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo; 1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInfoSaveReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/info/PluginInfoSaveReqVO.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo; 1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum; 4 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstancePageReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/instance/PluginInstancePageReqVO.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo; 1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.instance;
2 2
3 import lombok.*; 3 import lombok.*;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
@@ -8,11 +8,8 @@ import java.time.LocalDateTime; @@ -8,11 +8,8 @@ import java.time.LocalDateTime;
8 8
9 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 9 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
10 10
11 -// TODO @haohao:建议搞个 plugin,然后里面分 info 和 instance。另外,是不是 info => config 会好点,插件配置?  
12 @Schema(description = "管理后台 - IoT 插件实例分页 Request VO") 11 @Schema(description = "管理后台 - IoT 插件实例分页 Request VO")
13 @Data 12 @Data
14 -@EqualsAndHashCode(callSuper = true)  
15 -@ToString(callSuper = true)  
16 public class PluginInstancePageReqVO extends PageParam { 13 public class PluginInstancePageReqVO extends PageParam {
17 14
18 @Schema(description = "插件主程序id", example = "23738") 15 @Schema(description = "插件主程序id", example = "23738")
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/PluginInstanceRespVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/instance/PluginInstanceRespVO.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo; 1 +package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.instance;
2 2
  3 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  4 +import com.alibaba.excel.annotation.ExcelProperty;
3 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.*; 6 +import lombok.Data;
  7 +
5 import java.time.LocalDateTime; 8 import java.time.LocalDateTime;
6 -import com.alibaba.excel.annotation.*;  
7 9
8 @Schema(description = "管理后台 - IoT 插件实例 Response VO") 10 @Schema(description = "管理后台 - IoT 插件实例 Response VO")
9 @Data 11 @Data
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/plugininfo/PluginInfoDO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/plugin/PluginInfoDO.java
1 -package cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.plugin;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginDeployTypeEnum; 4 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginDeployTypeEnum;
@@ -47,6 +47,7 @@ public class PluginInfoDO extends BaseDO { @@ -47,6 +47,7 @@ public class PluginInfoDO extends BaseDO {
47 * 枚举 {@link IotPluginDeployTypeEnum} 47 * 枚举 {@link IotPluginDeployTypeEnum}
48 */ 48 */
49 private Integer deployType; 49 private Integer deployType;
  50 + // TODO @芋艿:如果是外置的插件,fileName 和 version 的选择~
50 /** 51 /**
51 * 插件包文件名 52 * 插件包文件名
52 */ 53 */
@@ -55,6 +56,7 @@ public class PluginInfoDO extends BaseDO { @@ -55,6 +56,7 @@ public class PluginInfoDO extends BaseDO {
55 * 插件版本 56 * 插件版本
56 */ 57 */
57 private String version; 58 private String version;
  59 + // TODO @芋艿:type 字典的定义
58 /** 60 /**
59 * 插件类型 61 * 插件类型
60 * <p> 62 * <p>
@@ -64,6 +66,7 @@ public class PluginInfoDO extends BaseDO { @@ -64,6 +66,7 @@ public class PluginInfoDO extends BaseDO {
64 /** 66 /**
65 * 设备插件协议类型 67 * 设备插件协议类型
66 */ 68 */
  69 + // TODO @芋艿:枚举字段
67 private String protocol; 70 private String protocol;
68 /** 71 /**
69 * 状态 72 * 状态
@@ -71,6 +74,7 @@ public class PluginInfoDO extends BaseDO { @@ -71,6 +74,7 @@ public class PluginInfoDO extends BaseDO {
71 * 枚举 {@link IotPluginStatusEnum} 74 * 枚举 {@link IotPluginStatusEnum}
72 */ 75 */
73 private Integer status; 76 private Integer status;
  77 + // TODO @芋艿:configSchema、config 示例字段
74 /** 78 /**
75 * 插件配置项描述信息 79 * 插件配置项描述信息
76 */ 80 */
@@ -79,6 +83,7 @@ public class PluginInfoDO extends BaseDO { @@ -79,6 +83,7 @@ public class PluginInfoDO extends BaseDO {
79 * 插件配置信息 83 * 插件配置信息
80 */ 84 */
81 private String config; 85 private String config;
  86 + // TODO @芋艿:script 后续的使用
82 /** 87 /**
83 * 插件脚本 88 * 插件脚本
84 */ 89 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/plugininstance/PluginInstanceDO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/plugin/PluginInstanceDO.java
1 -package cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.plugin;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;  
5 import com.baomidou.mybatisplus.annotation.KeySequence; 4 import com.baomidou.mybatisplus.annotation.KeySequence;
6 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
@@ -28,6 +27,7 @@ public class PluginInstanceDO extends BaseDO { @@ -28,6 +27,7 @@ public class PluginInstanceDO extends BaseDO {
28 */ 27 */
29 @TableId 28 @TableId
30 private Long id; 29 private Long id;
  30 + // TODO @芋艿:找一个更好的字段名
31 /** 31 /**
32 * 插件主程序 ID 32 * 插件主程序 ID
33 */ 33 */
@@ -43,10 +43,12 @@ public class PluginInstanceDO extends BaseDO { @@ -43,10 +43,12 @@ public class PluginInstanceDO extends BaseDO {
43 * 插件主程序所在 IP 43 * 插件主程序所在 IP
44 */ 44 */
45 private String ip; 45 private String ip;
  46 + // TODO @芋艿:这个 port 是否有必要记录
46 /** 47 /**
47 * 插件主程序端口 48 * 插件主程序端口
48 */ 49 */
49 private Integer port; 50 private Integer port;
  51 + // TODO @芋艿:downstreamPort 增加,目的:用于下行
50 52
51 // TODO @haohao:字段改成 heartbeatTime,LocalDateTime 53 // TODO @haohao:字段改成 heartbeatTime,LocalDateTime
52 /** 54 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugin/PluginInfoMapper.java
@@ -3,12 +3,12 @@ package cn.iocoder.yudao.module.iot.dal.mysql.plugin; @@ -3,12 +3,12 @@ package cn.iocoder.yudao.module.iot.dal.mysql.plugin;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO; 6 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info.PluginInfoPageReqVO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.PluginInfoDO;
7 8
8 import java.util.List; 9 import java.util.List;
9 10
10 import org.apache.ibatis.annotations.Mapper; 11 import org.apache.ibatis.annotations.Mapper;
11 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.*;  
12 12
13 /** 13 /**
14 * IoT 插件信息 Mapper 14 * IoT 插件信息 Mapper
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugin/PluginInstanceMapper.java
@@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.iot.dal.mysql.plugin; @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.iot.dal.mysql.plugin;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInstancePageReqVO;  
7 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO; 6 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.instance.PluginInstancePageReqVO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.PluginInstanceDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 /** 10 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/emq/callback/EmqxCallback.java deleted
1 -package cn.iocoder.yudao.module.iot.emq.callback;  
2 -  
3 -import cn.iocoder.yudao.module.iot.emq.client.EmqxClient;  
4 -import cn.iocoder.yudao.module.iot.emq.service.EmqxService;  
5 -import jakarta.annotation.Resource;  
6 -import lombok.extern.slf4j.Slf4j;  
7 -import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;  
8 -import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;  
9 -import org.eclipse.paho.client.mqttv3.MqttMessage;  
10 -import org.springframework.context.annotation.Lazy;  
11 -import org.springframework.stereotype.Component;  
12 -  
13 -// TODO @芋艿:详细再瞅瞅  
14 -/**  
15 - * 用于处理MQTT连接的回调,如连接断开、消息到达、消息发布完成、连接完成等事件。  
16 - *  
17 - * @author ahh  
18 - */  
19 -@Slf4j  
20 -//@Component  
21 -public class EmqxCallback implements MqttCallbackExtended {  
22 -  
23 - @Lazy  
24 - @Resource  
25 - private EmqxService emqxService;  
26 -  
27 - @Lazy  
28 - @Resource  
29 - private EmqxClient emqxClient;  
30 -  
31 - @Override  
32 - public void connectionLost(Throwable throwable) {  
33 - log.info("MQTT 连接断开", throwable);  
34 - }  
35 -  
36 - @Override  
37 - public void messageArrived(String topic, MqttMessage mqttMessage) {  
38 - emqxService.subscribeCallback(topic, mqttMessage);  
39 - }  
40 -  
41 - @Override  
42 - public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {  
43 - log.info("消息发送成功: {}", iMqttDeliveryToken.getMessageId());  
44 - }  
45 -  
46 - @Override  
47 - public void connectComplete(boolean reconnect, String serverURI) {  
48 - log.info("MQTT 已连接到服务器: {}", serverURI);  
49 - emqxService.subscribe(emqxClient.getMqttClient());  
50 - }  
51 -}  
52 -  
53 -  
54 -  
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/emq/client/EmqxClient.java deleted
1 -package cn.iocoder.yudao.module.iot.emq.client;  
2 -  
3 -import cn.iocoder.yudao.module.iot.emq.callback.EmqxCallback;  
4 -import cn.iocoder.yudao.module.iot.emq.config.MqttConfig;  
5 -import jakarta.annotation.Resource;  
6 -import lombok.Data;  
7 -import lombok.extern.slf4j.Slf4j;  
8 -import org.eclipse.paho.client.mqttv3.MqttClient;  
9 -import org.eclipse.paho.client.mqttv3.MqttConnectOptions;  
10 -import org.eclipse.paho.client.mqttv3.MqttException;  
11 -import org.eclipse.paho.client.mqttv3.MqttMessage;  
12 -import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;  
13 -import org.springframework.stereotype.Component;  
14 -  
15 -/**  
16 - * MQTT客户端类,负责建立与MQTT服务器的连接,提供发布消息和订阅主题的功能  
17 - *  
18 - * @author ahh  
19 - */  
20 -@Slf4j  
21 -@Data  
22 -//@Component  
23 -public class EmqxClient {  
24 -  
25 - @Resource  
26 - private EmqxCallback emqxCallback;  
27 - @Resource  
28 - private MqttConfig mqttConfig;  
29 -  
30 - private MqttClient mqttClient;  
31 -  
32 - public void connect() {  
33 - if (mqttClient == null) {  
34 - createMqttClient();  
35 - }  
36 - try {  
37 - mqttClient.connect(createMqttOptions());  
38 - log.info("MQTT客户端连接成功");  
39 - } catch (MqttException e) {  
40 - log.error("MQTT客户端连接失败", e);  
41 - }  
42 - }  
43 -  
44 - private void createMqttClient() {  
45 - try {  
46 - mqttClient = new MqttClient(mqttConfig.getHostUrl(), "yudao" + mqttConfig.getClientId(), new MemoryPersistence());  
47 - mqttClient.setCallback(emqxCallback);  
48 - } catch (MqttException e) {  
49 - log.error("创建MQTT客户端失败", e);  
50 - }  
51 - }  
52 -  
53 - private MqttConnectOptions createMqttOptions() {  
54 - MqttConnectOptions options = new MqttConnectOptions();  
55 - options.setUserName(mqttConfig.getUsername());  
56 - options.setPassword(mqttConfig.getPassword().toCharArray());  
57 - options.setConnectionTimeout(mqttConfig.getTimeout());  
58 - options.setKeepAliveInterval(mqttConfig.getKeepalive());  
59 - options.setCleanSession(mqttConfig.isClearSession());  
60 - return options;  
61 - }  
62 -  
63 - public void publish(String topic, String message) {  
64 - try {  
65 - if (mqttClient == null || !mqttClient.isConnected()) {  
66 - connect();  
67 - }  
68 - mqttClient.publish(topic, new MqttMessage(message.getBytes()));  
69 - log.info("消息已发布到主题: {}", topic);  
70 - } catch (MqttException e) {  
71 - log.error("消息发布失败", e);  
72 - }  
73 - }  
74 -  
75 - public void subscribe(String topic) {  
76 - try {  
77 - if (mqttClient == null || !mqttClient.isConnected()) {  
78 - connect();  
79 - }  
80 - mqttClient.subscribe(topic);  
81 - log.info("订阅了主题: {}", topic);  
82 - } catch (MqttException e) {  
83 - log.error("订阅主题失败", e);  
84 - }  
85 - }  
86 -}  
87 \ No newline at end of file 0 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/emq/config/MqttConfig.java deleted
1 -package cn.iocoder.yudao.module.iot.emq.config;  
2 -  
3 -import lombok.Data;  
4 -import org.springframework.boot.context.properties.ConfigurationProperties;  
5 -import org.springframework.stereotype.Component;  
6 -  
7 -// TODO @芋艿:详细再瞅瞅  
8 -  
9 -/**  
10 - * 配置类,用于读取MQTT连接的配置信息,如用户名、密码、连接地址等  
11 - *  
12 - * @author ahh  
13 - */  
14 -@Data  
15 -//@Component  
16 -//@ConfigurationProperties("iot.emq")  
17 -public class MqttConfig {  
18 -  
19 - /**  
20 - * 用户名  
21 - */  
22 - private String username;  
23 - /**  
24 - * 密码  
25 - */  
26 - private String password;  
27 -  
28 - /**  
29 - * 连接地址  
30 - */  
31 - private String hostUrl;  
32 -  
33 - /**  
34 - * 客户Id  
35 - */  
36 - private String clientId;  
37 -  
38 - /**  
39 - * 默认连接话题  
40 - */  
41 - private String defaultTopic;  
42 -  
43 - /**  
44 - * 超时时间  
45 - */  
46 - private int timeout;  
47 -  
48 - /**  
49 - * 保持连接数  
50 - */  
51 - private int keepalive;  
52 -  
53 - /**  
54 - * 是否清除session  
55 - */  
56 - private boolean clearSession;  
57 -  
58 - /**  
59 - * 是否共享订阅  
60 - */  
61 - private boolean isShared;  
62 -  
63 - /**  
64 - * 分组共享订阅  
65 - */  
66 - private boolean isSharedGroup;  
67 -  
68 -}  
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/emq/service/EmqxService.java deleted
1 -package cn.iocoder.yudao.module.iot.emq.service;  
2 -  
3 -import org.eclipse.paho.client.mqttv3.MqttClient;  
4 -import org.eclipse.paho.client.mqttv3.MqttMessage;  
5 -  
6 -// TODO @芋艿:在瞅瞅  
7 -/**  
8 - * 用于处理MQTT消息的具体业务逻辑,如订阅回调  
9 - *  
10 - * @author ahh  
11 - */  
12 -public interface EmqxService {  
13 -  
14 - /**  
15 - * 订阅回调  
16 - *  
17 - * @param topic 主题  
18 - * @param mqttMessage 消息  
19 - */  
20 - void subscribeCallback(String topic, MqttMessage mqttMessage);  
21 -  
22 - /**  
23 - * 订阅主题  
24 - *  
25 - * @param client MQTT 客户端  
26 - */  
27 - void subscribe(MqttClient client);  
28 -}  
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/emq/service/EmqxServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.iot.emq.service;  
2 -  
3 -import cn.iocoder.yudao.module.iot.service.device.data.IotDevicePropertyService;  
4 -import jakarta.annotation.Resource;  
5 -import lombok.extern.slf4j.Slf4j;  
6 -import org.eclipse.paho.client.mqttv3.MqttClient;  
7 -import org.eclipse.paho.client.mqttv3.MqttMessage;  
8 -import org.springframework.scheduling.annotation.Async;  
9 -  
10 -// TODO @芋艿:在瞅瞅  
11 -  
12 -/**  
13 - * 用于处理MQTT消息的具体业务逻辑,如订阅回调  
14 - *  
15 - * @author ahh  
16 - */  
17 -@Slf4j  
18 -// @Service  
19 -public class EmqxServiceImpl implements EmqxService {  
20 -  
21 - @Resource  
22 - private IotDevicePropertyService iotDeviceDataService;  
23 -  
24 - // TODO 多线程处理消息  
25 - @Override  
26 - @Async  
27 - public void subscribeCallback(String topic, MqttMessage mqttMessage) {  
28 - log.info("收到消息,主题: {}, 内容: {}", topic, new String(mqttMessage.getPayload()));  
29 - // 根据不同的主题,处理不同的业务逻辑  
30 - if (topic.contains("/property/post")) {  
31 - // 设备上报数据 topic /sys/f13f57c63e9/dianbiao1/thing/event/property/post  
32 - // TODO @hao:这块未来可能,搞个 IotTopicUrls 之类?把拼接和解析的逻辑,收敛  
33 - String productKey = topic.split("/")[2];  
34 - String deviceName = topic.split("/")[3];  
35 - String message = new String(mqttMessage.getPayload());  
36 -// IotDevicePropertyReportReqDTO createDTO = IotDevicePropertyReportReqDTO.builder()  
37 -// .productKey(productKey)  
38 -// .deviceName(deviceName)  
39 -// .properties(message) // TODO 芋艿:临时去掉,看看  
40 -// .build();  
41 -// iotDeviceDataService.saveDeviceProperty(createDTO);  
42 - }  
43 - }  
44 -  
45 - @Override  
46 - public void subscribe(MqttClient client) {  
47 - try {  
48 - // 订阅默认主题,可以根据需要修改  
49 - client.subscribe("/sys/+/+/#", 1);  
50 - log.info("订阅默认主题成功");  
51 - } catch (Exception e) {  
52 - log.error("订阅默认主题失败", e);  
53 - }  
54 - }  
55 -  
56 -}  
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/emq/start/EmqxStart.java deleted
1 -package cn.iocoder.yudao.module.iot.emq.start;  
2 -  
3 -import cn.iocoder.yudao.module.iot.emq.client.EmqxClient;  
4 -import jakarta.annotation.Resource;  
5 -import org.springframework.boot.ApplicationArguments;  
6 -import org.springframework.boot.ApplicationRunner;  
7 -import org.springframework.stereotype.Component;  
8 -  
9 -// TODO @芋艿:在瞅瞅  
10 -  
11 -/**  
12 - * 用于在应用启动时自动连接MQTT服务器  
13 - *  
14 - * @author ahh  
15 - */  
16 -//@Component  
17 -public class EmqxStart implements ApplicationRunner {  
18 -  
19 - @Resource  
20 - private EmqxClient emqxClient;  
21 -  
22 - @Override  
23 - public void run(ApplicationArguments applicationArguments) {  
24 - emqxClient.connect();  
25 - }  
26 -}  
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/PluginStart.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.framework.plugin; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.framework.plugin;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; 4 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
5 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO; 5 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.PluginInfoDO;
6 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum; 6 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
7 import cn.iocoder.yudao.module.iot.service.plugin.PluginInfoService; 7 import cn.iocoder.yudao.module.iot.service.plugin.PluginInfoService;
8 import lombok.extern.slf4j.Slf4j; 8 import lombok.extern.slf4j.Slf4j;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/UnifiedConfiguration.java
@@ -18,7 +18,6 @@ public class UnifiedConfiguration { @@ -18,7 +18,6 @@ public class UnifiedConfiguration {
18 private String pluginsDir; 18 private String pluginsDir;
19 19
20 @Bean 20 @Bean
21 -// @DependsOn("deviceDataApiImpl")  
22 public SpringPluginManager pluginManager() { 21 public SpringPluginManager pluginManager() {
23 log.info("[init][实例化 SpringPluginManager]"); 22 log.info("[init][实例化 SpringPluginManager]");
24 SpringPluginManager springPluginManager = new SpringPluginManager(Paths.get(pluginsDir)) { 23 SpringPluginManager springPluginManager = new SpringPluginManager(Paths.get(pluginsDir)) {
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoService.java
1 package cn.iocoder.yudao.module.iot.service.plugin; 1 package cn.iocoder.yudao.module.iot.service.plugin;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;  
5 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;  
6 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO; 4 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info.PluginInfoPageReqVO;
  5 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info.PluginInfoSaveReqVO;
  6 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.PluginInfoDO;
7 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum; 7 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
8 import jakarta.validation.Valid; 8 import jakarta.validation.Valid;
9 import org.springframework.web.multipart.MultipartFile; 9 import org.springframework.web.multipart.MultipartFile;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoServiceImpl.java
@@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.iot.service.plugin; @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.iot.service.plugin;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO;  
6 -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO;  
7 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO; 5 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info.PluginInfoPageReqVO;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.info.PluginInfoSaveReqVO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.PluginInfoDO;
8 import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInfoMapper; 8 import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInfoMapper;
9 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum; 9 import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum;
10 import jakarta.annotation.Resource; 10 import jakarta.annotation.Resource;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceService.java
1 package cn.iocoder.yudao.module.iot.service.plugin; 1 package cn.iocoder.yudao.module.iot.service.plugin;
2 2
3 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO; 3 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.PluginInfoDO;
4 import org.springframework.web.multipart.MultipartFile; 4 import org.springframework.web.multipart.MultipartFile;
5 5
6 /** 6 /**
@@ -10,6 +10,7 @@ import org.springframework.web.multipart.MultipartFile; @@ -10,6 +10,7 @@ import org.springframework.web.multipart.MultipartFile;
10 */ 10 */
11 public interface PluginInstanceService { 11 public interface PluginInstanceService {
12 12
  13 + // TODO @芋艿:这个是否应该放到 plugin 主动心跳,而是 server 自己心跳
13 /** 14 /**
14 * 上报插件实例(心跳) 15 * 上报插件实例(心跳)
15 */ 16 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceServiceImpl.java
@@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.iot.service.plugin; @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.iot.service.plugin;
3 import cn.hutool.core.io.FileUtil; 3 import cn.hutool.core.io.FileUtil;
4 import cn.hutool.core.net.NetUtil; 4 import cn.hutool.core.net.NetUtil;
5 import cn.hutool.core.util.IdUtil; 5 import cn.hutool.core.util.IdUtil;
6 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO;  
7 -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO; 6 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.PluginInfoDO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.PluginInstanceDO;
8 import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInfoMapper; 8 import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInfoMapper;
9 import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInstanceMapper; 9 import cn.iocoder.yudao.module.iot.dal.mysql.plugin.PluginInstanceMapper;
10 import cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants; 10 import cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants;
@@ -40,13 +40,15 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @@ -40,13 +40,15 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
40 @Slf4j 40 @Slf4j
41 public class PluginInstanceServiceImpl implements PluginInstanceService { 41 public class PluginInstanceServiceImpl implements PluginInstanceService {
42 42
43 - // TODO @haohao:mac@uuid 43 + // TODO @haohao:mac@uuid
44 public static final String MAIN_ID = IdUtil.fastSimpleUUID(); 44 public static final String MAIN_ID = IdUtil.fastSimpleUUID();
45 45
46 @Resource 46 @Resource
47 private PluginInfoMapper pluginInfoMapper; 47 private PluginInfoMapper pluginInfoMapper;
  48 +
48 @Resource 49 @Resource
49 private PluginInstanceMapper pluginInstanceMapper; 50 private PluginInstanceMapper pluginInstanceMapper;
  51 +
50 @Resource 52 @Resource
51 private SpringPluginManager pluginManager; 53 private SpringPluginManager pluginManager;
52 54