From 426717e9ccfd8460759f85c85ef3e1677fe16dbb Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Sun, 20 Jul 2025 14:24:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(sis):=20=E6=96=B0=E5=A2=9E=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E7=85=A7=E6=98=8E=E6=8E=A7=E5=88=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/Sis/pom.xml | 6 + .../domain/PowerFrame.java | 2 +- .../sdk/smartDevices/utils/LightingUtil.java | 139 ++++++++++++++++++ .../utils/PowerMeterUtil.java | 4 +- .../utils/WaterMeterUtil.java | 2 +- 5 files changed, 149 insertions(+), 4 deletions(-) rename ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/{meter => smartDevices}/domain/PowerFrame.java (84%) create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/smartDevices/utils/LightingUtil.java rename ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/{meter => smartDevices}/utils/PowerMeterUtil.java (98%) rename ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/{meter => smartDevices}/utils/WaterMeterUtil.java (99%) 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;