zhou-hao hace 4 años
padre
commit
fdf6d232f9

+ 61 - 17
jetlinks-components/gateway-component/src/main/java/org/jetlinks/community/gateway/DeviceMessageUtils.java

@@ -2,53 +2,97 @@ package org.jetlinks.community.gateway;
 
 import com.alibaba.fastjson.JSON;
 import io.netty.buffer.ByteBuf;
+import io.netty.util.ReferenceCountUtil;
 import org.jetlinks.core.event.TopicPayload;
+import org.jetlinks.core.message.CommonDeviceMessage;
+import org.jetlinks.core.message.CommonDeviceMessageReply;
 import org.jetlinks.core.message.DeviceMessage;
 import org.jetlinks.core.message.MessageType;
-import org.jetlinks.core.message.property.ReadPropertyMessageReply;
-import org.jetlinks.core.message.property.ReportPropertyMessage;
-import org.jetlinks.core.message.property.WritePropertyMessageReply;
+import org.jetlinks.core.message.property.*;
+import org.springframework.util.StringUtils;
 
 import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.function.Supplier;
 
 public class DeviceMessageUtils {
 
+    @SuppressWarnings("all")
     public static Optional<DeviceMessage> convert(TopicPayload message) {
         return Optional.of(message.decode(DeviceMessage.class));
     }
 
     public static Optional<DeviceMessage> convert(ByteBuf payload) {
+        try {
+            return MessageType.convertMessage(JSON.parseObject(payload.toString(StandardCharsets.UTF_8)));
+        } finally {
+            ReferenceCountUtil.safeRelease(payload);
+        }
+    }
 
-        return MessageType.convertMessage(JSON.parseObject(payload.toString(StandardCharsets.UTF_8)));
-
+    public static void trySetProperties(DeviceMessage message, Map<String, Object> properties) {
+        if (message instanceof ReportPropertyMessage) {
+            ((ReportPropertyMessage) message).setProperties(properties);
+        } else if (message instanceof ReadPropertyMessageReply) {
+            ((ReadPropertyMessageReply) message).setProperties(properties);
+        } else if (message instanceof WritePropertyMessageReply) {
+            ((WritePropertyMessageReply) message).setProperties(properties);
+        }
     }
 
     public static Optional<Map<String, Object>> tryGetProperties(DeviceMessage message) {
 
-        if (message instanceof ReportPropertyMessage) {
-            return Optional.ofNullable(((ReportPropertyMessage) message).getProperties());
+        if (message instanceof PropertyMessage) {
+            return Optional.ofNullable(((PropertyMessage) message).getProperties());
         }
 
-        if (message instanceof ReadPropertyMessageReply) {
-            return Optional.ofNullable(((ReadPropertyMessageReply) message).getProperties());
-        }
-        if (message instanceof WritePropertyMessageReply) {
-            return Optional.ofNullable(((WritePropertyMessageReply) message).getProperties());
-        }
         return Optional.empty();
     }
 
     public static Optional<Map<String, Long>> tryGetPropertySourceTimes(DeviceMessage message) {
-        if (message instanceof ReportPropertyMessage) {
-            return Optional.ofNullable(((ReportPropertyMessage) message).getPropertySourceTimes());
+        if (message instanceof PropertyMessage) {
+            return Optional.ofNullable(((PropertyMessage) message).getPropertySourceTimes());
         }
+        return Optional.empty();
+    }
 
-        if (message instanceof ReadPropertyMessageReply) {
-            return Optional.ofNullable(((ReadPropertyMessageReply) message).getPropertySourceTimes());
+    public static Optional<Map<String, String>> tryGetPropertyStates(DeviceMessage message) {
+        if (message instanceof PropertyMessage) {
+            return Optional.ofNullable(((PropertyMessage) message).getPropertyStates());
         }
         return Optional.empty();
     }
 
+    public static List<Property> tryGetCompleteProperties(DeviceMessage message) {
+
+        if (message instanceof PropertyMessage) {
+            return ((PropertyMessage) message).getCompleteProperties();
+        }
+
+        return Collections.emptyList();
+    }
+
+    public static void trySetDeviceId(DeviceMessage message, String deviceId) {
+        if (message instanceof CommonDeviceMessage) {
+            ((CommonDeviceMessage) message).setDeviceId(deviceId);
+        } else if (message instanceof CommonDeviceMessageReply) {
+            ((CommonDeviceMessageReply<?>) message).setDeviceId(deviceId);
+        }
+    }
+
+    public static void trySetMessageId(DeviceMessage message, Supplier<String> messageId) {
+        if (StringUtils.hasText(message.getMessageId())) {
+            return;
+        }
+
+        if (message instanceof CommonDeviceMessage) {
+            ((CommonDeviceMessage) message).setMessageId(messageId.get());
+        } else if (message instanceof CommonDeviceMessageReply) {
+            ((CommonDeviceMessageReply<?>) message).setMessageId(messageId.get());
+        }
+    }
+
 }