commandPublisherProvider;
private final DeviceIdentityResolver deviceIdentityResolver;
+ private final MqttDeviceStatusService deviceStatusService;
@Override
public Pattern topicPattern() {
@@ -60,8 +61,9 @@ DeviceRegisterHandler implements MqttTopicHandler {
}
AppDeviceBo device = buildRegisterDevice(deviceNo, normalizedDeviceMac, dto);
appDeviceService.registerByMqtt(device);
+ deviceStatusService.markOnline(deviceNo);
sendDeviceNoToDevice(deviceNo, normalizedDeviceMac);
- log.info("[MQTT] 设备注册 时间={} MAC={} 设备编号={} 消息体={}",
+ log.info("[MQTT] 设备注册并上线 时间={} MAC={} 设备编号={} 消息体={}",
HandlerLogTime.now(), normalizedDeviceMac, deviceNo, payload);
} catch (Exception e) {
log.error("[MQTT] 设备注册失败 时间={} 设备标识={} 消息体={}", HandlerLogTime.now(), deviceIdentity, payload, e);
diff --git a/water-modules/water-app/src/main/java/org/dromara/app/handler/DeviceStatusHandler.java b/water-modules/water-app/src/main/java/org/dromara/app/handler/DeviceStatusHandler.java
index 67cf924..5975e13 100644
--- a/water-modules/water-app/src/main/java/org/dromara/app/handler/DeviceStatusHandler.java
+++ b/water-modules/water-app/src/main/java/org/dromara/app/handler/DeviceStatusHandler.java
@@ -13,10 +13,10 @@ import java.util.Map;
import java.util.regex.Pattern;
/**
- * 设备在线/离线状态处理器,匹配 /{deviceIdentity}/publish/status。
+ * 设备遗嘱离线状态处理器,匹配 /{deviceIdentity}/publish/status。
*
* deviceIdentity 支持设备编号;设备遗嘱消息允许使用 MAC 地址,处理前统一解析为设备编号。
- * 设备通过 status=online 标记上线,通过 LWT status=offline 标记异常离线。
+ * 在线状态由电量上报刷新;本处理器仅通过 LWT status=offline 标记异常离线。
*/
@Slf4j
@Component
@@ -42,17 +42,18 @@ public class DeviceStatusHandler implements MqttTopicHandler {
@Override
public void handle(String deviceIdentity, String payload, boolean retained) {
- String deviceNo = deviceIdentityResolver.resolveDeviceNo(deviceIdentity);
+ Map body = parsePayload(payload);
+ String deviceNo = resolveDeviceNo(deviceIdentity, body);
if (deviceNo == null) {
log.warn("[MQTT] 设备状态上报未找到设备 时间={} 设备标识={} 消息体={}",
HandlerLogTime.now(), deviceIdentity, payload);
return;
}
- String status = parseStatus(payload);
+ String status = parseStatus(payload, body);
if ("online".equals(status) || "1".equals(status)) {
- deviceStatusService.markOnline(deviceNo);
- log.info("[MQTT] 设备状态在线 时间={} 设备编号={} 消息体={}", HandlerLogTime.now(), deviceNo, payload);
+ log.debug("[MQTT] 忽略设备主动在线状态,在线状态由电量心跳维护 时间={} 设备编号={} 消息体={}",
+ HandlerLogTime.now(), deviceNo, payload);
return;
}
if ("offline".equals(status) || "0".equals(status)) {
@@ -69,22 +70,52 @@ public class DeviceStatusHandler implements MqttTopicHandler {
HandlerLogTime.now(), deviceNo, payload);
}
- private String parseStatus(String payload) {
+ private String resolveDeviceNo(String deviceIdentity, Map body) {
+ String deviceNo = deviceIdentityResolver.resolveDeviceNo(deviceIdentity);
+ if (deviceNo != null || body == null) {
+ return deviceNo;
+ }
+ Object deviceMac = body.get("deviceMac");
+ if (deviceMac == null || StringUtils.isBlank(String.valueOf(deviceMac))) {
+ return null;
+ }
+ return deviceIdentityResolver.resolveDeviceNo(String.valueOf(deviceMac));
+ }
+
+ private Map parsePayload(String payload) {
if (StringUtils.isBlank(payload)) {
return null;
}
String trimmed = payload.trim();
if (!trimmed.startsWith("{")) {
- return trimmed.toLowerCase(Locale.ROOT);
+ return null;
}
try {
- Map body = objectMapper.readValue(trimmed, new TypeReference