Pārlūkot izejas kodu

增加设备自动注册

zhou-hao 5 gadi atpakaļ
vecāks
revīzija
ea6d6738a5

+ 15 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/DeviceProductEntity.java

@@ -10,6 +10,8 @@ import org.hswebframework.web.crud.generator.Generators;
 import org.hswebframework.web.validator.CreateGroup;
 import org.hswebframework.web.validator.UpdateGroup;
 import org.jetlinks.community.device.enums.DeviceType;
+import org.jetlinks.core.device.DeviceConfigKey;
+import org.jetlinks.core.device.ProductInfo;
 
 import javax.persistence.Column;
 import javax.persistence.GeneratedValue;
@@ -19,6 +21,8 @@ import javax.validation.constraints.Pattern;
 import java.sql.JDBCType;
 import java.util.Map;
 
+import static org.jetlinks.community.device.enums.DeviceType.gateway;
+
 @Getter
 @Setter
 @Table(name = "dev_product")
@@ -117,4 +121,15 @@ public class DeviceProductEntity extends GenericEntity<String> implements Record
     @Comment("所属机构id")
     private String orgId;
 
+    public ProductInfo toProductInfo() {
+        return ProductInfo.builder()
+            .id(getId())
+            .protocol(getMessageProtocol())
+            .metadata(getMetadata())
+            .build()
+            .addConfig(DeviceConfigKey.isGatewayDevice, getDeviceType() == gateway)
+
+            ;
+    }
+
 }

+ 62 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/AutoDiscoverDeviceRegistry.java

@@ -0,0 +1,62 @@
+package org.jetlinks.community.device.service;
+
+import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository;
+import org.jetlinks.core.device.*;
+import org.jetlinks.community.device.entity.DeviceInstanceEntity;
+import org.jetlinks.community.device.entity.DeviceProductEntity;
+import reactor.core.publisher.Mono;
+
+public class AutoDiscoverDeviceRegistry implements DeviceRegistry {
+
+    private final DeviceRegistry parent;
+
+    private final ReactiveRepository<DeviceInstanceEntity, String> deviceRepository;
+
+    private final ReactiveRepository<DeviceProductEntity, String> productRepository;
+
+    public AutoDiscoverDeviceRegistry(DeviceRegistry parent,
+                                      ReactiveRepository<DeviceInstanceEntity, String> deviceRepository,
+                                      ReactiveRepository<DeviceProductEntity, String> productRepository) {
+        this.parent = parent;
+        this.deviceRepository = deviceRepository;
+        this.productRepository = productRepository;
+    }
+
+    @Override
+    public Mono<DeviceOperator> getDevice(String deviceId) {
+        return parent
+            .getDevice(deviceId)
+            .switchIfEmpty(Mono.defer(() -> deviceRepository
+                .findById(deviceId)
+                .flatMap(instance -> parent.register(instance.toDeviceInfo()))));
+    }
+
+    @Override
+    public Mono<DeviceProductOperator> getProduct(String productId) {
+        return parent
+            .getProduct(productId)
+            .switchIfEmpty(Mono.defer(() -> productRepository
+                .findById(productId)
+                .flatMap(product -> parent.register(product.toProductInfo()))));
+    }
+
+    @Override
+    public Mono<DeviceOperator> register(DeviceInfo deviceInfo) {
+        return parent.register(deviceInfo);
+    }
+
+    @Override
+    public Mono<DeviceProductOperator> register(ProductInfo productInfo) {
+        return parent.register(productInfo);
+    }
+
+    @Override
+    public Mono<Void> unregisterDevice(String deviceId) {
+        return parent.unregisterDevice(deviceId);
+    }
+
+    @Override
+    public Mono<Void> unregisterProduct(String productId) {
+        return parent.unregisterProduct(productId);
+    }
+}

+ 16 - 1
jetlinks-standalone/src/main/java/org/jetlinks/community/standalone/configuration/JetLinksConfiguration.java

@@ -5,9 +5,13 @@ import io.micrometer.core.instrument.MeterRegistry;
 import io.vertx.core.Vertx;
 import io.vertx.core.VertxOptions;
 import lombok.extern.slf4j.Slf4j;
+import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository;
 import org.hswebframework.web.authorization.token.UserTokenManager;
 import org.hswebframework.web.authorization.token.redis.RedisUserTokenManager;
+import org.jetlinks.community.device.entity.DeviceInstanceEntity;
+import org.jetlinks.community.device.entity.DeviceProductEntity;
 import org.jetlinks.community.device.message.writer.TimeSeriesMessageWriterConnector;
+import org.jetlinks.community.device.service.AutoDiscoverDeviceRegistry;
 import org.jetlinks.community.timeseries.TimeSeriesManager;
 import org.jetlinks.core.ProtocolSupports;
 import org.jetlinks.core.cluster.ClusterManager;
@@ -49,6 +53,7 @@ import org.springframework.boot.web.server.WebServerFactoryCustomizer;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
 import org.springframework.data.redis.core.ReactiveRedisOperations;
 import org.springframework.data.redis.core.ReactiveRedisTemplate;
 import reactor.core.publisher.EmitterProcessor;
@@ -95,12 +100,22 @@ public class JetLinksConfiguration {
     }
 
     @Bean
-    public ClusterDeviceRegistry deviceRegistry(ProtocolSupports supports,
+    public ClusterDeviceRegistry clusterDeviceRegistry(ProtocolSupports supports,
                                                 ClusterManager manager,
                                                 DeviceOperationBroker handler) {
         return new ClusterDeviceRegistry(supports, manager, handler, CacheBuilder.newBuilder().build());
     }
 
+    @Bean
+    @Primary
+    @ConditionalOnProperty(prefix = "jetlinks.device.registry",name = "auto-discover",havingValue = "enabled",matchIfMissing = true)
+    public AutoDiscoverDeviceRegistry deviceRegistry(ClusterDeviceRegistry registry,
+                                                     ReactiveRepository<DeviceInstanceEntity, String> instanceRepository,
+                                                     ReactiveRepository<DeviceProductEntity, String> productRepository) {
+        return new AutoDiscoverDeviceRegistry(registry, instanceRepository, productRepository);
+    }
+
+
     @Bean
     public BeanPostProcessor interceptorRegister(ClusterDeviceRegistry registry){
         return new BeanPostProcessor() {