feat(sis): 新增智能照明控制功能
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run

This commit is contained in:
zcxlsm 2025-07-20 14:24:30 +08:00
parent 498209cb87
commit 426717e9cc
5 changed files with 149 additions and 4 deletions

View File

@ -122,6 +122,12 @@
<version>4.5.2_1</version>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
<build>

View File

@ -1,4 +1,4 @@
package org.dromara.sis.sdk.meter.domain;
package org.dromara.sis.sdk.smartDevices.domain;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@ -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();
}
}

View File

@ -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;

View File

@ -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;