Browse Source

优化协议

zhou-hao 5 năm trước cách đây
mục cha
commit
397c5106db

+ 48 - 26
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/ProtocolSupportController.java

@@ -9,8 +9,14 @@ import org.hswebframework.web.authorization.annotation.QueryAction;
 import org.hswebframework.web.authorization.annotation.Resource;
 import org.hswebframework.web.authorization.annotation.SaveAction;
 import org.hswebframework.web.crud.web.reactive.ReactiveServiceCrudController;
+import org.jetlinks.community.device.web.protocol.ProtocolDetail;
+import org.jetlinks.community.device.web.protocol.ProtocolInfo;
+import org.jetlinks.community.device.web.protocol.TransportInfo;
+import org.jetlinks.community.device.web.request.ProtocolDecodeRequest;
+import org.jetlinks.community.device.web.request.ProtocolEncodeRequest;
 import org.jetlinks.core.ProtocolSupport;
 import org.jetlinks.core.ProtocolSupports;
+import org.jetlinks.core.message.Message;
 import org.jetlinks.core.message.codec.DefaultTransport;
 import org.jetlinks.core.message.codec.Transport;
 import org.jetlinks.core.metadata.ConfigMetadata;
@@ -18,6 +24,8 @@ import org.jetlinks.core.metadata.unit.ValueUnit;
 import org.jetlinks.core.metadata.unit.ValueUnits;
 import org.jetlinks.community.device.entity.ProtocolSupportEntity;
 import org.jetlinks.community.device.service.LocalProtocolSupportService;
+import org.jetlinks.supports.protocol.management.ProtocolSupportDefinition;
+import org.jetlinks.supports.protocol.management.ProtocolSupportLoader;
 import org.jetlinks.supports.protocol.management.ProtocolSupportLoaderProvider;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -43,6 +51,9 @@ public class ProtocolSupportController implements
     @Autowired
     private List<ProtocolSupportLoaderProvider> providers;
 
+    @Autowired
+    private ProtocolSupportLoader supportLoader;
+
     @PostMapping("/{id}/_deploy")
     @SaveAction
     public Mono<Boolean> deploy(@PathVariable String id) {
@@ -88,37 +99,48 @@ public class ProtocolSupportController implements
             .map(TransportInfo::of);
     }
 
