liyan 2 лет назад
Сommit
95f8ef420f
23 измененных файлов с 706 добавлено и 0 удалено
  1. 39 0
      .gitignore
  2. 110 0
      pom.xml
  3. 149 0
      src/main/java/com/liyan/LadarDeviceMessageCodec.java
  4. 42 0
      src/main/java/com/liyan/MyProtocolSupportProvider.java
  5. 21 0
      src/main/java/com/liyan/ObjectMappers.java
  6. 48 0
      src/main/java/com/liyan/portal/LadarMessage.java
  7. 197 0
      src/test/java/com/liyan/JetLinksMqttDeviceMessageCodecTest.java
  8. 80 0
      src/test/java/com/liyan/TestDeviceRegistry.java
  9. BIN
      target/classes/com/liyan/LadarDeviceMessageCodec.class
  10. BIN
      target/classes/com/liyan/MyProtocolSupportProvider.class
  11. BIN
      target/classes/com/liyan/ObjectMappers.class
  12. BIN
      target/classes/com/liyan/portal/LadarMessage.class
  13. BIN
      target/ladar-protocol-1.0.jar
  14. 5 0
      target/maven-archiver/pom.properties
  15. 4 0
      target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
  16. 4 0
      target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
  17. 5 0
      target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
  18. 2 0
      target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
  19. BIN
      target/test-classes/com/liyan/JetLinksMqttDeviceMessageCodecTest$1.class
  20. BIN
      target/test-classes/com/liyan/JetLinksMqttDeviceMessageCodecTest$2.class
  21. BIN
      target/test-classes/com/liyan/JetLinksMqttDeviceMessageCodecTest$MockSession.class
  22. BIN
      target/test-classes/com/liyan/JetLinksMqttDeviceMessageCodecTest.class
  23. BIN
      target/test-classes/com/liyan/TestDeviceRegistry.class

+ 39 - 0
.gitignore

@@ -0,0 +1,39 @@
+HELP.md
+.gradle
+build/
+!gradle/wrapper/gradle-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+logs/**
+.logs/**
+.sync/**
+/.logs/
+/.sync/
+**/dist/
+**/ext/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+out/
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+
+### VS Code ###
+.vscode/

