Selaa lähdekoodia

add 设置网桥初始值

18339543638 4 vuotta sitten
vanhempi
commit
c01dc61faa

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

@@ -61,7 +61,6 @@ public class AliIotBridgeEntity extends GenericEntity<String>  implements Record
     @Comment("失败原因")
     @Column(name = "error_reason")
     @Schema(description = "失败原因")
-    @Deprecated
     private String errorReason;
 
 

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

@@ -6,6 +6,7 @@ import org.hswebframework.web.logger.ReactiveLogger;
 import org.jetlinks.community.bridge.core.AliBridgeCodec;
 import org.jetlinks.community.bridge.entity.AliIotBridgeEntity;
 import org.jetlinks.community.bridge.message.AliBridgeMessage;
+import org.jetlinks.community.bridge.service.AliBridgeService;
 import org.jetlinks.core.cluster.ClusterManager;
 import org.jetlinks.core.cluster.ClusterService;
 import org.jetlinks.core.device.DeviceRegistry;
@@ -106,6 +107,7 @@ public class AliBridgeGateway extends ClusterService<AliIotBridgeEntity> {
                             return new BusinessException(error.getMessage());
                         }))
             )
+
             .flatMap(AliBridgeServer::refreshAllChannel);
     }
 

+ 29 - 6
jetlinks-manager/bridge-manager/src/main/java/org/jetlinks/community/bridge/server/aliyun/AliBridgeServer.java

@@ -8,6 +8,7 @@ import com.aliyun.iot.as.bridge.core.config.BridgeConfigConsts;
 import com.aliyun.iot.as.bridge.core.handler.DownlinkChannelHandler;
 import com.aliyun.iot.as.bridge.core.model.PopClientConfiguration;
 import com.aliyun.iot.as.bridge.core.model.Session;
+import com.aliyun.openservices.iot.api.exception.IotClientException;
 import lombok.*;
 import lombok.extern.slf4j.Slf4j;
 import org.hswebframework.web.exception.BusinessException;
@@ -15,9 +16,13 @@ import org.jetlinks.community.bridge.core.DefaultBridgeBootstrap;
 import org.jetlinks.community.bridge.core.DefaultBridgeConfigManager;
 import org.jetlinks.community.bridge.core.DefaultDeviceConfigManager;
 import org.jetlinks.community.bridge.core.DefaultUplinkChannelHandler;
+import org.jetlinks.community.bridge.entity.AliIotBridgeDeviceConfig;
 import org.jetlinks.community.bridge.entity.AliIotBridgeEntity;
+import org.jetlinks.community.bridge.enums.BridgeDeviceStatus;
 import org.jetlinks.community.bridge.enums.BridgeStatus;
 import org.jetlinks.community.bridge.message.AliBridgeMessage;
+import org.jetlinks.community.bridge.service.AliBridgeDeviceService;
+import org.jetlinks.community.bridge.service.AliBridgeService;
 import org.jetlinks.core.cluster.AbstractClusterUniqueTask;
 import org.jetlinks.core.cluster.ClusterManager;
 import org.jetlinks.core.device.DeviceOperator;
@@ -63,6 +68,9 @@ public class AliBridgeServer extends AbstractClusterUniqueTask<AliBridgeServer>
 
     private transient AliBridgeGateway bridgeGateway;
 
+    private transient final AliBridgeService bridgeService;
+
+    private transient final AliBridgeDeviceService bridgeDeviceService;
     private AliIotBridgeEntity params;
 
     @Getter
@@ -76,6 +84,8 @@ public class AliBridgeServer extends AbstractClusterUniqueTask<AliBridgeServer>
         this.id=bridge.getId();
         this.params=bridge;
         this.bridgeGateway= SpringUtil.getBean(AliBridgeGateway.class);
+        this.bridgeService=SpringUtil.getBean(AliBridgeService.class);
+        this.bridgeDeviceService=SpringUtil.getBean(AliBridgeDeviceService.class);
     }
 
     public Mono<AliBridgeServer> initBridge(AliIotBridgeEntity params,boolean broadcast){
@@ -114,7 +124,16 @@ public class AliBridgeServer extends AbstractClusterUniqueTask<AliBridgeServer>
                         return false;
                     }
                 });