-    @GetMapping("/units")
-    @Authorize(merge = false)
-    public Flux<ValueUnit> allUnits() {
-        return Flux.fromIterable(ValueUnits.getAllUnit());
+    @PostMapping("/convert")
+    @QueryAction
+    public Mono<ProtocolDetail> convertToDetail(@RequestBody Mono<ProtocolSupportEntity> entity) {
+        return entity.map(ProtocolSupportEntity::toDeployDefinition)
+            .doOnNext(def -> def.setId("_debug"))
+            .flatMap(def -> supportLoader.load(def))
+            .flatMap(ProtocolDetail::of);
     }
 
-    @Getter
-    @Setter
-    @AllArgsConstructor(staticName = "of")
-    @NoArgsConstructor
-    public static class TransportInfo {
-        private String id;
-
-        private String name;
-
-        static TransportInfo of(Transport support) {
-            return of(support.getId(), support.getName());
-        }
+    @PostMapping("/decode")
+    @SaveAction
+    public Flux<Message> decode(@RequestBody Mono<ProtocolDecodeRequest> entity) {
+        return entity
+            .flatMapMany(request -> {
+                ProtocolSupportDefinition supportEntity = request.getEntity().toDeployDefinition();
+                supportEntity.setId("_debug");
+                return supportLoader.load(supportEntity)
+                    .flatMapMany(protocol -> request
+                        .getRequest()
+                        .doDecode(protocol, null));
+            });
     }
 
-    @Getter
-    @Setter
-    @AllArgsConstructor(staticName = "of")
-    @NoArgsConstructor
-    public static class ProtocolInfo {
-        private String id;
+    @PostMapping("/encode")
+    @SaveAction
+    public Flux<Object> encode(@RequestBody Mono<ProtocolEncodeRequest> entity) {
+        return entity
+            .flatMapMany(request -> {
+                ProtocolSupportDefinition supportEntity = request.getEntity().toDeployDefinition();
+                supportEntity.setId("_debug");
+                return supportLoader.load(supportEntity)
+                    .flatMapMany(protocol -> request
+                        .getRequest()
+                        .doEncode(protocol, null));
+            });
+    }
 
-        private String name;
 
-        static ProtocolInfo of(ProtocolSupport support) {
-            return of(support.getId(), support.getName());
-        }
+    @GetMapping("/units")
+    @Authorize(merge = false)
+    public Flux<ValueUnit> allUnits() {
+        return Flux.fromIterable(ValueUnits.getAllUnit());
     }
+
 }

+ 32 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/protocol/ProtocolDetail.java

@@ -0,0 +1,32 @@
+package org.jetlinks.community.device.web.protocol;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.jetlinks.core.ProtocolSupport;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+
+@Getter
+@Setter
+@AllArgsConstructor
+public class ProtocolDetail {
+    private String id;
+
+    private String name;
+
+    private List<TransportDetail> transports;
+
+    public static Mono<ProtocolDetail> of(ProtocolSupport support) {
+        return support
+            .getSupportedTransport()
+            .flatMap(trans -> TransportDetail.of(support, trans))
+            .collectList()
+            .map(details -> new ProtocolDetail(support.getId(), support.getName(), details));
+    }
+}
+
+
+
+

+ 21 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/protocol/ProtocolInfo.java

@@ -0,0 +1,21 @@
+package org.jetlinks.community.device.web.protocol;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.jetlinks.core.ProtocolSupport;
+
+@Getter
+@Setter
+@AllArgsConstructor(staticName = "of")
+@NoArgsConstructor
+public class ProtocolInfo {
+    private String id;
+
+    private String name;
+
+    public static ProtocolInfo of(ProtocolSupport support) {
+        return of(support.getId(), support.getName());
+    }
+}

+ 22 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/protocol/TransportDetail.java

@@ -0,0 +1,22 @@
+package org.jetlinks.community.device.web.protocol;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.jetlinks.core.ProtocolSupport;
+import org.jetlinks.core.message.codec.Transport;
+import reactor.core.publisher.Mono;
+
+
+@Getter
+@Setter
+@AllArgsConstructor
+public class TransportDetail {
+    private String id;
+
+    private String name;
+
+    public static Mono<TransportDetail> of(ProtocolSupport support, Transport transport) {
+        return Mono.just(new TransportDetail(transport.getId(), transport.getName()));
+    }
+}

+ 21 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/protocol/TransportInfo.java

@@ -0,0 +1,21 @@
+package org.jetlinks.community.device.web.protocol;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.jetlinks.core.message.codec.Transport;
+
+@Getter
+@Setter
+@AllArgsConstructor(staticName = "of")
+@NoArgsConstructor
+public class TransportInfo {
+    private String id;
+
+    private String name;
+
+    public  static TransportInfo of(Transport support) {
+        return of(support.getId(), support.getName());
+    }
+}

+ 18 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/protocol/TransportSupportType.java

@@ -0,0 +1,18 @@
+package org.jetlinks.community.device.web.protocol;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.hswebframework.web.dict.EnumDict;
+
+@AllArgsConstructor
+@Getter
+public enum TransportSupportType implements EnumDict<String> {
+    ENCODE("编码"), DECODE("解码");
+    private String text;
+
+    @Override
+    public String getValue() {
+        return name();
+    }
+
+}

+ 57 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/request/ProtocolDecodePayload.java

@@ -0,0 +1,57 @@
+package org.jetlinks.community.device.web.request;
+
+import com.alibaba.fastjson.JSON;
+import lombok.Getter;
+import lombok.Setter;
+import org.hswebframework.web.bean.FastBeanCopier;
+import org.jetlinks.core.ProtocolSupport;
+import org.jetlinks.core.device.DeviceOperator;
+import org.jetlinks.core.message.Message;
+import org.jetlinks.core.message.codec.*;
+import org.jetlinks.core.server.session.DeviceSession;
+import org.jetlinks.rule.engine.executor.PayloadType;
+import org.reactivestreams.Publisher;
+
+import javax.annotation.Nullable;
+
+@Getter
+@Setter
+public class ProtocolDecodePayload {
+
+    private DefaultTransport transport;
+
+    private PayloadType payloadType = PayloadType.STRING;
+
+    private String payload;
+
+    public EncodedMessage toEncodedMessage() {
+        if (transport == DefaultTransport.MQTT || transport == DefaultTransport.MQTT_TLS) {
+            SimpleMqttMessage message = FastBeanCopier.copy(JSON.parseObject(payload), new SimpleMqttMessage());
+            message.setPayloadType(MessagePayloadType.of(payloadType.getId()));
+            return message;
+        }
+        return EncodedMessage.simple(payloadType.write(payload));
+    }
+
+    public Publisher<? extends Message> doDecode(ProtocolSupport support, DeviceOperator deviceOperator) {
+        return support
+            .getMessageCodec(getTransport())
+            .flatMapMany(codec -> codec.decode(new FromDeviceMessageContext() {
+                @Override
+                public EncodedMessage getMessage() {
+                    return toEncodedMessage();
+                }
+
+                @Override
+                public DeviceSession getSession() {
+                    return null;
+                }
+
+                @Nullable
+                @Override
+                public DeviceOperator getDevice() {
+                    return deviceOperator;
+                }
+            }));
+    }
+}

+ 15 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/request/ProtocolDecodeRequest.java

@@ -0,0 +1,15 @@
+package org.jetlinks.community.device.web.request;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.jetlinks.community.device.entity.ProtocolSupportEntity;
+
+@Getter
+@Setter
+public class ProtocolDecodeRequest {
+
+    ProtocolSupportEntity entity;
+
+    ProtocolDecodePayload request;
+
+}

+ 57 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/request/ProtocolEncodePayload.java

@@ -0,0 +1,57 @@
+package org.jetlinks.community.device.web.request;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.Getter;
+import lombok.Setter;
+import org.jetlinks.core.ProtocolSupport;
+import org.jetlinks.core.device.DeviceOperator;
+import org.jetlinks.core.message.Message;
+import org.jetlinks.core.message.MessageType;
+import org.jetlinks.core.message.codec.DefaultTransport;
+import org.jetlinks.core.message.codec.MessageEncodeContext;
+import org.jetlinks.core.message.codec.MqttMessage;
+import org.jetlinks.rule.engine.executor.PayloadType;
+import org.reactivestreams.Publisher;
+
+import javax.annotation.Nullable;
+
+@Getter
+@Setter
+public class ProtocolEncodePayload {
+
+    private DefaultTransport transport;
+
+    private String payload;
+
+    private PayloadType payloadType = PayloadType.STRING;
+
+    public Message toDeviceMessage() {
+        return MessageType.convertMessage(JSON.parseObject(payload))
+            .orElseThrow(() -> new IllegalArgumentException("无法识别的消息"));
+    }
+
+    public Publisher<Object> doEncode(ProtocolSupport support, DeviceOperator operator) {
+        return support.getMessageCodec(getTransport())
+            .flatMapMany(codec -> codec.encode(new MessageEncodeContext() {
+                @Override
+                public Message getMessage() {
+                    return toDeviceMessage();
+                }
+
+                @Nullable
+                @Override
+                public DeviceOperator getDevice() {
+                    return operator;
+                }
+            }))
+            .map(msg->{
+                if(msg instanceof MqttMessage){
+                    JSONObject obj=(JSONObject)JSON.toJSON(msg);
+                    obj.put("payload",payloadType.read(msg.getPayload()));
+                    return obj;
+                }
+                return getPayloadType().read(msg.getPayload());
+            });
+    }
+}

+ 16 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/request/ProtocolEncodeRequest.java

@@ -0,0 +1,16 @@
+package org.jetlinks.community.device.web.request;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.jetlinks.community.device.entity.ProtocolSupportEntity;
+
+@Getter
+@Setter
+public class ProtocolEncodeRequest {
+
+    ProtocolSupportEntity entity;
+
+    ProtocolEncodePayload request;
+
+
+}