Browse Source

init project

liyan 2 năm trước cách đây
commit
017c1c2eeb

+ 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/

+ 96 - 0
pom.xml

@@ -0,0 +1,96 @@
+<?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>fall-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>
+    </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>

+ 43 - 0
src/main/java/com/liyan/FallLadarProtocolSupportProvider.java

@@ -0,0 +1,43 @@
+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;
+
+/**
+ * 60G跌倒雷达协议转换支持
+ */
+public class FallLadarProtocolSupportProvider implements ProtocolSupportProvider {
+
+    @Override
+    public Mono<? extends ProtocolSupport> create(ServiceContext context) {
+        CompositeProtocolSupport support = new CompositeProtocolSupport();
+        support.setId("fall-ladar-protocol");
+        support.setName("fall-ladar-protocol");
+
+        //配置编解码
+        support.addMessageCodecSupport(new LadarDeviceMessageCodec());
+
+        //配置topic
+        support.addRoutes(DefaultTransport.MQTT, Arrays.asList(
+                Route.mqtt("/Radar60FL/+/sys/property/post")
+                        .group("属性上报相关")
+                        .description("设备上报属性")
+                        .upstream(true)
+                        .build(),
+                Route.mqtt("/Radar60FL/+/sys/property/set")
+                        .group("属性设置相关")
+                        .description("设置设备属性")
+                        .downstream(true)
+                        .build()
+        ));
+
+        return Mono.just(support);
+    }
+}

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

@@ -0,0 +1,148 @@
+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("(?<=Radar60FL\\/)(.*?)(?=\\/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;
+                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("/Radar60FL/" + 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("/Radar60FL/" + 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();
+    }
+
+}

+ 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;
+    }
+
+}

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


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


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


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


BIN
target/fall-ladar-protocol-1.0.jar


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

@@ -0,0 +1,5 @@
+#Generated by Maven
+#Wed Feb 22 13:58:56 CST 2023
+groupId=com.liyan
+artifactId=fall-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\FallLadarProtocolSupportProvider.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\fall-ladar-protocol\src\main\java\com\liyan\FallLadarProtocolSupportProvider.java
+D:\WorkSpace\IDEAWorkspace\fall-ladar-protocol\src\main\java\com\liyan\portal\LadarMessage.java
+D:\WorkSpace\IDEAWorkspace\fall-ladar-protocol\src\main\java\com\liyan\ObjectMappers.java
+D:\WorkSpace\IDEAWorkspace\fall-ladar-protocol\src\main\java\com\liyan\LadarDeviceMessageCodec.java