diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmVisitRecordsPo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmVisitRecordsPo.java
index c217ae5b..32da0360 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmVisitRecordsPo.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmVisitRecordsPo.java
@@ -27,6 +27,10 @@ public class DmVisitRecordsPo extends TBaseEntity {
@Serial
private static final long serialVersionUID = 1L;
+ public static final Integer STATUS_VISITING = 0;
+ public static final Integer STATUS_VISITED = 8;
+ public static final Integer STATUS_EXPIRED = 9;
+
/** 访客ID */
@Excel(name = "访客ID")
protected Long visitorId;
diff --git a/xueyi-common/pom.xml b/xueyi-common/pom.xml
index 59b3db18..2746b2b1 100644
--- a/xueyi-common/pom.xml
+++ b/xueyi-common/pom.xml
@@ -20,6 +20,7 @@
xueyi-common-datascope
xueyi-common-datasource
xueyi-common-sms
+ xueyi-common-mqtt
xueyi-common
diff --git a/xueyi-common/xueyi-common-mqtt/pom.xml b/xueyi-common/xueyi-common-mqtt/pom.xml
new file mode 100644
index 00000000..e8e57f24
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/pom.xml
@@ -0,0 +1,34 @@
+
+
+
+ com.xueyi
+ xueyi-common
+ 2.5.0
+
+ 4.0.0
+
+ xueyi-common-mqtt
+
+
+ xueyi-common-mqtt通信服务
+
+
+
+
+
+
+ org.eclipse.paho
+ org.eclipse.paho.client.mqttv3
+ 1.2.5
+
+
+
+
+ com.xueyi
+ xueyi-common-core
+
+
+
+
\ No newline at end of file
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttConfig.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttConfig.java
new file mode 100644
index 00000000..c55d25e8
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttConfig.java
@@ -0,0 +1,50 @@
+package com.xueyi.common.mqtt.configure;
+
+import lombok.Data;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * mqtt配置
+ *
+ * @author xueyi
+ */
+@Configuration
+@EnableCaching
+@Data
+public class MqttConfig {
+ @Value("${emqx.brokerUrl}")
+ private String brokerUrl;
+
+ @Value("${emqx.clientId}")
+ private String clientId;
+
+ @Value("${emqx.username}")
+ private String username;
+
+ @Value("${emqx.password}")
+ private String password;
+
+
+ @Value("${emqx.topics}")
+ private String topics;
+
+ @Value("${emqx.fetchLogTopic}")
+ private String fetchLogTopic;
+
+ @Bean
+ public MqttClient mqttClient() throws Exception {
+ MqttConnectOptions options = new MqttConnectOptions();
+ options.setCleanSession(true);
+ options.setUserName(username);
+ options.setPassword(password.toCharArray());
+ MqttClient client = new MqttClient(brokerUrl, clientId);
+ client.connect(options);
+ return client;
+ }
+
+}
\ No newline at end of file
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttMessageHandler.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttMessageHandler.java
new file mode 100644
index 00000000..b9e31614
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttMessageHandler.java
@@ -0,0 +1,10 @@
+package com.xueyi.common.mqtt.service;
+
+/**
+ * @author yk
+ * @description
+ * @date 2023-05-10 19:05
+ */
+public interface MqttMessageHandler {
+ void handleMessage(String topic, String message);
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttMessageHandlerService.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttMessageHandlerService.java
new file mode 100644
index 00000000..8cf43a12
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttMessageHandlerService.java
@@ -0,0 +1,22 @@
+package com.xueyi.common.mqtt.service;
+
+/**
+ * @author yk
+ * @description
+ * @date 2023-05-10 19:19
+ */
+public class MqttMessageHandlerService{
+
+ private final MqttService mqttService;
+ private final MqttMessageHandler mqttMessageHandler;
+
+ public MqttMessageHandlerService(MqttService mqttService, MqttMessageHandler mqttMessageHandler) {
+ this.mqttService = mqttService;
+ this.mqttMessageHandler = mqttMessageHandler;
+ init();
+ }
+
+ private void init() {
+ mqttService.addObserver(mqttMessageHandler);
+ }
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttService.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttService.java
new file mode 100644
index 00000000..f79959e8
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttService.java
@@ -0,0 +1,84 @@
+package com.xueyi.common.mqtt.service;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.xueyi.common.mqtt.configure.MqttConfig;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * spring mqtt 工具类
+ *
+ * @author xueyi
+ **/
+@Component
+@SuppressWarnings(value = {"unchecked", "rawtypes"})
+public class MqttService implements MqttCallback{
+
+ private List observers = new ArrayList<>();
+
+ public void addObserver(MqttMessageHandler observer) {
+ observers.add(observer);
+ }
+
+ public void removeObserver(MqttMessageHandler observer) {
+ observers.remove(observer);
+ }
+ @Autowired
+ private MqttClient mqttClient;
+
+ @Autowired
+ private MqttConfig mqttConfig;
+
+ /**
+ * 发布消息到指定 topic
+ *
+ * @param topic 消息主题
+ * @param message 消息内容
+ */
+ public void sendMessage(String topic, Object message) throws MqttException {
+ MqttMessage msg = new MqttMessage();
+ msg.setPayload(message.toString().getBytes());
+ mqttClient.publish(topic, msg);
+ System.out.println("发送消息到 topic: " + topic);
+ System.out.println("消息内容: " + message);
+ }
+
+
+ @PostConstruct
+ public void subscribe() throws MqttException {
+ mqttClient.setCallback(this);
+ for (String topic : Arrays.stream(mqttConfig.getTopics().split(",")).toList()) {
+ if (StringUtils.isNotEmpty(topic)) {
+ mqttClient.subscribe(topic, 0);
+ }
+ }
+ }
+
+ @Override
+ public void connectionLost(Throwable throwable) {
+
+ }
+
+ @Override
+ public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
+ for (MqttMessageHandler observer : observers) {
+ observer.handleMessage(s, new String(mqttMessage.getPayload(), StandardCharsets.UTF_8));
+ }
+ }
+
+ @Override
+ public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
+
+ }
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xueyi-common/xueyi-common-mqtt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 00000000..1425c5c4
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,2 @@
+com.xueyi.common.mqtt.configure.MqttConfig
+com.xueyi.common.mqtt.service.MqttService
\ No newline at end of file
diff --git a/xueyi-modules/xueyi-system/pom.xml b/xueyi-modules/xueyi-system/pom.xml
index b74fb9a0..275c39da 100644
--- a/xueyi-modules/xueyi-system/pom.xml
+++ b/xueyi-modules/xueyi-system/pom.xml
@@ -75,6 +75,12 @@
xueyi-common-sms
+
+ com.xueyi
+ xueyi-common-mqtt
+ 2.5.0
+
+
com.konghq
diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/exception/controller/DmExceptionLogController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/exception/controller/DmExceptionLogController.java
index 02213140..d5e0807b 100644
--- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/exception/controller/DmExceptionLogController.java
+++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/exception/controller/DmExceptionLogController.java
@@ -1,18 +1,33 @@
package com.xueyi.system.exception.controller;
+import com.alibaba.fastjson2.JSONObject;
import com.xueyi.common.core.web.result.AjaxResult;
import com.xueyi.common.core.web.validate.V_A;
import com.xueyi.common.core.web.validate.V_E;
import com.xueyi.common.log.annotation.Log;
import com.xueyi.common.log.enums.BusinessType;
+import com.xueyi.common.mqtt.configure.MqttConfig;
+import com.xueyi.common.mqtt.service.MqttMessageHandlerService;
+import com.xueyi.common.mqtt.service.MqttService;
import com.xueyi.common.security.annotation.RequiresPermissions;
import com.xueyi.common.web.entity.controller.BaseController;
import com.xueyi.system.exception.domain.dto.DmExceptionLogDto;
import com.xueyi.system.exception.domain.query.DmExceptionLogQuery;
import com.xueyi.system.exception.service.IDmExceptionLogService;
+import com.xueyi.system.exception.service.LogMqttMessageHandler;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.PostConstruct;
import java.io.Serializable;
import java.util.List;
@@ -25,12 +40,27 @@ import java.util.List;
@RequestMapping("/log")
public class DmExceptionLogController extends BaseController {
+ @Autowired
+ private MqttService mqttService;
+
+ @Autowired
+ private LogMqttMessageHandler logMqttMessageHandler;
+
+ @Autowired
+ private MqttConfig mqttConfig;
+
/** 定义节点名称 */
@Override
protected String getNodeName() {
return "数字人状态事件上报日志" ;
}
+ @PostConstruct
+ private void init() {
+ System.err.println(System.nanoTime()+"-------heelo");
+ MqttMessageHandlerService mqttMessageHandlerService = new MqttMessageHandlerService(mqttService, logMqttMessageHandler);
+ }
+
/**
* 查询数字人状态事件上报日志列表
*/
@@ -84,6 +114,27 @@ public class DmExceptionLogController extends BaseController