diff --git a/intc-admin/src/main/java/com/intc/IntcUltraApplication.java b/intc-admin/src/main/java/com/intc/IntcUltraApplication.java
index 2479cb9..65688eb 100644
--- a/intc-admin/src/main/java/com/intc/IntcUltraApplication.java
+++ b/intc-admin/src/main/java/com/intc/IntcUltraApplication.java
@@ -3,6 +3,7 @@ package com.intc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 启动程序
@@ -11,6 +12,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
*/
@SpringBootApplication
+@EnableScheduling
public class IntcUltraApplication {
public static void main(String[] args) {
diff --git a/intc-admin/src/main/resources/application-dev.yml b/intc-admin/src/main/resources/application-dev.yml
index 7f1baa1..d75435f 100644
--- a/intc-admin/src/main/resources/application-dev.yml
+++ b/intc-admin/src/main/resources/application-dev.yml
@@ -224,6 +224,19 @@ aliyun:
app-key: 334224397
# App Secret
app-secret: 70de3018ec39423e9ca1e1b6a6a84ad6
+ # VMS 语音通知配置
+ vms:
+ # 是否启用 MNS 回扇消费(true 时自动启动 MNS 消费线程接收 VMS 回扇)
+ mns-enabled: true
+ # VMS 语音服务对应的 AccessKey ID(如果与上面 IoT 平台的 AK 相同可不填)
+ access-key-id: LTAI5tKh6fEKJJESaTdnChkh
+ # VMS 语音服务对应的 AccessKey Secret
+ access-key-secret: 6oa6t91ReT2YYSp3puuLA4FYtOyqDo
+ # MNS 账号 Endpoint(格式:https://{AccountId}.mns.cn-hangzhou.aliyuncs.com/)
+ # 在阿里云控制台 > 语音服务 > 回扇配置 中查看对应的 MNS Endpoint
+ endpoint: https://1943695596114318.mns.cn-hangzhou.aliyuncs.com/
+ # MNS 队列名称(保持默认即可)
+ queue-name: Alicom-Queue-1572610294777992-VoiceReport
# AMQP 服务端订阅配置(使用数据同步的 AppKey + AppSecret)
amqp:
# 是否启用
diff --git a/intc-modules/intc-iot/pom.xml b/intc-modules/intc-iot/pom.xml
index b37a80a..15c8e07 100644
--- a/intc-modules/intc-iot/pom.xml
+++ b/intc-modules/intc-iot/pom.xml
@@ -60,13 +60,33 @@
1.1.9.2
-
+
+
+ javax.xml.bind
+ jaxb-api
+ 2.3.1
+
+
+
+ com.sun.xml.bind
+ jaxb-impl
+ 2.3.9
+
+
+
com.aliyun
aliyun-java-sdk-dyvmsapi
1.1.0
+
+
+ com.aliyun
+ aliyun-java-sdk-dybaseapi
+ 1.1.1
+
+
com.squareup.okhttp3
diff --git a/intc-modules/intc-iot/src/main/java/com/intc/iot/config/AliyunIotProperties.java b/intc-modules/intc-iot/src/main/java/com/intc/iot/config/AliyunIotProperties.java
index a1b4888..ee54dd9 100644
--- a/intc-modules/intc-iot/src/main/java/com/intc/iot/config/AliyunIotProperties.java
+++ b/intc-modules/intc-iot/src/main/java/com/intc/iot/config/AliyunIotProperties.java
@@ -47,6 +47,16 @@ public class AliyunIotProperties {
*/
private String categoryKey;
+ /**
+ * VMS 语音通知 TTS 模板编码
+ */
+ private String vmsTtsCode;
+
+ /**
+ * VMS 语音通知主叫显号
+ */
+ private String vmsShowNumber;
+
/**
* MQTT 配置(可选,用于设备直连)
*/
@@ -57,6 +67,40 @@ public class AliyunIotProperties {
*/
private AmqpConfig amqp = new AmqpConfig();
+ /**
+ * VMS MNS 回执消费配置
+ */
+ private VmsMnsConfig vms = new VmsMnsConfig();
+
+ @Data
+ public static class VmsMnsConfig {
+ /**
+ * 是否启用 MNS 回扇消费
+ */
+ private Boolean mnsEnabled = false;
+
+ /**
+ * MNS AccessKey ID(语音服务对应账号的 AK,可能与 IoT 平台不同)
+ */
+ private String accessKeyId;
+
+ /**
+ * MNS AccessKey Secret
+ */
+ private String accessKeySecret;
+
+ /**
+ * MNS 账号内网 Endpoint
+ * 示例:https://{AccountId}.mns.cn-hangzhou.aliyuncs.com/
+ */
+ private String endpoint;
+
+ /**
+ * MNS 队列名称
+ */
+ private String queueName = "Alicom-Queue-1572610294777992-VoiceReport";
+ }
+
@Data
public static class MqttConfig {
/**
diff --git a/intc-modules/intc-iot/src/main/java/com/intc/iot/controller/IotController.java b/intc-modules/intc-iot/src/main/java/com/intc/iot/controller/IotController.java
index e5abc90..6053d93 100644
--- a/intc-modules/intc-iot/src/main/java/com/intc/iot/controller/IotController.java
+++ b/intc-modules/intc-iot/src/main/java/com/intc/iot/controller/IotController.java
@@ -38,6 +38,7 @@ import com.intc.iot.service.IotDeviceService;
import com.intc.iot.service.MqttService;
import com.intc.iot.service.VmsMnsConsumerService;
import com.intc.iot.service.VmsNoticeService;
+import com.intc.iot.handler.DeviceDataHandler;
import com.intc.iot.service.WarnCallNoticeService;
import com.intc.iot.utils.AliyunAmqpSignUtil;
import com.intc.iot.utils.ControllerHelper;
@@ -95,6 +96,9 @@ public class IotController extends BaseController {
@Autowired(required = false)
private WarnCallNoticeService warnCallNoticeService;
+ @Autowired(required = false)
+ private DeviceDataHandler deviceDataHandler;
+
@Autowired(required = false)
private javax.jms.Connection amqpConnection;
@@ -588,6 +592,66 @@ public class IotController extends BaseController {
}
}
+ // ======================== 模拟报警触发接口 ========================
+
+ /**
+ * 模拟设备数据上报,触发报警和打电话流程。
+ * 接口会伪造一条 MQTT 属性上报消息,携带你指定的传感器值,
+ * 走完整的「数据解析 → 阈值判断 → 告警记录 → VMS语音呼叫」链路。
+ *
+ * @param deviceName 设备序列号(需在数据库中存在,且已配置手机号和告警阈值)
+ * @param dissolvedOxygen 溶解氧值(mg/L),不传则使用默认值 1.0(低于通常阈值,触发告警)
+ * @param temperature 水温值(°C),不传则不设置
+ * @param battery 电量(%),不传则不设置
+ */
+ @Operation(summary = "模拟告警触发(测试打电话)",
+ description = "构造超阈值传感器数据,走完整告警→VMS语音呼叫链路")
+ @PostMapping("/alarm/simulate")
+ public R