+ 110 - 0
pom.xml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.liyan</groupId>
+    <artifactId>ladar-protocol</artifactId>
+    <version>1.0</version>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <jetlinks.core.version>1.2.0-SNAPSHOT</jetlinks.core.version>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-archetype-plugin</artifactId>
+                <version>3.0.1</version>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.6.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>3.0.2</version>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+
+            </plugin>
+
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.jetlinks</groupId>
+            <artifactId>jetlinks-supports</artifactId>
+            <version>${jetlinks.core.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.24</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>5.8.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.13.2</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>io.projectreactor</groupId>
+            <artifactId>reactor-test</artifactId>
+            <version>3.4.18</version>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <repositories>
+        <repository>
+            <id>aliyun-nexus</id>
+            <name>aliyun</name>
+            <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+
+        <repository>
+            <id>hsweb-nexus</id>
+            <name>Nexus Release Repository</name>
+            <url>https://nexus.hsweb.me/content/groups/public/</url>
+            <snapshots>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </repository>
+
+    </repositories>
+
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>aliyun-nexus</id>
+            <name>aliyun</name>
+            <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
+        </pluginRepository>
+    </pluginRepositories>
+
+</project>

+ 149 - 0
src/main/java/com/liyan/LadarDeviceMessageCodec.java

@@ -0,0 +1,149 @@
+package com.liyan;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.liyan.portal.LadarMessage;
+;
+import io.netty.buffer.Unpooled;
+import org.jetlinks.core.message.Message;
+import org.jetlinks.core.message.codec.*;
+import org.jetlinks.core.message.property.*;
+import reactor.core.publisher.Flux;
+
+import javax.annotation.Nonnull;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+public class LadarDeviceMessageCodec implements DeviceMessageCodec {
+
+    private final ObjectMapper mapper = ObjectMappers.JSON_MAPPER;
+
+    private final HashMap<String, String> propMessageIdMapping = new HashMap<>();
+
+    @Override
+    public Transport getSupportTransport() {
+        return DefaultTransport.MQTT;
+    }
+
+    @Nonnull
+    @Override
+    public Flux<? extends Message> decode(@Nonnull MessageDecodeContext context) {
+        FromDeviceMessageContext ctx = (FromDeviceMessageContext) context;
+        MqttMessage message = (MqttMessage) ctx.getMessage();
+        String topic = message.getTopic();
+        Pattern pattern = Pattern.compile("(?<=Radar60SP\\/)(.*?)(?=\\/sys)");
+        Matcher matcher = pattern.matcher(topic);
+        if (!matcher.find()) return Flux.empty();
+        String deviceId = matcher.group(1);
+        LadarMessage ladarMessage = JSONObject.parseObject(message.payloadAsString(), LadarMessage.class);
+        // 雷达消息类型为获取属性响应
+        if ("get".equals(ladarMessage.getOpt())) {
+            ReadPropertyMessageReply readPropertyMessageReply = ReadPropertyMessageReply.create()
+                    .success(ladarMessage.getParams());
+            String prop = ladarMessage.getParams().keySet().stream().findFirst().orElse(null);
+            String propKeyId = deviceId + "@get@" + prop;
+            if (!propMessageIdMapping.containsKey(propKeyId)) return Flux.empty();
+            readPropertyMessageReply.setMessageId(propMessageIdMapping.get(propKeyId));
+            propMessageIdMapping.remove(propKeyId);
+            readPropertyMessageReply.setDeviceId(deviceId);
+            return Flux.just(readPropertyMessageReply);
+        }
+
+        // 雷达消息类型为设置属性响应类型
+        if ("set".equals(ladarMessage.getOpt())) {
+            WritePropertyMessageReply reply = WritePropertyMessageReply.create()
+                    .success(ladarMessage.getParams());
+            String prop = ladarMessage.getParams().keySet().stream().findFirst().orElse(null);
+            String propKeyId = deviceId + "@set@" + prop;
+            if (!propMessageIdMapping.containsKey(propKeyId)) return Flux.empty();
+            reply.setMessageId(propMessageIdMapping.get(propKeyId));
+            propMessageIdMapping.remove(propKeyId);
+            reply.setDeviceId(deviceId);
+            return Flux.just(reply);
+        }
+
+        // 雷达上报属性
+        ReportPropertyMessage report = new ReportPropertyMessage();
+        report.properties(ladarMessage.getParams());
+        report.setDeviceId(deviceId);
+        report.setTimestamp(System.currentTimeMillis());
+        return Flux.just(report);
+    }
+
+    @Nonnull
+    @Override
+    public Flux<? extends EncodedMessage> encode(@Nonnull MessageEncodeContext context) {
+        MessageEncodeContext ctx = context;
+        Message message = ctx.getMessage();
+        // 消息类型为读取属性类型
+        if (message instanceof ReadPropertyMessage) {
+            ReadPropertyMessage readPropertyMessage = (ReadPropertyMessage) message;
+            // 获取待查询的属性类型
+            List<String> props = readPropertyMessage.getProperties();
+            if (props.isEmpty()) return Flux.empty();
+            Stream<SimpleMqttMessage> simpleMqttMessageStream = props.parallelStream().map(prop -> {
+                String propKeyId = readPropertyMessage.getDeviceId() + "@get@" + prop;
+//                System.out.println("[LADARENCODE]--------" + propKeyId);
+//                System.out.println("[LADAEENCODE]--------messageId" + readPropertyMessage.getMessageId());
+                propMessageIdMapping.put(propKeyId, readPropertyMessage.getMessageId());
+                LadarMessage ladarMessage = new LadarMessage();
+                ladarMessage.setVersion("1.0");
+                ladarMessage.setMethod("get");
+                ladarMessage.getParams().put(prop, "?");
+                SimpleMqttMessage mqttMessage = null;
+                try {
+                    mqttMessage = SimpleMqttMessage
+                            .builder()
+                            .clientId(readPropertyMessage.getDeviceId())
+                            .topic("/Radar60SP/" + readPropertyMessage.getDeviceId() + "/sys/property/set")
+                            .payloadType(MessagePayloadType.JSON)
+                            .payload(Unpooled.wrappedBuffer(mapper.writeValueAsBytes(ladarMessage)))
+                            .build();
+                } catch (JsonProcessingException e) {
+
+                }
+                return mqttMessage;
+            }).filter(it -> !(it == null));
+            return Flux.fromStream(simpleMqttMessageStream);
+        }
+
+        // 消息类型为设置属性类型
+        if (message instanceof WritePropertyMessage) {
+            WritePropertyMessage writePropertyMessage = (WritePropertyMessage) message;
+            Map<String, Object> properties = writePropertyMessage.getProperties();
+            if (properties.isEmpty()) return Flux.empty();
+            List<SimpleMqttMessage> mqttMessages = new ArrayList<>();
+            properties.forEach((key, value) -> {
+                String keyId = writePropertyMessage.getDeviceId() + "@set@" + key;
+                propMessageIdMapping.put(keyId, writePropertyMessage.getMessageId());
+                LadarMessage ladarMessage = new LadarMessage();
+                ladarMessage.setVersion("1.0");
+                ladarMessage.setMethod("set");
+                ladarMessage.getParams().put(key, value);
+                SimpleMqttMessage mqttMessage = null;
+                try {
+                    mqttMessage = SimpleMqttMessage
+                            .builder()
+                            .clientId(writePropertyMessage.getDeviceId())
+                            .topic("/Radar60SP/" + writePropertyMessage.getDeviceId() + "/sys/property/set")
+                            .payloadType(MessagePayloadType.JSON)
+                            .payload(Unpooled.wrappedBuffer(mapper.writeValueAsBytes(ladarMessage)))
+                            .build();
+                } catch (JsonProcessingException e) {
+
+                }
+                if (mqttMessage != null) mqttMessages.add(mqttMessage);
+            });
+            return Flux.fromIterable(mqttMessages);
+        }
+
+        return Flux.empty();
+    }
+
+}

+ 42 - 0
src/main/java/com/liyan/MyProtocolSupportProvider.java

@@ -0,0 +1,42 @@
+package com.liyan;
+
+import org.jetlinks.core.ProtocolSupport;
+import org.jetlinks.core.defaults.CompositeProtocolSupport;
+import org.jetlinks.core.message.codec.DefaultTransport;
+import org.jetlinks.core.route.Route;
+import org.jetlinks.core.spi.ProtocolSupportProvider;
+import org.jetlinks.core.spi.ServiceContext;
+import reactor.core.publisher.Mono;
+
+import java.util.Arrays;
+
+
+public class MyProtocolSupportProvider implements ProtocolSupportProvider {
+
+    @Override
+    public Mono<? extends ProtocolSupport> create(ServiceContext context) {
+        CompositeProtocolSupport support = new CompositeProtocolSupport();
+        support.setId("ladar-protocol");
+        support.setName("ladar-protocol");
+
+        //配置编解码
+        support.addMessageCodecSupport(new LadarDeviceMessageCodec());
+
+        //配置topic
+        support.addRoutes(DefaultTransport.MQTT, Arrays.asList(
+                Route.mqtt("/Radar60SP/+/sys/property/post")
+                        .group("属性上报相关")
+                        .description("设备上报属性")
+                        .upstream(true)
+                        .build(),
+                Route.mqtt("/Radar60SP/+/sys/property/set")
+                        .group("属性设置相关")
+                        .description("设置设备属性")
+                        .downstream(true)
+                        .build()
+        ));
+
+
+        return Mono.just(support);
+    }
+}

+ 21 - 0
src/main/java/com/liyan/ObjectMappers.java

@@ -0,0 +1,21 @@
+package com.liyan;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+
+public class ObjectMappers {
+
+    public static final ObjectMapper JSON_MAPPER;
+
+    static {
+        JSON_MAPPER = Jackson2ObjectMapperBuilder
+                .json()
+                .build()
+                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+                .setSerializationInclusion(JsonInclude.Include.NON_NULL)
+        ;
+    }
+
+}

+ 48 - 0
src/main/java/com/liyan/portal/LadarMessage.java

@@ -0,0 +1,48 @@
+package com.liyan.portal;
+
+import java.util.HashMap;
+
+public class LadarMessage {
+
+    private String version;
+
+    private String method;
+
+    private String opt;
+
+    private HashMap<String, Object> params;
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    public String getOpt() {
+        return opt;
+    }
+
+    public void setOpt(String opt) {
+        this.opt = opt;
+    }
+
+    public HashMap<String, Object> getParams() {
+        if (params == null) this.params = new HashMap<>();
+        return params;
+    }
+
+    public void setParams(HashMap<String, Object> params) {
+        this.params = params;
+    }
+
+}

+ 197 - 0
src/test/java/com/liyan/JetLinksMqttDeviceMessageCodecTest.java

@@ -0,0 +1,197 @@
+package com.liyan;
+
+import io.netty.buffer.Unpooled;
+import org.jetlinks.core.defaults.CompositeProtocolSupports;
+import org.jetlinks.core.device.DeviceInfo;
+import org.jetlinks.core.device.DeviceOperator;
+import org.jetlinks.core.device.ProductInfo;
+import org.jetlinks.core.device.StandaloneDeviceMessageBroker;
+import org.jetlinks.core.message.Message;
+import org.jetlinks.core.message.codec.*;
+import org.jetlinks.core.message.property.*;
+import org.jetlinks.core.server.session.DeviceSession;
+import org.jetlinks.supports.official.JetLinksMqttDeviceMessageCodec;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import reactor.core.publisher.Mono;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Collections;
+
+public class JetLinksMqttDeviceMessageCodecTest {
+
+    LadarDeviceMessageCodec codec = new LadarDeviceMessageCodec();
+
+
+    TestDeviceRegistry registry;
+
+    private EncodedMessage currentReply;
+
+    @Before
+    public void init() {
+        registry = new TestDeviceRegistry(new CompositeProtocolSupports(), new StandaloneDeviceMessageBroker());
+
+        registry.register(ProductInfo.builder()
+                        .id("product1")
+                        .protocol("jetlinks")
+                        .build())
+                .flatMap(product -> registry.register(DeviceInfo.builder()
+                        .id("device1")
+                        .productId("product1")
+                        .build()))
+                .block();
+
+    }
+
+    @Test
+    public void testPropertiesReport() {
+        Message message = codec.decode(createMessageContext(
+                        SimpleMqttMessage
+                                .builder()
+                                .topic("/Radar60SP/701D0808C7E0/sys/property/post")
+                                .payload(Unpooled.wrappedBuffer(("{\n" +
+                                        "\t\"version\":\t\"1.0\",\n" +
+                                        "\t\"method\":\t\"post\",\n" +
+                                        "\t\"params\":\t{\n" +
+                                        "\t\t\"breathValue\":\t\"11\"\n" +
+                                        "\t}\n" +
+                                        "}").getBytes()))
+                                .build()))
+                .blockFirst();
+
+        Assert.assertTrue(message instanceof ReportPropertyMessage);
+        ReportPropertyMessage reply = ((ReportPropertyMessage) message);
+
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testReadProperty() {
+        ReadPropertyMessage message = new ReadPropertyMessage();
+        message.setDeviceId("701D0808C7E0");
+        message.setMessageId("test");
+        message.setProperties(Arrays.asList("productMode", "productId"));
+        MqttMessage encodedMessage = (MqttMessage) codec.encode(createMessageContext(message)).subscribe(
+                item -> {
+                    System.out.println(item.getPayload().toString(StandardCharsets.UTF_8));
+                }
+
+        );
+
+
+//        Assert.assertNotNull(encodedMessage);
+//        System.out.println(encodedMessage.getPayload().toString(StandardCharsets.UTF_8));
+    }
+
+    public MessageEncodeContext createMessageContext(Message message) {
+        return new MessageEncodeContext() {
+            @Nonnull
+            @Override
+            public Message getMessage() {
+                return message;
+            }
+
+            @Override
+            public DeviceOperator getDevice() {
+                return registry.getDevice("device1").block();
+            }
+
+            @Override
+            public Mono<DeviceOperator> getDevice(String deviceId) {
+                return registry.getDevice(deviceId);
+            }
+        };
+    }
+
+
+    public MessageDecodeContext createMessageContext(EncodedMessage message) {
+        System.out.println(message.toString());
+        return new FromDeviceMessageContext() {
+            @Nonnull
+            @Override
+            public EncodedMessage getMessage() {
+                return message;
+            }
+
+            @Override
+            public DeviceSession getSession() {
+                return new MockSession();
+            }
+
+            @Override
+            public DeviceOperator getDevice() {
+                return registry.getDevice("device1").block();
+            }
+
+            @Override
+            public Mono<DeviceOperator> getDevice(String deviceId) {
+                return registry.getDevice(deviceId);
+            }
+        };
+    }
+
+    class MockSession implements DeviceSession {
+
+        @Override
+        public String getId() {
+            return "device1";
+        }
+
+        @Override
+        public String getDeviceId() {
+            return "device1";
+        }
+
+        @Nullable
+        @Override
+        public DeviceOperator getOperator() {
+            return registry.getDevice("device1").block();
+        }
+
+        @Override
+        public long lastPingTime() {
+            return 0;
+        }
+
+        @Override
+        public long connectTime() {
+            return 0;
+        }
+
+        @Override
+        public Mono<Boolean> send(EncodedMessage encodedMessage) {
+            currentReply = encodedMessage;
+            return Mono.just(true);
+        }
+
+        @Override
+        public Transport getTransport() {
+            return null;
+        }
+
+        @Override
+        public void close() {
+
+        }
+
+        @Override
+        public void ping() {
+
+        }
+
+        @Override
+        public boolean isAlive() {
+            return false;
+        }
+
+        @Override
+        public void onClose(Runnable call) {
+
+        }
+    }
+
+}

+ 80 - 0
src/test/java/com/liyan/TestDeviceRegistry.java

@@ -0,0 +1,80 @@
+package com.liyan;
+
+import org.jetlinks.core.ProtocolSupports;
+import org.jetlinks.core.config.ConfigStorageManager;
+import org.jetlinks.core.defaults.DefaultDeviceOperator;
+import org.jetlinks.core.defaults.DefaultDeviceProductOperator;
+import org.jetlinks.core.device.*;
+import org.jetlinks.core.message.interceptor.DeviceMessageSenderInterceptor;
+import org.jetlinks.supports.config.InMemoryConfigStorageManager;
+import reactor.core.publisher.Mono;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class TestDeviceRegistry implements DeviceRegistry {
+
+    private DeviceMessageSenderInterceptor interceptor = new CompositeDeviceMessageSenderInterceptor();
+
+    private ConfigStorageManager manager = new InMemoryConfigStorageManager();
+
+    private Map<String, DeviceOperator> operatorMap = new ConcurrentHashMap<>();
+
+    private Map<String, DeviceProductOperator> productOperatorMap = new ConcurrentHashMap<>();
+
+    private ProtocolSupports supports;
+
+    private DeviceOperationBroker handler;
+
+    public TestDeviceRegistry(ProtocolSupports supports, DeviceOperationBroker handler) {
+        this.supports = supports;
+        this.handler = handler;
+    }
+
+    @Override
+    public Mono<DeviceOperator> getDevice(String deviceId) {
+        return Mono.fromSupplier(() -> operatorMap.get(deviceId));
+    }
+
+    @Override
+    public Mono<DeviceProductOperator> getProduct(String productId) {
+        return Mono.fromSupplier(() -> productOperatorMap.get(productId));
+    }
+
+    @Override
+    public Mono<DeviceOperator> register(DeviceInfo deviceInfo) {
+        DefaultDeviceOperator operator = new DefaultDeviceOperator(
+                deviceInfo.getId(),
+                supports, manager, handler, this
+        );
+        operatorMap.put(operator.getDeviceId(), operator);
+        return operator.setConfigs(
+                DeviceConfigKey.productId.value(deviceInfo.getProductId()),
+                DeviceConfigKey.protocol.value(deviceInfo.getProtocol()))
+                .thenReturn(operator);
+    }
+
+    @Override
+    public Mono<DeviceProductOperator> register(ProductInfo productInfo) {
+        DefaultDeviceProductOperator operator = new DefaultDeviceProductOperator(productInfo.getId(), supports, manager);
+        productOperatorMap.put(operator.getId(), operator);
+        return operator.setConfigs(
+                DeviceConfigKey.productId.value(productInfo.getMetadata()),
+                DeviceConfigKey.protocol.value(productInfo.getProtocol()))
+                .thenReturn(operator);
+    }
+
+    @Override
+    public Mono<Void> unregisterDevice(String deviceId) {
+        return Mono.justOrEmpty(deviceId)
+                .map(operatorMap::remove)
+                .then();
+    }
+
+    @Override
+    public Mono<Void> unregisterProduct(String productId) {
+        return Mono.justOrEmpty(productId)
+                .map(productOperatorMap::remove)
+                .then();
+    }
+}

BIN
target/classes/com/liyan/LadarDeviceMessageCodec.class


BIN
target/classes/com/liyan/MyProtocolSupportProvider.class


BIN
target/classes/com/liyan/ObjectMappers.class


BIN
target/classes/com/liyan/portal/LadarMessage.class


BIN
target/ladar-protocol-1.0.jar


+ 5 - 0
target/maven-archiver/pom.properties

@@ -0,0 +1,5 @@
+#Generated by Maven
+#Wed Feb 22 13:37:35 CST 2023
+groupId=com.liyan
+artifactId=ladar-protocol
+version=1.0

+ 4 - 0
target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst

@@ -0,0 +1,4 @@
+com\liyan\portal\LadarMessage.class
+com\liyan\LadarDeviceMessageCodec.class
+com\liyan\MyProtocolSupportProvider.class
+com\liyan\ObjectMappers.class

+ 4 - 0
target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst

@@ -0,0 +1,4 @@
+D:\WorkSpace\IDEAWorkspace\ladar-protocol\src\main\java\com\liyan\MyProtocolSupportProvider.java
+D:\WorkSpace\IDEAWorkspace\ladar-protocol\src\main\java\com\liyan\portal\LadarMessage.java
+D:\WorkSpace\IDEAWorkspace\ladar-protocol\src\main\java\com\liyan\LadarDeviceMessageCodec.java
+D:\WorkSpace\IDEAWorkspace\ladar-protocol\src\main\java\com\liyan\ObjectMappers.java

+ 5 - 0
target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst

@@ -0,0 +1,5 @@
+com\liyan\TestDeviceRegistry.class
+com\liyan\JetLinksMqttDeviceMessageCodecTest$MockSession.class
+com\liyan\JetLinksMqttDeviceMessageCodecTest.class
+com\liyan\JetLinksMqttDeviceMessageCodecTest$2.class
+com\liyan\JetLinksMqttDeviceMessageCodecTest$1.class

+ 2 - 0
target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst

@@ -0,0 +1,2 @@
+D:\WorkSpace\IDEAWorkspace\ladar-protocol\src\test\java\com\liyan\JetLinksMqttDeviceMessageCodecTest.java
+D:\WorkSpace\IDEAWorkspace\ladar-protocol\src\test\java\com\liyan\TestDeviceRegistry.java

BIN
target/test-classes/com/liyan/JetLinksMqttDeviceMessageCodecTest$1.class


BIN
target/test-classes/com/liyan/JetLinksMqttDeviceMessageCodecTest$2.class


BIN
target/test-classes/com/liyan/JetLinksMqttDeviceMessageCodecTest$MockSession.class


BIN
target/test-classes/com/liyan/JetLinksMqttDeviceMessageCodecTest.class


BIN
target/test-classes/com/liyan/TestDeviceRegistry.class