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