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
+ * 支持两种格式:
+ * 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