Procházet zdrojové kódy

fixed 网桥设备接口

18339543638 před 4 roky
rodič
revize
b8b1e9e59d

+ 7 - 5
jetlinks-manager/bridge-manager/src/main/java/org/jetlinks/community/bridge/core/DefaultBridgeConfigManager.java

@@ -1,13 +1,11 @@
 package org.jetlinks.community.bridge.core;
 
-import cn.hutool.core.util.HashUtil;
 import cn.hutool.core.util.StrUtil;
 import com.aliyun.iot.as.bridge.core.config.BridgeConfigConsts;
 import com.aliyun.iot.as.bridge.core.config.BridgeConfigManager;
 import com.aliyun.iot.as.bridge.core.exception.BootException;
 import com.aliyun.iot.as.bridge.core.model.PopClientConfiguration;
 import lombok.Getter;
-import lombok.NoArgsConstructor;
 
 import java.net.*;
 import java.util.Arrays;
@@ -24,7 +22,10 @@ public class DefaultBridgeConfigManager implements BridgeConfigManager {
      */
     private String bridgeId;
 
-    private final String macId;
+    /**
+     * 自定义模拟mac地址
+     */
+    private final String deviceName;
 
     /**
      * 网桥设备所属产品的ProductKey。
@@ -63,7 +64,7 @@ public class DefaultBridgeConfigManager implements BridgeConfigManager {
 
     private DefaultBridgeConfigManager(String bridgeId,String bridgeProductKey, String bridgeDeviceName, String bridgeDeviceSecret, String http2Endpoint,String authEndpoint,Map<String, Object> configMaps, PopClientConfiguration popConfiguration) {
         this.bridgeId=bridgeId;
-        this.macId=createMacId(bridgeId);
+        this.deviceName =createMacId(bridgeId);
         this.bridgeProductKey = bridgeProductKey;
         this.bridgeDeviceName = bridgeDeviceName;
         this.bridgeDeviceSecret = bridgeDeviceSecret;
@@ -144,7 +145,8 @@ public class DefaultBridgeConfigManager implements BridgeConfigManager {
     }
     @Override
     public String getMacAddress() {
-        return macId;
+        return deviceName;
+//        return getMac(getInetAddress());
     }
     @Override
     public void updateBridgeDeviceSecret(String deviceSecret) {

+ 8 - 0
jetlinks-manager/bridge-manager/src/main/java/org/jetlinks/community/bridge/entity/AliIotBridgeEntity.java

@@ -1,5 +1,6 @@
 package org.jetlinks.community.bridge.entity;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Getter;
@@ -81,6 +82,13 @@ public class AliIotBridgeEntity extends GenericEntity<String> {
     @Deprecated
     private String errorReason;
 
+
+    @Comment("网桥deviceName")
+    @Column(name = "device_name")
+    @Schema(description = "网桥deviceName")
+    @JsonIgnoreProperties
+    private String deviceName;
+
     @Comment("所在集群节点id")
     @Column(name = "node_id")
     @Schema(description = "所在集群节点id")

+ 4 - 4
jetlinks-manager/bridge-manager/src/main/java/org/jetlinks/community/bridge/server/aliyun/AliBridgeGateway.java

@@ -178,11 +178,11 @@ public class AliBridgeGateway{
 
 
 
-    public Mono<Void> replaceBridgeServer(String oldNodeId,String oldBridgeId,AliIotBridgeEntity bridge){
+    public Mono<AliBridgeServer> replaceBridgeServer(String oldNodeId,String oldBridgeId,AliIotBridgeEntity bridge){
         return handleClusterOperation(oldNodeId,oldBridgeId,MessageType.update,bridge)
-            .switchIfEmpty(delBridgeServer(oldNodeId,oldBridgeId)
-                .concatWith(initBridge(bridge))
-                .then());
+            .switchIfEmpty(delBridgeServer(oldNodeId,oldBridgeId))
+            .concatWith(initBridge(bridge))
+            .then(Mono.just(getServer(bridge.getId())));
     }
 
 

+ 3 - 1
jetlinks-manager/bridge-manager/src/main/java/org/jetlinks/community/bridge/server/aliyun/AliBridgeServer.java

@@ -113,6 +113,7 @@ public class AliBridgeServer  implements BridgeServer {
                 });
             });
         }
+        params.setDeviceName(bridgeConfigManager.getDeviceName());
         return Mono.empty();
 
     }
@@ -153,7 +154,8 @@ public class AliBridgeServer  implements BridgeServer {
         //注册设备信息
         DefaultDeviceConfigManager.register(originalIdentity,productKey,deviceName,deviceSecret);
         DefaultUplinkChannelHandler uplinkChannelHandler = new DefaultUplinkChannelHandler(bridgeConfigManager, DefaultDeviceConfigManager.getInstance());
-        channelMap.putIfAbsent(originalIdentity, new DefaultAliBridgeChannel(originalIdentity, productKey, deviceName, uplinkChannelHandler, deviceRegistry, eventBus));
+        channelMap
+            .putIfAbsent(originalIdentity, new DefaultAliBridgeChannel(originalIdentity, productKey, deviceName, uplinkChannelHandler, deviceRegistry, eventBus));
         return Mono.just(channelMap.get(originalIdentity))
             .doOnNext(Channel::init)
             .flatMap(channel ->

+ 52 - 20
jetlinks-manager/bridge-manager/src/main/java/org/jetlinks/community/bridge/web/AliBridgeServerController.java

@@ -13,12 +13,15 @@ import org.hswebframework.web.crud.web.reactive.ReactiveServiceCrudController;
 import org.hswebframework.web.exception.BusinessException;
 import org.jetlinks.community.bridge.entity.AliIotBridgeEntity;
 import org.jetlinks.community.bridge.entity.AliIotBridgeDeviceConfig;
+import org.jetlinks.community.bridge.enums.BridgeStatus;
 import org.jetlinks.community.bridge.server.aliyun.AliBridgeGateway;
 import org.jetlinks.community.bridge.service.AliBridgeDeviceService;
 import org.jetlinks.community.bridge.service.AliBridgeService;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.web.bind.annotation.*;
 import reactor.core.publisher.Mono;
+import reactor.util.function.Tuple2;
+import reactor.util.function.Tuple3;
 
 /**
  * @author lifang
@@ -66,27 +69,45 @@ public class AliBridgeServerController implements
     }
 
 
+    /**
+     *
+     * @param id
+     * @param config
+     * @return
+     * @throws BusinessException 同一设备只能绑定一次
+     */
     @PostMapping("/register/{serverId}")
     @Operation(summary = "注册网桥设备")
     @CreateAction
     public Mono<Void> register(@PathVariable("serverId") String id,@RequestBody AliIotBridgeDeviceConfig config){
-        return bridgeService.findById(id)
-            .flatMap(bridge->
-                Mono.zip(
-                    //保存网桥设备信息
-                    bridgeDeviceService.save(config),
-                    //注册网桥设备
-                    bridgeGateway.registerDevice(bridge.getNodeId(),bridge.getId(),config))
-                    .then()
-                    .onErrorResume(DuplicateKeyException.class,e->Mono.error(new BusinessException("设备不可重复添加")))
-            );
+        return bridgeService.createQuery()
+            .where(AliIotBridgeEntity::getDeviceName,config.getDeviceName())
+            .count()
+            .doOnNext(count->{
+                if(count>0){
+                    throw new BusinessException("不可在网桥下绑定网桥设备自身");
+                }
+            })
+            .concatWith(bridgeService.findById(id)
+                .flatMap(bridge->
+                    Mono.zip(
+                        //保存网桥设备信息
+                        bridgeDeviceService.save(config),
+                        //注册网桥设备
+                        bridgeGateway.registerDevice(bridge.getNodeId(),bridge.getId(),config))
+                        .onErrorResume(DuplicateKeyException.class,
+                            e->Mono.error(new BusinessException(
+                                String.format("deviceName:[{%s}],deviceSecret:[{%s}]或设备id:[{%s}],已在网桥存在,不可重复添加",config.getDeviceName(),config.getDeviceSecret(),config.getOriginalIdentity()))))
+                ).then(Mono.empty())).then();
     }
 
     @PostMapping("/pause/{serverId}")
     @Operation(summary = "暂停网桥")
     @CreateAction
     public Mono<Void> pause(@PathVariable("serverId") String id){
-        return bridgeService.findById(id)
+        return Mono.zip(bridgeService.findById(id),bridgeService.createUpdate().where(AliIotBridgeEntity::getId,id)
+            .set(AliIotBridgeEntity::getState, BridgeStatus.stop).execute().then())
+            .map(Tuple2::getT1)
             .flatMap(server->bridgeGateway.delBridgeServer(server.getNodeId(),server.getId()));
     }
 
@@ -125,20 +146,31 @@ public class AliBridgeServerController implements
     @Operation(summary = "更新网桥信息")
     @CreateAction
     public Mono<Void> updateBridge(@RequestBody AliIotBridgeEntity bridge,@PathVariable("serverId") String id){
-        //删除设备后重新注册设备
         return bridgeService.findById(id)
-            .flatMap(oldBridge->
-                Mono.zip(
-                    bridgeGateway.replaceBridgeServer(oldBridge.getNodeId(),oldBridge.getId(),bridge)
-                    , bridgeService.save(bridge))
-                    .flatMap(tp2->bridgeDeviceService.createQuery()
+            .flatMap(oldBridge-> bridgeGateway.replaceBridgeServer(oldBridge.getNodeId(),oldBridge.getId(),bridge))
+            .flatMap(nowBridge->
+                bridgeService.save(bridge)
+                    .concatWith(bridgeDeviceService.createQuery()
                         .where(AliIotBridgeDeviceConfig::getBridgeId,bridge.getId())
                         .fetch()
                         .flatMap(deviceConfig->
-                            bridgeGateway.registerDevice(bridge.getNodeId(),bridge.getId(),deviceConfig)
-                        ).then()
-                    )
+                            bridgeGateway.registerDevice(bridge.getNodeId(),bridge.getId(),deviceConfig).then(Mono.empty())
+                        )).then()
             );
+        //删除设备后重新注册设备
+//        return bridgeService.findById(id)
+//            .flatMap(oldBridge->
+//                Mono.zip(
+//                    bridgeGateway.replaceBridgeServer(oldBridge.getNodeId(),oldBridge.getId(),bridge)
+//                    , bridgeService.save(bridge))
+//                    .flatMap(tp2->bridgeDeviceService.createQuery()
+//                        .where(AliIotBridgeDeviceConfig::getBridgeId,bridge.getId())
+//                        .fetch()
+//                        .flatMap(deviceConfig->
+//                            bridgeGateway.registerDevice(bridge.getNodeId(),bridge.getId(),deviceConfig)
+//                        ).then()
+//                    )
+//            );
     }