-            });
+            })
+                .onErrorResume(RuntimeException.class,
+                    e->Mono.just(isReplica())
+                        .filter(Boolean.FALSE::equals)
+                        .flatMap(ignore->
+                            bridgeService.createUpdate().set(AliIotBridgeEntity::getState,BridgeStatus.fail)
+                                .set(AliIotBridgeEntity::getErrorReason,e.getMessage())
+                                .where(AliIotBridgeEntity::getId,id)
+                                .execute()))
+                .then(Mono.just(this));
         }
         return Mono.just(this);
     }
@@ -219,11 +238,15 @@ public class AliBridgeServer extends AbstractClusterUniqueTask<AliBridgeServer>
                     })
                     .thenReturn(channel)
             )
-            .onErrorResume(error->
-                Mono.error(()->{
-                    this.unRegister(originalIdentity,broadcast);
-                    return new BusinessException("请检查deviceName和deviceSecret是否填写正确");
-                }));
+            .onErrorResume(RuntimeException.class,
+                e->Mono.just(isReplica())
+                    .filter(Boolean.FALSE::equals)
+                    .flatMap(ignore->
+                        bridgeDeviceService.createUpdate().set(AliIotBridgeDeviceConfig::getState, BridgeDeviceStatus.fail)
+                            .set(AliIotBridgeDeviceConfig::getErrorReason,e.getMessage())
+                            .where(AliIotBridgeDeviceConfig::getOriginalIdentity,originalIdentity)
+                            .execute()
+                            .then(Mono.empty())));
     }
 
 

+ 13 - 11
jetlinks-manager/bridge-manager/src/main/java/org/jetlinks/community/bridge/web/AliBridgeServerController.java

@@ -24,6 +24,8 @@ import org.jetlinks.core.cluster.ClusterService;
 import org.springframework.web.bind.annotation.*;
 import reactor.core.publisher.Mono;
 
+import java.time.Duration;
+
 /**
  * @author lifang
  * @version 1.0.0
@@ -94,16 +96,11 @@ public class AliBridgeServerController implements
                         .flatMap(existBridge->
                             existBridge.register(id,config.getOriginalIdentity(),config.getProductKey(),
                                 config.getDeviceName(),config.getDeviceSecret(),config.getProductId(),true))
-                        .doOnError(BusinessException.class,
-                            e->
-                                Mono.just(config)
-                                    .doOnNext(device->{
-                                        device.setErrorReason(e.getMessage());
-                                        device.setState(BridgeDeviceStatus.fail);
-                                    })
-                                    .flatMap(bridgeDeviceService::save)))
-                    .onErrorResume(error->Mono.error(new BusinessException(error.getMessage()
-                        .contains("originalidentity")?"平台设备不可重复绑定":"阿里云设备不可重复绑定")))
+                    )
+                    .delayElement(Duration.ofSeconds(5))
+                    .flatMap(ignore->bridgeDeviceService.findById(config.getId()))
+                    .filter(deviceConfig->deviceConfig.getState().eq(BridgeDeviceStatus.fail))
+                    .flatMap(deviceConfig->Mono.error(new BusinessException("网桥注册设备失败,"+deviceConfig.getErrorReason())))
             ).then();
     }
 
@@ -157,7 +154,12 @@ public class AliBridgeServerController implements
         //默认状态为running
         bridge.setState(BridgeStatus.running);
         return bridgeService.save(bridge)
-            .flatMap(ignore->bridgeGateway.replaceBridgeServer(bridge,true))
+            .flatMap(ignore->
+                bridgeGateway.replaceBridgeServer(bridge,true)
+                    .delayElement(Duration.ofSeconds(5))
+                    .flatMap(__->bridgeService.findById(bridge.getId()))
+                    .filter(result->BridgeStatus.fail.eq(result.getState()))
+                    .flatMap(result->Mono.error(new BusinessException("网桥信息有误,"+result.getErrorReason()))))
             .concatWith(bridgeDeviceService.createQuery()
                 .where(AliIotBridgeDeviceConfig::getBridgeId,bridge.getId())
                 .fetch()