diff --git a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/CleanRuleProcessorManager.java b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/CleanRuleProcessorManager.java index 405f989..86b184c 100644 --- a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/CleanRuleProcessorManager.java +++ b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/CleanRuleProcessorManager.java @@ -62,9 +62,45 @@ public class CleanRuleProcessorManager { log.debug("[processMessage][设备({}) 处理{}上报,数据数量: {}]", deviceId, "thing.event.post".equals(method) ? "事件" : "属性", data.size()); - // 3. 顺序处理各数据项(与场景规则处理器保持一致) - data.forEach((identifier, value) -> - processDataSafely(deviceId, identifier, value)); + // 3. 判断是属性上报还是事件上报 + if (IotDeviceMessageMethodEnum.EVENT_POST.getMethod().equals(method)) { + // 事件上报:params 结构为 {identifier: "...", eventTime: ..., params: {...}} + processEventData(deviceId, data); + } else { + // 属性上报:直接遍历 key-value + data.forEach((identifier, value) -> + processDataSafely(deviceId, identifier, value)); + } + } + + /** + * 处理事件上报数据 + *

+ * 事件上报的 params 结构: + * { + * "identifier": "button_event", + * "eventTime": 1234567890, + * "params": { keyId: 1, keyState: 1 } + * } + */ + private void processEventData(Long deviceId, Map data) { + String identifier = (String) data.get("identifier"); + if (identifier == null) { + log.warn("[processEventData][设备({}) 事件缺少 identifier]", deviceId); + return; + } + + Object params = data.get("params"); + log.debug("[processEventData][设备({}) 事件: {}, params: {}]", deviceId, identifier, params); + + // 路由到对应处理器 + switch (identifier) { + case "button_event" -> + buttonEventRuleProcessor.processPropertyChange(deviceId, identifier, params); + default -> { + // 其他事件忽略 + } + } } /** diff --git a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/ButtonEventRuleProcessor.java b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/ButtonEventRuleProcessor.java index c8ef8e7..5185b8b 100644 --- a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/ButtonEventRuleProcessor.java +++ b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/rule/clean/processor/ButtonEventRuleProcessor.java @@ -222,12 +222,28 @@ public class ButtonEventRuleProcessor { /** * 解析按键ID + *

+ * 支持两种格式: + * 1. 属性上报:value 直接是按键ID(如 1) + * 2. 事件上报:value 是 Map,包含 keyId 字段(如 {keyId: 1, keyState: 1}) */ + @SuppressWarnings("unchecked") private Integer parseButtonId(Object value) { if (value == null) { return null; } + // 事件上报格式:value 是 Map,包含 keyId 字段 + if (value instanceof Map) { + Map map = (Map) value; + Object keyId = map.get("keyId"); + if (keyId instanceof Number) { + return ((Number) keyId).intValue(); + } + return null; + } + + // 属性上报格式:value 直接是按键ID if (value instanceof Number) { return ((Number) value).intValue(); }