diff --git a/ruoyi-modules/Sis/pom.xml b/ruoyi-modules/Sis/pom.xml
index 447bd87..bce6a55 100644
--- a/ruoyi-modules/Sis/pom.xml
+++ b/ruoyi-modules/Sis/pom.xml
@@ -122,6 +122,12 @@
4.5.2_1
+
+ org.eclipse.paho
+ org.eclipse.paho.client.mqttv3
+ 1.2.5
+
+
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/meter/domain/PowerFrame.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/domain/PowerFrame.java
similarity index 84%
rename from ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/meter/domain/PowerFrame.java
rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/domain/PowerFrame.java
index 818a6ac..c65adc5 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/meter/domain/PowerFrame.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/domain/PowerFrame.java
@@ -1,4 +1,4 @@
-package org.dromara.sis.sdk.meter.domain;
+package org.dromara.sis.sdk.smartDevices.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/LightingUtil.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/LightingUtil.java
new file mode 100644
index 0000000..d4fa654
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/LightingUtil.java
@@ -0,0 +1,139 @@
+package org.dromara.sis.sdk.smartDevices.utils;
+
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+
+/**
+ * @author lsm
+ * @apiNote LightingUtil
+ * @since 2025/7/20
+ */
+@Slf4j
+public class LightingUtil {
+ private final MqttClient mqttClient;
+ private final String productKey;
+ private final String deviceName;
+ private final Gson gson = new Gson();
+
+
+ // 初始化连接参数
+ public LightingUtil(String brokerUrl, String productKey, String deviceName,
+ String username, String password) throws MqttException {
+ this.productKey = productKey;
+ this.deviceName = deviceName;
+
+ MqttConnectOptions options = new MqttConnectOptions();
+ options.setUserName(username);
+ options.setPassword(password.toCharArray());
+ options.setCleanSession(true);
+
+ mqttClient = new MqttClient(brokerUrl, deviceName, new MemoryPersistence());
+ mqttClient.connect(options);
+
+ // 订阅网关上报主题
+ String subscribeTopic = "/sys/" + productKey + "/+/thing/event/+/post";
+ mqttClient.subscribe(subscribeTopic, this::handleIncomingMessage);
+ }
+
+ // 基础指令构造
+ private JsonObject createBaseCommand(int code, String area, String address, String action) {
+ JsonObject command = new JsonObject();
+ command.addProperty("code", code);
+ command.addProperty("deviceName", deviceName);
+ command.addProperty("area", area);
+ command.addProperty("address", address);
+ command.addProperty("action", action);
+ command.addProperty("identity", "");
+ return command;
+ }
+
+ // 灯具控制指令
+ public void sendLightCommand(int code, String area, String address, String action, String params)
+ throws MqttException {
+ JsonObject command = createBaseCommand(code, area, address, action);
+ if (params != null) command.addProperty("params", params);
+
+ String topic = "/" + productKey + "/" + deviceName + "/user/get";
+ mqttClient.publish(topic, new MqttMessage(gson.toJson(command).getBytes()));
+ }
+
+ // 常用快捷方法
+ public void turnOnLight(String area, String groupAddress) throws MqttException {
+ sendLightCommand(200, area, groupAddress, "lightOn", null);
+ }
+
+ public void turnOffLight(String area, String groupAddress) throws MqttException {
+ sendLightCommand(200, area, groupAddress, "lightOff", null);
+ }
+
+ public void setBrightness(String area, String address, int brightness) throws MqttException {
+ sendLightCommand(200, area, address, "setHighBright", String.valueOf(brightness));
+ }
+
+ // 上报数据处理
+ private void handleIncomingMessage(String topic, MqttMessage message) {
+ try {
+ JsonObject payload = gson.fromJson(new String(message.getPayload()), JsonObject.class);
+ String method = payload.get("method").getAsString();
+
+ switch (method) {
+ case "thing.event.heartbeat.post":
+ processHeartbeat(payload.getAsJsonObject("params"));
+ break;
+ case "thing.event.consumption.post":
+ processEnergyData(payload.getAsJsonObject("params"));
+ break;
+ case "thing.event.trigger.post":
+ processSensorTrigger(payload.getAsJsonObject("params"));
+ break;
+ // 添加其他事件处理...
+ }
+ } catch (Exception e) {
+ log.error("MQTT消息处理异常,topic: {}", topic, e);
+ }
+ }
+
+ // 心跳处理
+ private void processHeartbeat(JsonObject params) {
+ JsonObject value = params.getAsJsonObject("value");
+ String uuid = value.get("uuid").getAsString();
+ String area = value.get("area").getAsString();
+ System.out.println("设备在线: " + uuid + " | 区域: " + area);
+ }
+
+ // 能耗处理
+ private void processEnergyData(JsonObject params) {
+ JsonObject value = params.getAsJsonObject("value");
+ String uuid = value.get("uuid").getAsString();
+ double power = value.get("power").getAsDouble();
+ System.out.println("能耗报告: " + uuid + " | 功率: " + power + "W");
+ }
+
+ // 传感器触发处理
+ private void processSensorTrigger(JsonObject params) {
+ JsonObject value = params.getAsJsonObject("value");
+ long trigTime = value.get("trig_time").getAsLong();
+ String area = value.get("area").getAsString();
+ System.out.println("传感器触发: 区域=" + area + " | 时间=" + trigTime);
+ }
+
+ // 网关管理
+ public void rebootGateway(int delaySeconds) throws MqttException {
+ JsonObject command = createBaseCommand(400, "00 00", "FF FF", "reboot");
+ command.addProperty("params", String.valueOf(delaySeconds));
+ String topic = "/" + productKey + "/" + deviceName + "/user/get";
+ mqttClient.publish(topic, new MqttMessage(gson.toJson(command).getBytes()));
+ }
+
+ // 关闭连接
+ public void disconnect() throws MqttException {
+ mqttClient.disconnect();
+ }
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/meter/utils/PowerMeterUtil.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/PowerMeterUtil.java
similarity index 98%
rename from ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/meter/utils/PowerMeterUtil.java
rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/PowerMeterUtil.java
index aa16979..8f4a1f0 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/meter/utils/PowerMeterUtil.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/PowerMeterUtil.java
@@ -1,6 +1,6 @@
-package org.dromara.sis.sdk.meter.utils;
+package org.dromara.sis.sdk.smartDevices.utils;
-import org.dromara.sis.sdk.meter.domain.PowerFrame;
+import org.dromara.sis.sdk.smartDevices.domain.PowerFrame;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/meter/utils/WaterMeterUtil.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/WaterMeterUtil.java
similarity index 99%
rename from ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/meter/utils/WaterMeterUtil.java
rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/WaterMeterUtil.java
index 5b294b1..31fb071 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/meter/utils/WaterMeterUtil.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/WaterMeterUtil.java
@@ -1,4 +1,4 @@
-package org.dromara.sis.sdk.meter.utils;
+package org.dromara.sis.sdk.smartDevices.utils;
import java.nio.ByteBuffer;
import java.util.Arrays;