Browse Source

first commit

KR0282 2 years ago
commit
c56f057c5d
100 changed files with 7505 additions and 0 deletions
  1. 33 0
      .gitignore
  2. 873 0
      app_log/log/app.err-planeInspection.log
  3. 1635 0
      app_log/log/app.info-planeInspection.log
  4. BIN
      app_log/log/planeInspection.err.2023-02-08.0.log.gz
  5. BIN
      app_log/log/planeInspection.err.2023-02-09.0.log.gz
  6. BIN
      app_log/log/planeInspection.err.2023-02-10.0.log.gz
  7. BIN
      app_log/log/planeInspection.err.2023-02-11.0.log.gz
  8. BIN
      app_log/log/planeInspection.err.2023-02-12.0.log.gz
  9. BIN
      app_log/log/planeInspection.err.2023-02-13.0.log.gz
  10. BIN
      app_log/log/planeInspection.err.2023-02-14.0.log.gz
  11. BIN
      app_log/log/planeInspection.err.2023-02-15.0.log.gz
  12. BIN
      app_log/log/planeInspection.err.2023-02-16.0.log.gz
  13. BIN
      app_log/log/planeInspection.err.2023-02-17.0.log.gz
  14. BIN
      app_log/log/planeInspection.err.2023-02-18.0.log.gz
  15. BIN
      app_log/log/planeInspection.err.2023-02-19.0.log.gz
  16. BIN
      app_log/log/planeInspection.err.2023-02-20.0.log.gz
  17. BIN
      app_log/log/planeInspection.err.2023-02-22.0.log.gz
  18. BIN
      app_log/log/planeInspection.err.2023-02-23.0.log.gz
  19. BIN
      app_log/log/planeInspection.err.2023-02-24.0.log.gz
  20. BIN
      app_log/log/planeInspection.err.2023-02-25.0.log.gz
  21. BIN
      app_log/log/planeInspection.info.2023-02-08.0.log.gz
  22. BIN
      app_log/log/planeInspection.info.2023-02-09.0.log.gz
  23. BIN
      app_log/log/planeInspection.info.2023-02-10.0.log.gz
  24. BIN
      app_log/log/planeInspection.info.2023-02-11.0.log.gz
  25. BIN
      app_log/log/planeInspection.info.2023-02-12.0.log.gz
  26. BIN
      app_log/log/planeInspection.info.2023-02-13.0.log.gz
  27. BIN
      app_log/log/planeInspection.info.2023-02-14.0.log.gz
  28. BIN
      app_log/log/planeInspection.info.2023-02-15.0.log.gz
  29. BIN
      app_log/log/planeInspection.info.2023-02-16.0.log.gz
  30. BIN
      app_log/log/planeInspection.info.2023-02-17.0.log.gz
  31. BIN
      app_log/log/planeInspection.info.2023-02-18.0.log.gz
  32. BIN
      app_log/log/planeInspection.info.2023-02-19.0.log.gz
  33. BIN
      app_log/log/planeInspection.info.2023-02-20.0.log.gz
  34. BIN
      app_log/log/planeInspection.info.2023-02-22.0.log.gz
  35. BIN
      app_log/log/planeInspection.info.2023-02-23.0.log.gz
  36. BIN
      app_log/log/planeInspection.info.2023-02-24.0.log.gz
  37. BIN
      app_log/log/planeInspection.info.2023-02-25.0.log.gz
  38. 316 0
      mvnw
  39. 188 0
      mvnw.cmd
  40. 245 0
      pom.xml
  41. 15 0
      src/main/java/com/keystar/plane/inspection/PlaneInspectionApplication.java
  42. 14 0
      src/main/java/com/keystar/plane/inspection/bo/DateBo.java
  43. 13 0
      src/main/java/com/keystar/plane/inspection/bo/DetectResultBo.java
  44. 38 0
      src/main/java/com/keystar/plane/inspection/bo/Line.java
  45. 36 0
      src/main/java/com/keystar/plane/inspection/bo/Location.java
  46. 23 0
      src/main/java/com/keystar/plane/inspection/bo/NewFileBo.java
  47. 34 0
      src/main/java/com/keystar/plane/inspection/bo/PhotoMqttMessageBo.java
  48. 16 0
      src/main/java/com/keystar/plane/inspection/bo/PlaneInspectionBo.java
  49. 35 0
      src/main/java/com/keystar/plane/inspection/bo/RecognizeMessageBo.java
  50. 20 0
      src/main/java/com/keystar/plane/inspection/bo/ResultBo.java
  51. 13 0
      src/main/java/com/keystar/plane/inspection/bo/TaskMissionRecordBo.java
  52. 37 0
      src/main/java/com/keystar/plane/inspection/config/MinIoConfig.java
  53. 14 0
      src/main/java/com/keystar/plane/inspection/config/PlaneInspectionConfig.java
  54. 10 0
      src/main/java/com/keystar/plane/inspection/config/WebSocketConfig.java
  55. 27 0
      src/main/java/com/keystar/plane/inspection/constant/LocationConstant.java
  56. 8 0
      src/main/java/com/keystar/plane/inspection/constant/PlaneStatusConstant.java
  57. 6 0
      src/main/java/com/keystar/plane/inspection/constant/RedisConstant.java
  58. 16 0
      src/main/java/com/keystar/plane/inspection/constant/UrlConstant.java
  59. 21 0
      src/main/java/com/keystar/plane/inspection/controller/LoginController.java
  60. 53 0
      src/main/java/com/keystar/plane/inspection/controller/NestController.java
  61. 57 0
      src/main/java/com/keystar/plane/inspection/controller/PhotoController.java
  62. 50 0
      src/main/java/com/keystar/plane/inspection/dao/DegreesVo.java
  63. 12 0
      src/main/java/com/keystar/plane/inspection/dao/LoginVo.java
  64. 11 0
      src/main/java/com/keystar/plane/inspection/dao/NestStatusVo.java
  65. 42 0
      src/main/java/com/keystar/plane/inspection/dao/PhotoMessageVo.java
  66. 20 0
      src/main/java/com/keystar/plane/inspection/dao/PlanePhotoVo.java
  67. 61 0
      src/main/java/com/keystar/plane/inspection/entity/PhotoResultEntity.java
  68. 59 0
      src/main/java/com/keystar/plane/inspection/entity/PlanePhotoEntity.java
  69. 107 0
      src/main/java/com/keystar/plane/inspection/enums/NestStatusEnum.java
  70. 36 0
      src/main/java/com/keystar/plane/inspection/enums/ResultEnum.java
  71. 9 0
      src/main/java/com/keystar/plane/inspection/mapper/PhotoResultMapper.java
  72. 10 0
      src/main/java/com/keystar/plane/inspection/mapper/PlanePhotoMapper.java
  73. 46 0
      src/main/java/com/keystar/plane/inspection/mqtt/NestMqttHandler.java
  74. 134 0
      src/main/java/com/keystar/plane/inspection/mqtt/PlaneMqttHandler.java
  75. 81 0
      src/main/java/com/keystar/plane/inspection/mqtt/RecognizeMqttHandler.java
  76. 9 0
      src/main/java/com/keystar/plane/inspection/service/LoginService.java
  77. 33 0
      src/main/java/com/keystar/plane/inspection/service/MqttService.java
  78. 29 0
      src/main/java/com/keystar/plane/inspection/service/NestService.java
  79. 10 0
      src/main/java/com/keystar/plane/inspection/service/PhotoResultService.java
  80. 17 0
      src/main/java/com/keystar/plane/inspection/service/PhotoService.java
  81. 10 0
      src/main/java/com/keystar/plane/inspection/service/PlanePhotoService.java
  82. 18 0
      src/main/java/com/keystar/plane/inspection/service/impl/LoginServiceImpl.java
  83. 131 0
      src/main/java/com/keystar/plane/inspection/service/impl/MinioService.java
  84. 194 0
      src/main/java/com/keystar/plane/inspection/service/impl/MqttServiceImpl.java
  85. 115 0
      src/main/java/com/keystar/plane/inspection/service/impl/NestServiceImpl.java
  86. 13 0
      src/main/java/com/keystar/plane/inspection/service/impl/PhotoResultServiceImpl.java
  87. 104 0
      src/main/java/com/keystar/plane/inspection/service/impl/PhotoServiceImpl.java
  88. 14 0
      src/main/java/com/keystar/plane/inspection/service/impl/PlanePhotoServiceImpl.java
  89. 434 0
      src/main/java/com/keystar/plane/inspection/utils/FileUtil.java
  90. 87 0
      src/main/java/com/keystar/plane/inspection/utils/FileUtils.java
  91. 57 0
      src/main/java/com/keystar/plane/inspection/utils/FtpUtils.java
  92. 744 0
      src/main/java/com/keystar/plane/inspection/utils/GisCheckUtils.java
  93. 132 0
      src/main/java/com/keystar/plane/inspection/utils/HttpUtils.java
  94. 170 0
      src/main/java/com/keystar/plane/inspection/utils/PhotoUtils.java
  95. 170 0
      src/main/java/com/keystar/plane/inspection/utils/RedisUtils.java
  96. 289 0
      src/main/java/com/keystar/plane/inspection/utils/SSHRemoteCall.java
  97. 89 0
      src/main/java/com/keystar/plane/inspection/utils/SSHUtils.java
  98. 50 0
      src/main/java/com/keystar/plane/inspection/utils/Utils.java
  99. 25 0
      src/main/java/com/keystar/plane/inspection/utils/jsonUtil.java
  100. 87 0
      src/main/java/com/keystar/plane/inspection/websocket/BaseWebsocketClient.java

+ 33 - 0
.gitignore

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

+ 873 - 0
app_log/log/app.err-planeInspection.log

@@ -0,0 +1,873 @@
+2023-02-26 15:52:10.394 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+com.alibaba.fastjson.JSONException: can not cast to JSONObject.
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
+	at com.alibaba.fastjson.JSONObject.getJSONObject(JSONObject.java:127)
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:46)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.alibaba.fastjson.JSONObject
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:242)
+	... 8 common frames omitted
+2023-02-26 15:52:53.144 [MQTT Ping: plane-inspection-9062] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-9062: Timed out as no write activity, keepAlive=5,000,000,000 lastOutboundActivity=714,283,495,491,000 lastInboundActivity=714,285,476,608,000 time=714,298,028,497,900 lastPing=714,283,495,497,700
+2023-02-26 15:53:19.727 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+com.alibaba.fastjson.JSONException: can not cast to JSONObject.
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
+	at com.alibaba.fastjson.JSONObject.getJSONObject(JSONObject.java:127)
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:46)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.alibaba.fastjson.JSONObject
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:242)
+	... 8 common frames omitted
+2023-02-26 16:01:06.868 [MQTT Ping: plane-inspection-9062] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-9062: Timed out as no write activity, keepAlive=5,000,000,000 lastOutboundActivity=714,391,264,875,800 lastInboundActivity=714,792,957,058,800 time=714,792,957,056,400 lastPing=714,391,264,879,700
+2023-02-26 16:01:08.277 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+com.alibaba.fastjson.JSONException: can not cast to JSONObject.
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
+	at com.alibaba.fastjson.JSONObject.getJSONObject(JSONObject.java:127)
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:46)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.alibaba.fastjson.JSONObject
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:242)
+	... 8 common frames omitted
+2023-02-26 16:01:52.548 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:01:52.560 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:01:53.048 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:01:53.563 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:01:53.578 [MQTT Call: plane-inspection-9062] ERROR i.n.u.concurrent.DefaultPromise.rejectedExecution - Failed to submit a listener notification task. Event loop shut down?
+java.util.concurrent.RejectedExecutionException: event executor terminated
+	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:846)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:329)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:322)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:757)
+	at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:766)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:423)
+	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:152)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync0(AbstractRedisClient.java:324)
+	at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$0(AbstractRedisClient.java:295)
+	at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:137)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
+	at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:61)
+	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
+	at reactor.core.publisher.Mono.subscribeWith(Mono.java:3954)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3842)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3809)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3781)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync(AbstractRedisClient.java:290)
+	at io.lettuce.core.RedisClient.connectStatefulAsync(RedisClient.java:314)
+	at io.lettuce.core.RedisClient.connectStandaloneAsync(RedisClient.java:271)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:03:03.807 [MQTT Ping: plane-inspection-8395] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-8395: Timed out as no activity, keepAlive=5,000,000,000 lastOutboundActivity=714,879,050,235,000 lastInboundActivity=714,879,050,811,200 time=714,887,167,904,100 lastPing=714,879,050,240,900
+2023-02-26 16:03:03.809 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+com.alibaba.fastjson.JSONException: can not cast to JSONObject.
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
+	at com.alibaba.fastjson.JSONObject.getJSONObject(JSONObject.java:127)
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:46)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.alibaba.fastjson.JSONObject
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:242)
+	... 8 common frames omitted
+2023-02-26 16:03:53.359 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:03:53.469 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:03:53.863 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:03:54.359 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:03:54.362 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:03:54.868 [MQTT Call: plane-inspection-8395] ERROR i.n.u.concurrent.DefaultPromise.rejectedExecution - Failed to submit a listener notification task. Event loop shut down?
+java.util.concurrent.RejectedExecutionException: event executor terminated
+	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:846)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:329)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:322)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:757)
+	at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:766)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:423)
+	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:152)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync0(AbstractRedisClient.java:324)
+	at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$0(AbstractRedisClient.java:295)
+	at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:137)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
+	at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:61)
+	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
+	at reactor.core.publisher.Mono.subscribeWith(Mono.java:3954)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3842)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3809)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3781)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync(AbstractRedisClient.java:290)
+	at io.lettuce.core.RedisClient.connectStatefulAsync(RedisClient.java:314)
+	at io.lettuce.core.RedisClient.connectStandaloneAsync(RedisClient.java:271)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:04:32.548 [MQTT Ping: plane-inspection-301] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-301: Timed out as no write activity, keepAlive=5,000,000,000 lastOutboundActivity=714,986,109,119,700 lastInboundActivity=714,998,634,340,100 time=714,998,634,404,400 lastPing=714,986,109,122,700
+2023-02-26 16:10:01.061 [MQTT Call: plane-inspection-301] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+java.lang.NullPointerException: null
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:53)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:10:01.605 [MQTT Call: plane-inspection-301] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is java.lang.IllegalStateException: Pool not open
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.IllegalStateException: Pool not open
+	at org.apache.commons.pool2.impl.BaseGenericObjectPool.assertOpen(BaseGenericObjectPool.java:713)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:411)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+2023-02-26 16:10:01.606 [MQTT Call: plane-inspection-301] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:11:23.920 [MQTT Ping: plane-inspection-6523] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-6523: Timed out as no activity, keepAlive=5,000,000,000 lastOutboundActivity=715,403,664,433,100 lastInboundActivity=715,402,750,043,700 time=715,410,008,556,500 lastPing=715,403,664,472,900
+2023-02-26 16:12:19.989 [MQTT Call: plane-inspection-6523] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:12:20.000 [MQTT Call: plane-inspection-6523] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:12:20.479 [MQTT Call: plane-inspection-6523] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:12:20.978 [MQTT Call: plane-inspection-6523] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:12:20.989 [MQTT Call: plane-inspection-6523] ERROR i.n.u.concurrent.DefaultPromise.rejectedExecution - Failed to submit a listener notification task. Event loop shut down?
+java.util.concurrent.RejectedExecutionException: event executor terminated
+	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:846)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:329)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:322)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:757)
+	at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:766)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:423)
+	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:152)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync0(AbstractRedisClient.java:324)
+	at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$0(AbstractRedisClient.java:295)
+	at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:137)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
+	at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:61)
+	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
+	at reactor.core.publisher.Mono.subscribeWith(Mono.java:3954)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3842)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3809)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3781)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync(AbstractRedisClient.java:290)
+	at io.lettuce.core.RedisClient.connectStatefulAsync(RedisClient.java:314)
+	at io.lettuce.core.RedisClient.connectStandaloneAsync(RedisClient.java:271)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)

+ 1635 - 0
app_log/log/app.info-planeInspection.log

@@ -0,0 +1,1635 @@
+2023-02-26 15:50:08.929 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$f383b4b4] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 15:50:10.462 [main] INFO  c.a.n.client.config.impl.LocalConfigInfoProcessor - LOCAL_SNAPSHOT_PATH:C:\Users\KR0282\nacos\config
+2023-02-26 15:50:10.488 [main] INFO  com.alibaba.nacos.client.config.impl.Limiter - limitTime:5.0
+2023-02-26 15:50:10.504 [main] INFO  com.alibaba.nacos.client.config.utils.JVMUtil - isMultiInstance:false
+2023-02-26 15:50:10.528 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[plane-inspection] & group[DEFAULT_GROUP]
+2023-02-26 15:50:10.529 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[plane-inspection.properties] & group[DEFAULT_GROUP]
+2023-02-26 15:50:10.531 [main] INFO  o.s.c.b.c.PropertySourceBootstrapConfiguration - Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='plane-inspection.properties,DEFAULT_GROUP'}, NacosPropertySource {name='plane-inspection,DEFAULT_GROUP'}, NacosPropertySource {name='plane-inspection.yaml,config'}]}
+2023-02-26 15:50:10.545 [main] INFO  c.k.plane.inspection.PlaneInspectionApplication - No active profile set, falling back to default profiles: default
+2023-02-26 15:50:11.231 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
+2023-02-26 15:50:11.234 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data repositories in DEFAULT mode.
+2023-02-26 15:50:11.259 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 12ms. Found 0 repository interfaces.
+2023-02-26 15:50:11.576 [main] INFO  o.springframework.cloud.context.scope.GenericScope - BeanFactory id=954a6aab-24c2-306c-a198-36a9fe5278d8
+2023-02-26 15:50:11.644 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$d769b1b7] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 15:50:11.663 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$f383b4b4] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 15:50:11.904 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
+2023-02-26 15:50:11.914 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
+2023-02-26 15:50:11.921 [main] INFO  org.apache.catalina.core.StandardService - Starting service [Tomcat]
+2023-02-26 15:50:11.922 [main] INFO  org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.21]
+2023-02-26 15:50:12.049 [main] INFO  o.a.c.c.C.[Tomcat].[localhost].[/plane-inspection] - Initializing Spring embedded WebApplicationContext
+2023-02-26 15:50:12.049 [main] INFO  org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 1492 ms
+2023-02-26 15:50:12.442 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2023-02-26 15:50:12.739 [main] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
+2023-02-26 15:50:14.175 [main] WARN  com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
+2023-02-26 15:50:14.175 [main] INFO  com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
+2023-02-26 15:50:14.178 [main] WARN  com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
+2023-02-26 15:50:14.179 [main] INFO  com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
+2023-02-26 15:50:14.400 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
+2023-02-26 15:50:15.765 [main] INFO  org.springframework.cloud.commons.util.InetUtils - Cannot determine local hostname
+2023-02-26 15:50:15.774 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Initializing ExecutorService 'Nacso-Watch-Task-Scheduler'
+2023-02-26 15:50:15.782 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Property :null
+2023-02-26 15:50:15.784 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Environment :null
+2023-02-26 15:50:15.785 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Property :null
+2023-02-26 15:50:16.255 [main] INFO  io.lettuce.core.EpollProvider - Starting without optional epoll library
+2023-02-26 15:50:16.256 [main] INFO  io.lettuce.core.KqueueProvider - Starting without optional kqueue library
+2023-02-26 15:50:17.997 [main] INFO  org.springframework.cloud.commons.util.InetUtils - Cannot determine local hostname
+2023-02-26 15:50:18.952 [main] INFO  o.s.s.a.ScheduledAnnotationBeanPostProcessor - No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
+2023-02-26 15:50:18.957 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
+2023-02-26 15:50:18.979 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path '/plane-inspection'
+2023-02-26 15:50:18.983 [main] INFO  com.alibaba.nacos.client.naming - [BEAT] adding beat: {"cluster":"DEFAULT","ip":"10.138.6.171","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":8080,"scheduled":false,"serviceName":"DEFAULT_GROUP@@plane-inspection","stopped":false,"weight":1.0} to beat map.
+2023-02-26 15:50:19.007 [main] INFO  com.alibaba.nacos.client.naming - [REGISTER-SERVICE] edde6fb5-66ed-4c10-991e-188f6576d7b1 registering service DEFAULT_GROUP@@plane-inspection with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ip":"10.138.6.171","ipDeleteTimeout":30000,"metadata":{"preserved.register.source":"SPRING_CLOUD"},"port":8080,"weight":1.0}
+2023-02-26 15:50:19.015 [main] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - nacos registry, DEFAULT_GROUP plane-inspection 10.138.6.171:8080 register finished
+2023-02-26 15:50:19.018 [main] INFO  c.k.plane.inspection.PlaneInspectionApplication - Started PlaneInspectionApplication in 12.159 seconds (JVM running for 13.202)
+2023-02-26 15:50:19.028 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection.yaml+config+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 15:50:19.029 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection.yaml, group=config, cnt=1
+2023-02-26 15:50:19.029 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection.properties+DEFAULT_GROUP+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 15:50:19.030 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection.properties, group=DEFAULT_GROUP, cnt=1
+2023-02-26 15:50:19.030 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection+DEFAULT_GROUP+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 15:50:19.030 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection, group=DEFAULT_GROUP, cnt=1
+2023-02-26 15:50:19.040 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 15:50:21.548 [http-nio-8080-exec-1] INFO  o.a.c.c.C.[Tomcat].[localhost].[/plane-inspection] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2023-02-26 15:50:21.548 [http-nio-8080-exec-1] INFO  org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
+2023-02-26 15:50:21.554 [http-nio-8080-exec-1] INFO  org.springframework.web.servlet.DispatcherServlet - Completed initialization in 6 ms
+2023-02-26 15:50:48.739 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 15:51:18.241 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 15:51:47.743 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 15:52:10.389 [MQTT Call: plane-inspection-9062] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======接收到的识别结果mq: {
+  "data": [{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  },{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  }]
+}
+2023-02-26 15:52:10.394 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+com.alibaba.fastjson.JSONException: can not cast to JSONObject.
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
+	at com.alibaba.fastjson.JSONObject.getJSONObject(JSONObject.java:127)
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:46)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.alibaba.fastjson.JSONObject
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:242)
+	... 8 common frames omitted
+2023-02-26 15:52:17.261 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 15:52:37.405 [MQTT Call: plane-inspection-9062] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======接收到的识别结果mq: {
+  "data": [{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  },{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  }]
+}
+2023-02-26 15:52:51.941 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 15:52:53.144 [MQTT Ping: plane-inspection-9062] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-9062: Timed out as no write activity, keepAlive=5,000,000,000 lastOutboundActivity=714,283,495,491,000 lastInboundActivity=714,285,476,608,000 time=714,298,028,497,900 lastPing=714,283,495,497,700
+2023-02-26 15:52:53.586 [MQTT Ping: plane-inspection-9062] INFO  com.keystar.mqtt.config.AutoSubTopic - 与mqtt服务器:tcp://10.138.6.221:1883掉线
+2023-02-26 15:53:19.727 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+com.alibaba.fastjson.JSONException: can not cast to JSONObject.
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
+	at com.alibaba.fastjson.JSONObject.getJSONObject(JSONObject.java:127)
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:46)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.alibaba.fastjson.JSONObject
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:242)
+	... 8 common frames omitted
+2023-02-26 15:53:22.645 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 15:53:30.057 [MQTT Call: plane-inspection-9062] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/base,服务质量:0
+2023-02-26 15:53:30.058 [MQTT Call: plane-inspection-9062] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/media,服务质量:0
+2023-02-26 15:53:30.058 [MQTT Call: plane-inspection-9062] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:LightSpot_recognize_result,服务质量:0
+2023-02-26 15:53:52.147 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 15:54:21.650 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 15:54:30.069 [MQTT Call: plane-inspection-9062] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======接收到的识别结果mq: {
+  "data": [{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  },{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  }]
+}
+2023-02-26 16:01:06.868 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:01:06.868 [MQTT Ping: plane-inspection-9062] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-9062: Timed out as no write activity, keepAlive=5,000,000,000 lastOutboundActivity=714,391,264,875,800 lastInboundActivity=714,792,957,058,800 time=714,792,957,056,400 lastPing=714,391,264,879,700
+2023-02-26 16:01:08.277 [MQTT Ping: plane-inspection-9062] INFO  com.keystar.mqtt.config.AutoSubTopic - 与mqtt服务器:tcp://10.138.6.221:1883掉线
+2023-02-26 16:01:08.277 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+com.alibaba.fastjson.JSONException: can not cast to JSONObject.
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
+	at com.alibaba.fastjson.JSONObject.getJSONObject(JSONObject.java:127)
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:46)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.alibaba.fastjson.JSONObject
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:242)
+	... 8 common frames omitted
+2023-02-26 16:01:11.882 [com.alibaba.nacos.naming.beat.sender] INFO  com.alibaba.nacos.client.naming - [REGISTER-SERVICE] edde6fb5-66ed-4c10-991e-188f6576d7b1 registering service DEFAULT_GROUP@@plane-inspection with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ip":"10.138.6.171","ipDeleteTimeout":30000,"metadata":{"preserved.register.source":"SPRING_CLOUD"},"port":8080,"serviceName":"DEFAULT_GROUP@@plane-inspection","weight":1.0}
+2023-02-26 16:01:18.643 [MQTT Call: plane-inspection-9062] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/base,服务质量:0
+2023-02-26 16:01:18.645 [MQTT Call: plane-inspection-9062] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/media,服务质量:0
+2023-02-26 16:01:18.645 [MQTT Call: plane-inspection-9062] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:LightSpot_recognize_result,服务质量:0
+2023-02-26 16:01:37.798 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:01:52.278 [Thread-42] INFO  o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Shutting down ExecutorService 'Nacso-Watch-Task-Scheduler'
+2023-02-26 16:01:52.280 [Thread-42] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - De-registering from Nacos Server now...
+2023-02-26 16:01:52.280 [Thread-42] INFO  com.alibaba.nacos.client.naming - [BEAT] removing beat: DEFAULT_GROUP@@plane-inspection:10.138.6.171:8080 from beat map.
+2023-02-26 16:01:52.280 [Thread-42] INFO  com.alibaba.nacos.client.naming - [DEREGISTER-SERVICE] edde6fb5-66ed-4c10-991e-188f6576d7b1 deregistering service DEFAULT_GROUP@@plane-inspection with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"instanceIdGenerator":"simple","ip":"10.138.6.171","ipDeleteTimeout":30000,"metadata":{},"port":8080,"weight":1.0}
+2023-02-26 16:01:52.282 [Thread-42] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - De-registration finished.
+2023-02-26 16:01:52.282 [Thread-42] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'
+2023-02-26 16:01:52.288 [Thread-42] INFO  o.s.beans.factory.support.DisposableBeanAdapter - Destroy method 'close' on bean with name 'mqttAsyncClient' threw an exception: 已连接客户机 (32100)
+2023-02-26 16:01:52.298 [Thread-42] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
+2023-02-26 16:01:52.548 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:01:52.560 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:01:53.048 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:01:53.563 [MQTT Call: plane-inspection-9062] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:01:53.577 [MQTT Call: plane-inspection-9062] WARN  io.netty.channel.AbstractChannel - Force-closing a channel whose registration task was not accepted by an event loop: [id: 0x4db89ae9]
+java.util.concurrent.RejectedExecutionException: event executor terminated
+	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:846)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:329)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:322)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:757)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:484)
+	at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:80)
+	at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:74)
+	at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:86)
+	at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:333)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:163)
+	at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:145)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync0(AbstractRedisClient.java:314)
+	at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$0(AbstractRedisClient.java:295)
+	at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:137)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
+	at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:61)
+	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
+	at reactor.core.publisher.Mono.subscribeWith(Mono.java:3954)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3842)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3809)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3781)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync(AbstractRedisClient.java:290)
+	at io.lettuce.core.RedisClient.connectStatefulAsync(RedisClient.java:314)
+	at io.lettuce.core.RedisClient.connectStandaloneAsync(RedisClient.java:271)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:01:53.578 [MQTT Call: plane-inspection-9062] ERROR i.n.u.concurrent.DefaultPromise.rejectedExecution - Failed to submit a listener notification task. Event loop shut down?
+java.util.concurrent.RejectedExecutionException: event executor terminated
+	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:846)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:329)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:322)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:757)
+	at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:766)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:423)
+	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:152)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync0(AbstractRedisClient.java:324)
+	at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$0(AbstractRedisClient.java:295)
+	at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:137)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
+	at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:61)
+	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
+	at reactor.core.publisher.Mono.subscribeWith(Mono.java:3954)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3842)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3809)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3781)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync(AbstractRedisClient.java:290)
+	at io.lettuce.core.RedisClient.connectStatefulAsync(RedisClient.java:314)
+	at io.lettuce.core.RedisClient.connectStandaloneAsync(RedisClient.java:271)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:02:02.487 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$1ce2deb9] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 16:02:04.095 [main] INFO  c.a.n.client.config.impl.LocalConfigInfoProcessor - LOCAL_SNAPSHOT_PATH:C:\Users\KR0282\nacos\config
+2023-02-26 16:02:04.121 [main] INFO  com.alibaba.nacos.client.config.impl.Limiter - limitTime:5.0
+2023-02-26 16:02:04.140 [main] INFO  com.alibaba.nacos.client.config.utils.JVMUtil - isMultiInstance:false
+2023-02-26 16:02:04.149 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[plane-inspection] & group[DEFAULT_GROUP]
+2023-02-26 16:02:04.153 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[plane-inspection.properties] & group[DEFAULT_GROUP]
+2023-02-26 16:02:04.153 [main] INFO  o.s.c.b.c.PropertySourceBootstrapConfiguration - Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='plane-inspection.properties,DEFAULT_GROUP'}, NacosPropertySource {name='plane-inspection,DEFAULT_GROUP'}, NacosPropertySource {name='plane-inspection.yaml,config'}]}
+2023-02-26 16:02:04.169 [main] INFO  c.k.plane.inspection.PlaneInspectionApplication - No active profile set, falling back to default profiles: default
+2023-02-26 16:02:04.794 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
+2023-02-26 16:02:04.808 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data repositories in DEFAULT mode.
+2023-02-26 16:02:04.834 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 12ms. Found 0 repository interfaces.
+2023-02-26 16:02:05.138 [main] INFO  o.springframework.cloud.context.scope.GenericScope - BeanFactory id=954a6aab-24c2-306c-a198-36a9fe5278d8
+2023-02-26 16:02:05.194 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$c8dbbc] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 16:02:05.209 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$1ce2deb9] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 16:02:05.417 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
+2023-02-26 16:02:05.431 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
+2023-02-26 16:02:05.439 [main] INFO  org.apache.catalina.core.StandardService - Starting service [Tomcat]
+2023-02-26 16:02:05.439 [main] INFO  org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.21]
+2023-02-26 16:02:05.557 [main] INFO  o.a.c.c.C.[Tomcat].[localhost].[/plane-inspection] - Initializing Spring embedded WebApplicationContext
+2023-02-26 16:02:05.557 [main] INFO  org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 1374 ms
+2023-02-26 16:02:05.994 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2023-02-26 16:02:06.390 [main] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
+2023-02-26 16:02:07.757 [main] WARN  com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
+2023-02-26 16:02:07.758 [main] INFO  com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
+2023-02-26 16:02:07.764 [main] WARN  com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
+2023-02-26 16:02:07.765 [main] INFO  com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
+2023-02-26 16:02:07.981 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
+2023-02-26 16:02:09.351 [main] INFO  org.springframework.cloud.commons.util.InetUtils - Cannot determine local hostname
+2023-02-26 16:02:09.361 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Initializing ExecutorService 'Nacso-Watch-Task-Scheduler'
+2023-02-26 16:02:09.369 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Property :null
+2023-02-26 16:02:09.371 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Environment :null
+2023-02-26 16:02:09.371 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Property :null
+2023-02-26 16:02:09.838 [main] INFO  io.lettuce.core.EpollProvider - Starting without optional epoll library
+2023-02-26 16:02:09.841 [main] INFO  io.lettuce.core.KqueueProvider - Starting without optional kqueue library
+2023-02-26 16:02:11.698 [main] INFO  org.springframework.cloud.commons.util.InetUtils - Cannot determine local hostname
+2023-02-26 16:02:12.424 [main] INFO  o.s.s.a.ScheduledAnnotationBeanPostProcessor - No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
+2023-02-26 16:02:12.429 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
+2023-02-26 16:02:12.449 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path '/plane-inspection'
+2023-02-26 16:02:12.451 [main] INFO  com.alibaba.nacos.client.naming - [BEAT] adding beat: {"cluster":"DEFAULT","ip":"10.138.6.171","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":8080,"scheduled":false,"serviceName":"DEFAULT_GROUP@@plane-inspection","stopped":false,"weight":1.0} to beat map.
+2023-02-26 16:02:12.476 [main] INFO  com.alibaba.nacos.client.naming - [REGISTER-SERVICE] edde6fb5-66ed-4c10-991e-188f6576d7b1 registering service DEFAULT_GROUP@@plane-inspection with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ip":"10.138.6.171","ipDeleteTimeout":30000,"metadata":{"preserved.register.source":"SPRING_CLOUD"},"port":8080,"weight":1.0}
+2023-02-26 16:02:12.482 [main] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - nacos registry, DEFAULT_GROUP plane-inspection 10.138.6.171:8080 register finished
+2023-02-26 16:02:12.484 [main] INFO  c.k.plane.inspection.PlaneInspectionApplication - Started PlaneInspectionApplication in 12.137 seconds (JVM running for 13.124)
+2023-02-26 16:02:12.488 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection.yaml+config+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 16:02:12.490 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection.yaml, group=config, cnt=1
+2023-02-26 16:02:12.490 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection.properties+DEFAULT_GROUP+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 16:02:12.490 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection.properties, group=DEFAULT_GROUP, cnt=1
+2023-02-26 16:02:12.490 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection+DEFAULT_GROUP+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 16:02:12.491 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection, group=DEFAULT_GROUP, cnt=1
+2023-02-26 16:02:12.499 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:02:21.538 [http-nio-8080-exec-3] INFO  o.a.c.c.C.[Tomcat].[localhost].[/plane-inspection] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2023-02-26 16:02:21.538 [http-nio-8080-exec-3] INFO  org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
+2023-02-26 16:02:21.546 [http-nio-8080-exec-3] INFO  org.springframework.web.servlet.DispatcherServlet - Completed initialization in 8 ms
+2023-02-26 16:02:32.959 [MQTT Call: plane-inspection-8395] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======接收到的识别结果mq: {
+  "data": [{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  },{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  }]
+}
+2023-02-26 16:03:03.806 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:03:03.807 [MQTT Ping: plane-inspection-8395] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-8395: Timed out as no activity, keepAlive=5,000,000,000 lastOutboundActivity=714,879,050,235,000 lastInboundActivity=714,879,050,811,200 time=714,887,167,904,100 lastPing=714,879,050,240,900
+2023-02-26 16:03:03.809 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+com.alibaba.fastjson.JSONException: can not cast to JSONObject.
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
+	at com.alibaba.fastjson.JSONObject.getJSONObject(JSONObject.java:127)
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:46)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.alibaba.fastjson.JSONObject
+	at com.alibaba.fastjson.JSON.parseObject(JSON.java:242)
+	... 8 common frames omitted
+2023-02-26 16:03:03.812 [MQTT Ping: plane-inspection-8395] INFO  com.keystar.mqtt.config.AutoSubTopic - 与mqtt服务器:tcp://10.138.6.221:1883掉线
+2023-02-26 16:03:14.151 [MQTT Call: plane-inspection-8395] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/base,服务质量:0
+2023-02-26 16:03:14.151 [MQTT Call: plane-inspection-8395] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/media,服务质量:0
+2023-02-26 16:03:14.151 [MQTT Call: plane-inspection-8395] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:LightSpot_recognize_result,服务质量:0
+2023-02-26 16:03:33.308 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:03:53.325 [Thread-42] INFO  o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Shutting down ExecutorService 'Nacso-Watch-Task-Scheduler'
+2023-02-26 16:03:53.328 [Thread-42] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - De-registering from Nacos Server now...
+2023-02-26 16:03:53.328 [Thread-42] INFO  com.alibaba.nacos.client.naming - [BEAT] removing beat: DEFAULT_GROUP@@plane-inspection:10.138.6.171:8080 from beat map.
+2023-02-26 16:03:53.329 [Thread-42] INFO  com.alibaba.nacos.client.naming - [DEREGISTER-SERVICE] edde6fb5-66ed-4c10-991e-188f6576d7b1 deregistering service DEFAULT_GROUP@@plane-inspection with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"instanceIdGenerator":"simple","ip":"10.138.6.171","ipDeleteTimeout":30000,"metadata":{},"port":8080,"weight":1.0}
+2023-02-26 16:03:53.332 [Thread-42] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - De-registration finished.
+2023-02-26 16:03:53.332 [Thread-42] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'
+2023-02-26 16:03:53.339 [Thread-42] INFO  o.s.beans.factory.support.DisposableBeanAdapter - Destroy method 'close' on bean with name 'mqttAsyncClient' threw an exception: 已连接客户机 (32100)
+2023-02-26 16:03:53.345 [Thread-42] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
+2023-02-26 16:03:53.359 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:03:53.469 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:03:53.863 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:03:54.359 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:03:54.362 [MQTT Call: plane-inspection-8395] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:03:54.868 [MQTT Call: plane-inspection-8395] WARN  io.netty.channel.AbstractChannel - Force-closing a channel whose registration task was not accepted by an event loop: [id: 0xf5d5c15d]
+java.util.concurrent.RejectedExecutionException: event executor terminated
+	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:846)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:329)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:322)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:757)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:484)
+	at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:80)
+	at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:74)
+	at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:86)
+	at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:333)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:163)
+	at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:145)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync0(AbstractRedisClient.java:314)
+	at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$0(AbstractRedisClient.java:295)
+	at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:137)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
+	at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:61)
+	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
+	at reactor.core.publisher.Mono.subscribeWith(Mono.java:3954)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3842)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3809)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3781)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync(AbstractRedisClient.java:290)
+	at io.lettuce.core.RedisClient.connectStatefulAsync(RedisClient.java:314)
+	at io.lettuce.core.RedisClient.connectStandaloneAsync(RedisClient.java:271)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:03:54.868 [MQTT Call: plane-inspection-8395] ERROR i.n.u.concurrent.DefaultPromise.rejectedExecution - Failed to submit a listener notification task. Event loop shut down?
+java.util.concurrent.RejectedExecutionException: event executor terminated
+	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:846)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:329)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:322)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:757)
+	at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:766)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:423)
+	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:152)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync0(AbstractRedisClient.java:324)
+	at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$0(AbstractRedisClient.java:295)
+	at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:137)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
+	at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:61)
+	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
+	at reactor.core.publisher.Mono.subscribeWith(Mono.java:3954)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3842)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3809)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3781)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync(AbstractRedisClient.java:290)
+	at io.lettuce.core.RedisClient.connectStatefulAsync(RedisClient.java:314)
+	at io.lettuce.core.RedisClient.connectStandaloneAsync(RedisClient.java:271)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:04:03.192 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$70436f53] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 16:04:04.770 [main] INFO  c.a.n.client.config.impl.LocalConfigInfoProcessor - LOCAL_SNAPSHOT_PATH:C:\Users\KR0282\nacos\config
+2023-02-26 16:04:04.797 [main] INFO  com.alibaba.nacos.client.config.impl.Limiter - limitTime:5.0
+2023-02-26 16:04:04.812 [main] INFO  com.alibaba.nacos.client.config.utils.JVMUtil - isMultiInstance:false
+2023-02-26 16:04:04.822 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[plane-inspection] & group[DEFAULT_GROUP]
+2023-02-26 16:04:04.825 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[plane-inspection.properties] & group[DEFAULT_GROUP]
+2023-02-26 16:04:04.825 [main] INFO  o.s.c.b.c.PropertySourceBootstrapConfiguration - Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='plane-inspection.properties,DEFAULT_GROUP'}, NacosPropertySource {name='plane-inspection,DEFAULT_GROUP'}, NacosPropertySource {name='plane-inspection.yaml,config'}]}
+2023-02-26 16:04:04.841 [main] INFO  c.k.plane.inspection.PlaneInspectionApplication - No active profile set, falling back to default profiles: default
+2023-02-26 16:04:05.452 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
+2023-02-26 16:04:05.454 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data repositories in DEFAULT mode.
+2023-02-26 16:04:05.480 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 14ms. Found 0 repository interfaces.
+2023-02-26 16:04:05.750 [main] INFO  o.springframework.cloud.context.scope.GenericScope - BeanFactory id=954a6aab-24c2-306c-a198-36a9fe5278d8
+2023-02-26 16:04:05.817 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$54296c56] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 16:04:05.833 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$70436f53] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 16:04:06.095 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
+2023-02-26 16:04:06.116 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
+2023-02-26 16:04:06.125 [main] INFO  org.apache.catalina.core.StandardService - Starting service [Tomcat]
+2023-02-26 16:04:06.125 [main] INFO  org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.21]
+2023-02-26 16:04:06.261 [main] INFO  o.a.c.c.C.[Tomcat].[localhost].[/plane-inspection] - Initializing Spring embedded WebApplicationContext
+2023-02-26 16:04:06.262 [main] INFO  org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 1414 ms
+2023-02-26 16:04:06.681 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2023-02-26 16:04:06.947 [main] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
+2023-02-26 16:04:08.269 [main] WARN  com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
+2023-02-26 16:04:08.269 [main] INFO  com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
+2023-02-26 16:04:08.275 [main] WARN  com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
+2023-02-26 16:04:08.275 [main] INFO  com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
+2023-02-26 16:04:08.473 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
+2023-02-26 16:04:09.812 [main] INFO  org.springframework.cloud.commons.util.InetUtils - Cannot determine local hostname
+2023-02-26 16:04:09.822 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Initializing ExecutorService 'Nacso-Watch-Task-Scheduler'
+2023-02-26 16:04:09.830 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Property :null
+2023-02-26 16:04:09.831 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Environment :null
+2023-02-26 16:04:09.831 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Property :null
+2023-02-26 16:04:10.269 [main] INFO  io.lettuce.core.EpollProvider - Starting without optional epoll library
+2023-02-26 16:04:10.271 [main] INFO  io.lettuce.core.KqueueProvider - Starting without optional kqueue library
+2023-02-26 16:04:11.928 [main] INFO  org.springframework.cloud.commons.util.InetUtils - Cannot determine local hostname
+2023-02-26 16:04:12.847 [main] INFO  o.s.s.a.ScheduledAnnotationBeanPostProcessor - No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
+2023-02-26 16:04:12.851 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
+2023-02-26 16:04:12.871 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path '/plane-inspection'
+2023-02-26 16:04:12.875 [main] INFO  com.alibaba.nacos.client.naming - [BEAT] adding beat: {"cluster":"DEFAULT","ip":"10.138.6.171","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":8080,"scheduled":false,"serviceName":"DEFAULT_GROUP@@plane-inspection","stopped":false,"weight":1.0} to beat map.
+2023-02-26 16:04:12.895 [main] INFO  com.alibaba.nacos.client.naming - [REGISTER-SERVICE] edde6fb5-66ed-4c10-991e-188f6576d7b1 registering service DEFAULT_GROUP@@plane-inspection with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ip":"10.138.6.171","ipDeleteTimeout":30000,"metadata":{"preserved.register.source":"SPRING_CLOUD"},"port":8080,"weight":1.0}
+2023-02-26 16:04:12.905 [main] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - nacos registry, DEFAULT_GROUP plane-inspection 10.138.6.171:8080 register finished
+2023-02-26 16:04:12.907 [main] INFO  c.k.plane.inspection.PlaneInspectionApplication - Started PlaneInspectionApplication in 11.788 seconds (JVM running for 12.611)
+2023-02-26 16:04:12.910 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection.yaml+config+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 16:04:12.912 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection.yaml, group=config, cnt=1
+2023-02-26 16:04:12.912 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection.properties+DEFAULT_GROUP+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 16:04:12.912 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection.properties, group=DEFAULT_GROUP, cnt=1
+2023-02-26 16:04:12.913 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection+DEFAULT_GROUP+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 16:04:12.913 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection, group=DEFAULT_GROUP, cnt=1
+2023-02-26 16:04:12.916 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:04:21.587 [http-nio-8080-exec-2] INFO  o.a.c.c.C.[Tomcat].[localhost].[/plane-inspection] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2023-02-26 16:04:21.588 [http-nio-8080-exec-2] INFO  org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
+2023-02-26 16:04:21.598 [http-nio-8080-exec-2] INFO  org.springframework.web.servlet.DispatcherServlet - Completed initialization in 10 ms
+2023-02-26 16:04:32.548 [MQTT Ping: plane-inspection-301] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-301: Timed out as no write activity, keepAlive=5,000,000,000 lastOutboundActivity=714,986,109,119,700 lastInboundActivity=714,998,634,340,100 time=714,998,634,404,400 lastPing=714,986,109,122,700
+2023-02-26 16:04:32.548 [MQTT Call: plane-inspection-301] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======接收到的识别结果mq: {
+  "data": [{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  },{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  }]
+}
+2023-02-26 16:04:33.784 [MQTT Ping: plane-inspection-301] INFO  com.keystar.mqtt.config.AutoSubTopic - 与mqtt服务器:tcp://10.138.6.221:1883掉线
+2023-02-26 16:10:01.054 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:10:01.061 [MQTT Call: plane-inspection-301] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+java.lang.NullPointerException: null
+	at com.keystar.plane.inspection.mqtt.RecognizeMqttHandler.handle(RecognizeMqttHandler.java:53)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:10:01.418 [MQTT Call: plane-inspection-301] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/base,服务质量:0
+2023-02-26 16:10:01.419 [MQTT Call: plane-inspection-301] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/media,服务质量:0
+2023-02-26 16:10:01.419 [MQTT Call: plane-inspection-301] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:LightSpot_recognize_result,服务质量:0
+2023-02-26 16:10:01.578 [Thread-42] INFO  o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Shutting down ExecutorService 'Nacso-Watch-Task-Scheduler'
+2023-02-26 16:10:01.581 [Thread-42] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - De-registering from Nacos Server now...
+2023-02-26 16:10:01.581 [Thread-42] INFO  com.alibaba.nacos.client.naming - [BEAT] removing beat: DEFAULT_GROUP@@plane-inspection:10.138.6.171:8080 from beat map.
+2023-02-26 16:10:01.581 [Thread-42] INFO  com.alibaba.nacos.client.naming - [DEREGISTER-SERVICE] edde6fb5-66ed-4c10-991e-188f6576d7b1 deregistering service DEFAULT_GROUP@@plane-inspection with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"instanceIdGenerator":"simple","ip":"10.138.6.171","ipDeleteTimeout":30000,"metadata":{},"port":8080,"weight":1.0}
+2023-02-26 16:10:01.585 [Thread-42] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - De-registration finished.
+2023-02-26 16:10:01.585 [Thread-42] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'
+2023-02-26 16:10:01.592 [Thread-42] INFO  o.s.beans.factory.support.DisposableBeanAdapter - Destroy method 'close' on bean with name 'mqttAsyncClient' threw an exception: 已连接客户机 (32100)
+2023-02-26 16:10:01.600 [Thread-42] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
+2023-02-26 16:10:01.605 [MQTT Call: plane-inspection-301] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is java.lang.IllegalStateException: Pool not open
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: java.lang.IllegalStateException: Pool not open
+	at org.apache.commons.pool2.impl.BaseGenericObjectPool.assertOpen(BaseGenericObjectPool.java:713)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:411)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+2023-02-26 16:10:01.606 [MQTT Call: plane-inspection-301] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:10:10.415 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$44e04d43] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 16:10:11.901 [main] INFO  c.a.n.client.config.impl.LocalConfigInfoProcessor - LOCAL_SNAPSHOT_PATH:C:\Users\KR0282\nacos\config
+2023-02-26 16:10:11.925 [main] INFO  com.alibaba.nacos.client.config.impl.Limiter - limitTime:5.0
+2023-02-26 16:10:11.942 [main] INFO  com.alibaba.nacos.client.config.utils.JVMUtil - isMultiInstance:false
+2023-02-26 16:10:11.952 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[plane-inspection] & group[DEFAULT_GROUP]
+2023-02-26 16:10:11.955 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[plane-inspection.properties] & group[DEFAULT_GROUP]
+2023-02-26 16:10:11.956 [main] INFO  o.s.c.b.c.PropertySourceBootstrapConfiguration - Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='plane-inspection.properties,DEFAULT_GROUP'}, NacosPropertySource {name='plane-inspection,DEFAULT_GROUP'}, NacosPropertySource {name='plane-inspection.yaml,config'}]}
+2023-02-26 16:10:11.972 [main] INFO  c.k.plane.inspection.PlaneInspectionApplication - No active profile set, falling back to default profiles: default
+2023-02-26 16:10:12.587 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
+2023-02-26 16:10:12.590 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data repositories in DEFAULT mode.
+2023-02-26 16:10:12.615 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 14ms. Found 0 repository interfaces.
+2023-02-26 16:10:12.873 [main] INFO  o.springframework.cloud.context.scope.GenericScope - BeanFactory id=954a6aab-24c2-306c-a198-36a9fe5278d8
+2023-02-26 16:10:12.938 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$28c64a46] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 16:10:12.952 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$44e04d43] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2023-02-26 16:10:13.165 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
+2023-02-26 16:10:13.179 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
+2023-02-26 16:10:13.187 [main] INFO  org.apache.catalina.core.StandardService - Starting service [Tomcat]
+2023-02-26 16:10:13.187 [main] INFO  org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.21]
+2023-02-26 16:10:13.305 [main] INFO  o.a.c.c.C.[Tomcat].[localhost].[/plane-inspection] - Initializing Spring embedded WebApplicationContext
+2023-02-26 16:10:13.305 [main] INFO  org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 1323 ms
+2023-02-26 16:10:13.707 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2023-02-26 16:10:13.965 [main] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
+2023-02-26 16:10:15.293 [main] WARN  com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
+2023-02-26 16:10:15.293 [main] INFO  com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
+2023-02-26 16:10:15.297 [main] WARN  com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
+2023-02-26 16:10:15.297 [main] INFO  com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
+2023-02-26 16:10:15.506 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
+2023-02-26 16:10:16.846 [main] INFO  org.springframework.cloud.commons.util.InetUtils - Cannot determine local hostname
+2023-02-26 16:10:16.855 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Initializing ExecutorService 'Nacso-Watch-Task-Scheduler'
+2023-02-26 16:10:16.864 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Property :null
+2023-02-26 16:10:16.865 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Environment :null
+2023-02-26 16:10:16.865 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Property :null
+2023-02-26 16:10:17.306 [main] INFO  io.lettuce.core.EpollProvider - Starting without optional epoll library
+2023-02-26 16:10:17.307 [main] INFO  io.lettuce.core.KqueueProvider - Starting without optional kqueue library
+2023-02-26 16:10:19.057 [main] INFO  org.springframework.cloud.commons.util.InetUtils - Cannot determine local hostname
+2023-02-26 16:10:19.785 [main] INFO  o.s.s.a.ScheduledAnnotationBeanPostProcessor - No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
+2023-02-26 16:10:19.789 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
+2023-02-26 16:10:19.809 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path '/plane-inspection'
+2023-02-26 16:10:19.812 [main] INFO  com.alibaba.nacos.client.naming - [BEAT] adding beat: {"cluster":"DEFAULT","ip":"10.138.6.171","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":8080,"scheduled":false,"serviceName":"DEFAULT_GROUP@@plane-inspection","stopped":false,"weight":1.0} to beat map.
+2023-02-26 16:10:19.833 [main] INFO  com.alibaba.nacos.client.naming - [REGISTER-SERVICE] edde6fb5-66ed-4c10-991e-188f6576d7b1 registering service DEFAULT_GROUP@@plane-inspection with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ip":"10.138.6.171","ipDeleteTimeout":30000,"metadata":{"preserved.register.source":"SPRING_CLOUD"},"port":8080,"weight":1.0}
+2023-02-26 16:10:19.840 [main] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - nacos registry, DEFAULT_GROUP plane-inspection 10.138.6.171:8080 register finished
+2023-02-26 16:10:19.842 [main] INFO  c.k.plane.inspection.PlaneInspectionApplication - Started PlaneInspectionApplication in 11.425 seconds (JVM running for 12.226)
+2023-02-26 16:10:19.845 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection.yaml+config+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 16:10:19.847 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection.yaml, group=config, cnt=1
+2023-02-26 16:10:19.848 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection.properties+DEFAULT_GROUP+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 16:10:19.848 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection.properties, group=DEFAULT_GROUP, cnt=1
+2023-02-26 16:10:19.848 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [subscribe] plane-inspection+DEFAULT_GROUP+edde6fb5-66ed-4c10-991e-188f6576d7b1
+2023-02-26 16:10:19.848 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] [add-listener] ok, tenant=edde6fb5-66ed-4c10-991e-188f6576d7b1, dataId=plane-inspection, group=DEFAULT_GROUP, cnt=1
+2023-02-26 16:10:19.855 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:10:21.600 [http-nio-8080-exec-2] INFO  o.a.c.c.C.[Tomcat].[localhost].[/plane-inspection] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2023-02-26 16:10:21.600 [http-nio-8080-exec-2] INFO  org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
+2023-02-26 16:10:21.606 [http-nio-8080-exec-2] INFO  org.springframework.web.servlet.DispatcherServlet - Completed initialization in 6 ms
+2023-02-26 16:10:49.555 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:11:14.426 [MQTT Call: plane-inspection-6523] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======接收到的识别结果mq: {
+  "data": [{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  },{
+    "id":"123",
+    "funcIndex":["1", "0", "0"],
+    "visibleImagePath":"",
+    "infraredImagePath": "testImages/image/000569.jpg",
+    "detectResult":[{
+      "arrayIndex":"3",
+      "rowIndex":"13",
+      "columnIndex":"1",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    },{
+      "arrayIndex":"4",
+      "rowIndex":"14",
+      "columnIndex":"2",
+      "result":{
+        "type":"diodeFault",
+        "coordinates":[249, 201, 257, 236]
+      }
+    }]
+  }]
+}
+2023-02-26 16:11:19.204 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:11:20.587 [MQTT Call: plane-inspection-6523] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======识别结果入库:PhotoResultEntity(id=1629755973507010560, photoId=123, path=, arrayIndex=3, rowIndex=13, columnIndex=1, type=diodeFault, coordinates=249,201,257,236)
+2023-02-26 16:11:21.536 [MQTT Call: plane-inspection-6523] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======识别结果入库:PhotoResultEntity(id=1629755987742478336, photoId=123, path=, arrayIndex=4, rowIndex=14, columnIndex=2, type=diodeFault, coordinates=249,201,257,236)
+2023-02-26 16:11:23.919 [MQTT Call: plane-inspection-6523] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======识别结果入库:PhotoResultEntity(id=1629755997737504768, photoId=123, path=, arrayIndex=3, rowIndex=13, columnIndex=1, type=diodeFault, coordinates=249,201,257,236)
+2023-02-26 16:11:23.920 [MQTT Ping: plane-inspection-6523] ERROR o.eclipse.paho.client.mqttv3.internal.ClientState - plane-inspection-6523: Timed out as no activity, keepAlive=5,000,000,000 lastOutboundActivity=715,403,664,433,100 lastInboundActivity=715,402,750,043,700 time=715,410,008,556,500 lastPing=715,403,664,472,900
+2023-02-26 16:11:23.922 [MQTT Ping: plane-inspection-6523] INFO  com.keystar.mqtt.config.AutoSubTopic - 与mqtt服务器:tcp://10.138.6.221:1883掉线
+2023-02-26 16:11:23.928 [MQTT Call: plane-inspection-6523] INFO  c.k.plane.inspection.mqtt.RecognizeMqttHandler - ======识别结果入库:PhotoResultEntity(id=1629755997775253504, photoId=123, path=, arrayIndex=4, rowIndex=14, columnIndex=2, type=diodeFault, coordinates=249,201,257,236)
+2023-02-26 16:11:34.257 [MQTT Call: plane-inspection-6523] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/base,服务质量:0
+2023-02-26 16:11:34.257 [MQTT Call: plane-inspection-6523] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/media,服务质量:0
+2023-02-26 16:11:34.257 [MQTT Call: plane-inspection-6523] INFO  com.keystar.mqtt.config.AutoSubTopic - 重新连接后,订阅主题:LightSpot_recognize_result,服务质量:0
+2023-02-26 16:11:49.765 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:12:19.267 [com.alibaba.nacos.client.Worker.longPolling.fixed-10.138.6.221_8848-edde6fb5-66ed-4c10-991e-188f6576d7b1] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
+2023-02-26 16:12:19.618 [Thread-41] INFO  o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Shutting down ExecutorService 'Nacso-Watch-Task-Scheduler'
+2023-02-26 16:12:19.619 [Thread-41] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - De-registering from Nacos Server now...
+2023-02-26 16:12:19.621 [Thread-41] INFO  com.alibaba.nacos.client.naming - [BEAT] removing beat: DEFAULT_GROUP@@plane-inspection:10.138.6.171:8080 from beat map.
+2023-02-26 16:12:19.621 [Thread-41] INFO  com.alibaba.nacos.client.naming - [DEREGISTER-SERVICE] edde6fb5-66ed-4c10-991e-188f6576d7b1 deregistering service DEFAULT_GROUP@@plane-inspection with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"instanceIdGenerator":"simple","ip":"10.138.6.171","ipDeleteTimeout":30000,"metadata":{},"port":8080,"weight":1.0}
+2023-02-26 16:12:19.623 [Thread-41] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - De-registration finished.
+2023-02-26 16:12:19.624 [Thread-41] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'
+2023-02-26 16:12:19.631 [Thread-41] INFO  o.s.beans.factory.support.DisposableBeanAdapter - Destroy method 'close' on bean with name 'mqttAsyncClient' threw an exception: 已连接客户机 (32100)
+2023-02-26 16:12:19.639 [Thread-41] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
+2023-02-26 16:12:19.989 [MQTT Call: plane-inspection-6523] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:12:20.000 [MQTT Call: plane-inspection-6523] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:12:20.479 [MQTT Call: plane-inspection-6523] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:86)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to 10.138.6.221:6379
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78)
+	at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56)
+	at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:235)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	... 19 common frames omitted
+Caused by: java.lang.IllegalStateException: executor not accepting a task
+	at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:200)
+	at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188)
+	at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174)
+	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:502)
+	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:476)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:415)
+	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:540)
+	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:529)
+	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:101)
+	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1009)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:517)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:487)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
+	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:405)
+	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
+	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
+	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
+	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	... 1 common frames omitted
+2023-02-26 16:12:20.978 [MQTT Call: plane-inspection-6523] ERROR com.keystar.mqtt.processor.MessageHandleService - 处理mqtt消息出错:{}
+org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'planeMqttHandler': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1119)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:411)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:344)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
+	at com.keystar.mqtt.handler.HandlerContext.getInstance(HandlerContext.java:28)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:38)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:12:20.988 [MQTT Call: plane-inspection-6523] WARN  io.netty.channel.AbstractChannel - Force-closing a channel whose registration task was not accepted by an event loop: [id: 0x4b3b7c33]
+java.util.concurrent.RejectedExecutionException: event executor terminated
+	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:846)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:329)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:322)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:757)
+	at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:484)
+	at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:80)
+	at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:74)
+	at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:86)
+	at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:333)
+	at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:163)
+	at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:145)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync0(AbstractRedisClient.java:314)
+	at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$0(AbstractRedisClient.java:295)
+	at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:137)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
+	at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:61)
+	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
+	at reactor.core.publisher.Mono.subscribeWith(Mono.java:3954)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3842)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3809)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3781)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync(AbstractRedisClient.java:290)
+	at io.lettuce.core.RedisClient.connectStatefulAsync(RedisClient.java:314)
+	at io.lettuce.core.RedisClient.connectStandaloneAsync(RedisClient.java:271)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)
+2023-02-26 16:12:20.989 [MQTT Call: plane-inspection-6523] ERROR i.n.u.concurrent.DefaultPromise.rejectedExecution - Failed to submit a listener notification task. Event loop shut down?
+java.util.concurrent.RejectedExecutionException: event executor terminated
+	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:846)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:329)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:322)
+	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:757)
+	at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:766)
+	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:423)
+	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:152)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
+	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync0(AbstractRedisClient.java:324)
+	at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$0(AbstractRedisClient.java:295)
+	at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:137)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192)
+	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
+	at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:61)
+	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
+	at reactor.core.publisher.Mono.subscribeWith(Mono.java:3954)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3842)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3809)
+	at reactor.core.publisher.Mono.subscribe(Mono.java:3781)
+	at io.lettuce.core.AbstractRedisClient.initializeChannelAsync(AbstractRedisClient.java:290)
+	at io.lettuce.core.RedisClient.connectStatefulAsync(RedisClient.java:314)
+	at io.lettuce.core.RedisClient.connectStandaloneAsync(RedisClient.java:271)
+	at io.lettuce.core.RedisClient.connect(RedisClient.java:204)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.lambda$getConnection$1(StandaloneConnectionProvider.java:113)
+	at java.util.Optional.orElseGet(Optional.java:267)
+	at org.springframework.data.redis.connection.lettuce.StandaloneConnectionProvider.getConnection(StandaloneConnectionProvider.java:113)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.lambda$null$0(LettucePoolingConnectionProvider.java:74)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:209)
+	at io.lettuce.core.support.ConnectionPoolSupport$RedisPooledObjectFactory.create(ConnectionPoolSupport.java:199)
+	at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58)
+	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
+	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:122)
+	at io.lettuce.core.support.ConnectionPoolSupport$1.borrowObject(ConnectionPoolSupport.java:117)
+	at org.springframework.data.redis.connection.lettuce.LettucePoolingConnectionProvider.getConnection(LettucePoolingConnectionProvider.java:80)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1104)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1085)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:866)
+	at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:341)
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:132)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:95)
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:82)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:211)
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184)
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95)
+	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:236)
+	at com.keystar.plane.inspection.utils.RedisUtils.set(RedisUtils.java:54)
+	at com.keystar.plane.inspection.mqtt.NestMqttHandler.handle(NestMqttHandler.java:41)
+	at com.keystar.mqtt.processor.MessageHandleService.handle(MessageHandleService.java:39)
+	at com.keystar.mqtt.util.SubScribeUtil.lambda$subScribe$0(SubScribeUtil.java:31)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.deliverMessage(CommsCallback.java:511)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.handleMessage(CommsCallback.java:417)
+	at org.eclipse.paho.client.mqttv3.internal.CommsCallback.run(CommsCallback.java:214)
+	at java.lang.Thread.run(Thread.java:748)

BIN
app_log/log/planeInspection.err.2023-02-08.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-09.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-10.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-11.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-12.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-13.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-14.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-15.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-16.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-17.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-18.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-19.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-20.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-22.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-23.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-24.0.log.gz


BIN
app_log/log/planeInspection.err.2023-02-25.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-08.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-09.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-10.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-11.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-12.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-13.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-14.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-15.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-16.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-17.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-18.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-19.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-20.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-22.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-23.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-24.0.log.gz


BIN
app_log/log/planeInspection.info.2023-02-25.0.log.gz


+ 316 - 0
mvnw

@@ -0,0 +1,316 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /usr/local/etc/mavenrc ] ; then
+    . /usr/local/etc/mavenrc
+  fi
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`\\unset -f command; \\command -v java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  $MAVEN_DEBUG_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" \
+  "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 188 - 0
mvnw.cmd

@@ -0,0 +1,188 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
+if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+
+FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% ^
+  %JVM_CONFIG_MAVEN_PROPS% ^
+  %MAVEN_OPTS% ^
+  %MAVEN_DEBUG_OPTS% ^
+  -classpath %WRAPPER_JAR% ^
+  "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
+  %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
+if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%"=="on" pause
+
+if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
+
+cmd /C exit /B %ERROR_CODE%

+ 245 - 0
pom.xml

@@ -0,0 +1,245 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.1.6.RELEASE</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+
+	<groupId>com.keystar</groupId>
+	<artifactId>plane-inspection</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>plane-inspection</name>
+	<description>plane-inspection</description>
+	<packaging>jar</packaging>
+
+	<properties>
+		<java.version>1.8</java.version>
+		<maven.compiler.source>${java.version}</maven.compiler.source>
+		<maven.compiler.target>${java.version}</maven.compiler.target>
+		<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
+		<spring-cloud-alibaba.version>2.1.2.RELEASE</spring-cloud-alibaba.version>
+		<lombok.version>1.18.24</lombok.version>
+		<mqtt.version>0.1.4</mqtt.version>
+		<druid.version>1.1.10</druid.version>
+		<mybatis.plus.version>3.4.1</mybatis.plus.version>
+		<commons-lang3.version>3.12.0</commons-lang3.version>
+		<hutool.version>5.7.14</hutool.version>
+		<commons.pool2.version>2.5.0</commons.pool2.version>
+		<minio.version>3.0.10</minio.version>
+		<commons.net.version>3.3</commons.net.version>
+		<com.jcraft.version>0.1.54</com.jcraft.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+		<!-- SpringCloud Alibaba Nacos -->
+		<dependency>
+			<groupId>com.alibaba.cloud</groupId>
+			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+		</dependency>
+
+		<!-- SpringCloud Alibaba Nacos Config -->
+		<dependency>
+			<groupId>com.alibaba.cloud</groupId>
+			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>${lombok.version}</version>
+			<optional>true</optional>
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.keystar.mqtt</groupId>
+			<artifactId>mqtt-spring-boot-starter</artifactId>
+			<version>${mqtt.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-jdbc</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>druid-spring-boot-starter</artifactId>
+			<version>${druid.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>druid</artifactId>
+			<version>${druid.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-redis</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.session</groupId>
+			<artifactId>spring-session-data-redis</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>com.baomidou</groupId>
+			<artifactId>mybatis-plus-boot-starter</artifactId>
+			<version>${mybatis.plus.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.baomidou</groupId>
+			<artifactId>mybatis-plus</artifactId>
+			<version>${mybatis.plus.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.baomidou</groupId>
+			<artifactId>mybatis-plus-generator</artifactId>
+			<version>${mybatis.plus.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>cn.hutool</groupId>
+			<artifactId>hutool-all</artifactId>
+			<version>${hutool.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>${commons-lang3.version}</version>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-pool2</artifactId>
+			<version>${commons.pool2.version}</version>
+		</dependency>
+
+		<!-- fluent-hc -->
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>fluent-hc</artifactId>
+			<version>4.5.13</version>
+		</dependency>
+
+
+		<!-- metadata-extractor -->
+		<dependency>
+			<groupId>com.drewnoakes</groupId>
+			<artifactId>metadata-extractor</artifactId>
+			<version>2.18.0</version>
+		</dependency>
+
+		<!-- minio依赖 -->
+		<dependency>
+			<groupId>io.minio</groupId>
+			<artifactId>minio</artifactId>
+			<version>${minio.version}</version>
+			<exclusions>
+				<exclusion>
+					<artifactId>jsr305</artifactId>
+					<groupId>com.google.code.findbugs</groupId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<!-- ftpclient依赖包 -->
+		<dependency>
+			<groupId>commons-net</groupId>
+			<artifactId>commons-net</artifactId>
+			<version>${commons.net.version}</version>
+		</dependency>
+
+
+		<dependency>
+			<groupId>com.jcraft</groupId>
+			<artifactId>jsch</artifactId>
+		    <version>${com.jcraft.version}</version>
+		</dependency>
+
+
+
+	</dependencies>
+
+	<dependencyManagement>
+		<dependencies>
+			<!-- SpringCloud 微服务 -->
+			<dependency>
+				<groupId>org.springframework.cloud</groupId>
+				<artifactId>spring-cloud-dependencies</artifactId>
+				<version>${spring-cloud.version}</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+
+			<!-- SpringCloud Alibaba 微服务 -->
+			<dependency>
+				<groupId>com.alibaba.cloud</groupId>
+				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
+				<version>${spring-cloud-alibaba.version}</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<build>
+		<finalName>plane-inspection</finalName>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<configuration>
+					<mainClass>
+						com.keystar.plane.inspection.PlaneInspectionApplication
+					</mainClass>
+					<includeSystemScope>true</includeSystemScope>
+				</configuration>
+				<executions>
+					<execution>
+						<goals>
+							<goal>repackage</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>${maven.compiler.source}</source>
+					<target>${maven.compiler.target}</target>
+				</configuration>
+			</plugin>
+		</plugins>
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+				<includes>
+					<include>**/*.*</include>
+				</includes>
+			</resource>
+		</resources>
+	</build>
+
+</project>

+ 15 - 0
src/main/java/com/keystar/plane/inspection/PlaneInspectionApplication.java

@@ -0,0 +1,15 @@
+package com.keystar.plane.inspection;
+
+import com.keystar.mqtt.annotation.EnableBindMqtt;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@EnableBindMqtt(basePackages = "com.keystar.plane.inspection.mqtt")
+public class PlaneInspectionApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(PlaneInspectionApplication.class, args);
+	}
+
+}

+ 14 - 0
src/main/java/com/keystar/plane/inspection/bo/DateBo.java

@@ -0,0 +1,14 @@
+package com.keystar.plane.inspection.bo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class DateBo {
+
+    private Date startTime;
+
+    private Date endTime;
+
+}

+ 13 - 0
src/main/java/com/keystar/plane/inspection/bo/DetectResultBo.java

@@ -0,0 +1,13 @@
+package com.keystar.plane.inspection.bo;
+
+import lombok.Data;
+
+@Data
+public class DetectResultBo {
+
+    private String rowIndex;
+
+    private String columnIndex;
+
+//    private String
+}

+ 38 - 0
src/main/java/com/keystar/plane/inspection/bo/Line.java

@@ -0,0 +1,38 @@
+package com.keystar.plane.inspection.bo;
+
+public class Line {
+    private Location startLocation;//起点
+    private Location endLocation;//终点
+
+    public Line() {
+
+    }
+    public Line(Location startLocation, Location endLocation) {
+        this.startLocation = startLocation;
+        this.endLocation = endLocation;
+    }
+
+    public Location getStartLocation() {
+        return startLocation;
+    }
+
+    public void setStartLocation(Location startLocation) {
+        this.startLocation = startLocation;
+    }
+
+    public Location getEndLocation() {
+        return endLocation;
+    }
+
+    public void setEndLocation(Location endLocation) {
+        this.endLocation = endLocation;
+    }
+
+    @Override
+    public String toString() {
+        return "Line{" +
+                "startLocation=" + startLocation +
+                ", endLocation=" + endLocation +
+                '}';
+    }
+}

+ 36 - 0
src/main/java/com/keystar/plane/inspection/bo/Location.java

@@ -0,0 +1,36 @@
+package com.keystar.plane.inspection.bo;
+
+/**
+ * 经纬度坐标实体类
+ *
+ */
+public class Location {
+
+    private double lon;
+
+    private double lat;
+
+    public Location() {
+    }
+
+    public Location(double lon, double lat) {
+        this.lon = lon;
+        this.lat = lat;
+    }
+
+    public double getLon() {
+        return lon;
+    }
+
+    public void setLon(double lon) {
+        this.lon = lon;
+    }
+
+    public double getLat() {
+        return lat;
+    }
+
+    public void setLat(double lat) {
+        this.lat = lat;
+    }
+}

+ 23 - 0
src/main/java/com/keystar/plane/inspection/bo/NewFileBo.java

@@ -0,0 +1,23 @@
+package com.keystar.plane.inspection.bo;
+
+import lombok.Data;
+
+@Data
+public class NewFileBo {
+
+    /**
+     *  航线id
+     **/
+    private Integer missionId;
+
+    /**
+     *  架次id
+     **/
+    private Integer recordId;
+
+    /**
+     *  图片目录地址
+     **/
+    private String path;
+
+}

+ 34 - 0
src/main/java/com/keystar/plane/inspection/bo/PhotoMqttMessageBo.java

@@ -0,0 +1,34 @@
+package com.keystar.plane.inspection.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ *  发送Mqtt给图像识别
+ **/
+@NoArgsConstructor
+@Data
+public class PhotoMqttMessageBo {
+
+    /**
+     *  图片id
+     **/
+    private Long id;
+
+    /**
+     *  识别类型
+     **/
+    private List<String> funcIndex;
+
+    /**
+     *  可见光图片地址
+     **/
+    private String visibleImagePath;
+
+    /**
+     *  红外图片地址
+     **/
+    private String infraredImagePath;
+}

+ 16 - 0
src/main/java/com/keystar/plane/inspection/bo/PlaneInspectionBo.java

@@ -0,0 +1,16 @@
+package com.keystar.plane.inspection.bo;
+
+import lombok.Data;
+
+@Data
+public class PlaneInspectionBo {
+
+    private Integer allTask;
+
+    private Integer unfinishedTask;
+
+    private Integer finishedTask;
+
+    private String planeStatus;
+
+}

+ 35 - 0
src/main/java/com/keystar/plane/inspection/bo/RecognizeMessageBo.java

@@ -0,0 +1,35 @@
+package com.keystar.plane.inspection.bo;
+
+import lombok.Data;
+
+import java.net.Inet4Address;
+import java.util.List;
+
+/**
+ *  接收图像识别的Mqtt信息
+ **/
+@Data
+public class RecognizeMessageBo {
+    
+    /**
+     *  阵列序号
+     **/
+    private String arrayIndex;
+
+    /**
+     *  行数
+     **/
+    private String rowIndex;
+
+    /**
+     *  列数
+     **/
+    private String columnIndex;
+
+    /**
+     *  识别的具体结果
+     **/
+    private ResultBo result;
+
+
+}

+ 20 - 0
src/main/java/com/keystar/plane/inspection/bo/ResultBo.java

@@ -0,0 +1,20 @@
+package com.keystar.plane.inspection.bo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ResultBo {
+
+    /**
+     *  异常类型
+     **/
+    private String type;
+
+    /**
+     *  异常坐标
+     **/
+    private List<String> coordinates;
+
+}

+ 13 - 0
src/main/java/com/keystar/plane/inspection/bo/TaskMissionRecordBo.java

@@ -0,0 +1,13 @@
+package com.keystar.plane.inspection.bo;
+
+import lombok.Data;
+
+@Data
+public class TaskMissionRecordBo {
+
+    private String taskName;
+
+    private Integer taskCount;
+
+    private Integer taskId;
+}

+ 37 - 0
src/main/java/com/keystar/plane/inspection/config/MinIoConfig.java

@@ -0,0 +1,37 @@
+package com.keystar.plane.inspection.config;
+
+import io.minio.MinioClient;
+import io.minio.errors.InvalidEndpointException;
+import io.minio.errors.InvalidPortException;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "minio")
+public class MinIoConfig {
+    @Value("${minio.addr}")
+    private String addr;
+    @Value("${minio.accessKey}")
+    private String accessKey;
+    @Value("${minio.secretKey}")
+    private String secretKey;
+    @Value("${minio.expires}")
+    private int expires;
+
+    @Value("${minio.bucket.name:nest}")
+    private String bucketName;
+
+    @Value("${minio.resourcePath}")
+    private String resourcePath;
+
+
+    @Bean
+    public MinioClient minioClient() throws InvalidPortException, InvalidEndpointException {
+        return new MinioClient("http://" + addr, accessKey, secretKey);
+    }
+}

+ 14 - 0
src/main/java/com/keystar/plane/inspection/config/PlaneInspectionConfig.java

@@ -0,0 +1,14 @@
+package com.keystar.plane.inspection.config;
+
+import lombok.Data;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+@RefreshScope
+public class PlaneInspectionConfig {
+
+
+
+}

+ 10 - 0
src/main/java/com/keystar/plane/inspection/config/WebSocketConfig.java

@@ -0,0 +1,10 @@
+package com.keystar.plane.inspection.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class WebSocketConfig {
+
+}

+ 27 - 0
src/main/java/com/keystar/plane/inspection/constant/LocationConstant.java

@@ -0,0 +1,27 @@
+package com.keystar.plane.inspection.constant;
+
+import com.keystar.plane.inspection.bo.Location;
+import com.keystar.plane.inspection.utils.FileUtil;
+import org.springframework.util.ResourceUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class LocationConstant {
+
+    // 先通过读取json文件获取每个光伏板的位置信息
+    public static Map<String, Map<String, List<Location>>> PVLocation = null;
+    static {
+        PVLocation = FileUtil.readCurrent("pv.json");
+    }
+
+    // 每个方阵的位置信息
+    public static Map<String, List<Location>> PZLocation = null;
+    static {
+        PZLocation = FileUtil.readFZLatLng("border.json");
+    }
+
+}

+ 8 - 0
src/main/java/com/keystar/plane/inspection/constant/PlaneStatusConstant.java

@@ -0,0 +1,8 @@
+package com.keystar.plane.inspection.constant;
+
+public class PlaneStatusConstant {
+
+    public static final String DOWNLOAD_UPLOAD_MEANWHILE = "DOWNLOAD_UPLOAD_MEANWHILE";
+
+    public static final String IDLE = "IDLE";
+}

+ 6 - 0
src/main/java/com/keystar/plane/inspection/constant/RedisConstant.java

@@ -0,0 +1,6 @@
+package com.keystar.plane.inspection.constant;
+
+public class RedisConstant {
+
+
+}

+ 16 - 0
src/main/java/com/keystar/plane/inspection/constant/UrlConstant.java

@@ -0,0 +1,16 @@
+package com.keystar.plane.inspection.constant;
+
+public class UrlConstant {
+
+    // 访问无人机登录接口地址
+    public static final String PLANE_LOGIN = "http://10.138.6.221:11009/nest-api/sys/login";
+
+    // 获取无人机最新图片接口地址
+    public static final String PLANE_PHOTO = "http://10.138.6.221:11009/nest-api/missionPhoto/getAllPhotoByNewRecordsId";
+
+    // 获取无人机任务接口地址
+    public static final String PLANE_TASK = "http://10.138.6.221:11009/nest-api/missionRecords/getInspectStatisticsBy";
+
+
+
+}

+ 21 - 0
src/main/java/com/keystar/plane/inspection/controller/LoginController.java

@@ -0,0 +1,21 @@
+package com.keystar.plane.inspection.controller;
+
+import com.keystar.plane.inspection.service.LoginService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(value = "/login")
+public class LoginController {
+
+    @Autowired
+    LoginService loginService;
+
+    @GetMapping("/getToken")
+    public String getToken() throws Exception {
+        return loginService.getToken();
+    }
+
+}

+ 53 - 0
src/main/java/com/keystar/plane/inspection/controller/NestController.java

@@ -0,0 +1,53 @@
+package com.keystar.plane.inspection.controller;
+
+import com.keystar.plane.inspection.bo.DateBo;
+import com.keystar.plane.inspection.bo.PlaneInspectionBo;
+import com.keystar.plane.inspection.dao.NestStatusVo;
+import com.keystar.plane.inspection.mqtt.PlaneMqttHandler;
+import com.keystar.plane.inspection.service.LoginService;
+import com.keystar.plane.inspection.service.NestService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping(value = "/nest")
+public class NestController {
+
+    @Autowired
+    NestService nestService;
+
+    @Autowired
+    LoginService loginService;
+
+    /**
+     *  获取机巢的具体状态
+     **/
+    @GetMapping("/getNestStatus")
+    public String getNestStatus(){
+        return nestService.getNestStatus();
+    }
+
+    /**
+     *  获取机巢是否在线
+     **/
+    @GetMapping("/getNestOnline")
+    public NestStatusVo getNestOnline(){
+        return nestService.getNestOnline();
+    }
+
+    /**
+     *  获取最新的无人机巡检信息
+     **/
+    @GetMapping("/getPhoto")
+    public String getNestMsg() throws Exception {
+        return PlaneMqttHandler.getPlanePhoto();
+    }
+
+    /**
+     *  获取无人机的任务信息
+     **/
+    @PostMapping("/getTask")
+    public PlaneInspectionBo getInspection(@RequestBody DateBo dateBo) throws Exception {
+        return nestService.getInspection(dateBo);
+    }
+}

+ 57 - 0
src/main/java/com/keystar/plane/inspection/controller/PhotoController.java

@@ -0,0 +1,57 @@
+package com.keystar.plane.inspection.controller;
+
+import cn.hutool.core.util.IdUtil;
+import com.drew.imaging.jpeg.JpegProcessingException;
+import com.keystar.mqtt.bo.MqttMessageBo;
+import com.keystar.plane.inspection.bo.NewFileBo;
+import com.keystar.plane.inspection.bo.PhotoMqttMessageBo;
+import com.keystar.plane.inspection.dao.PlanePhotoVo;
+import com.keystar.plane.inspection.entity.PlanePhotoEntity;
+import com.keystar.plane.inspection.service.MqttService;
+import com.keystar.plane.inspection.service.PhotoService;
+import com.keystar.plane.inspection.service.PlanePhotoService;
+import com.keystar.plane.inspection.utils.FileUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@RestController
+@RequestMapping(value = "/photo")
+public class PhotoController {
+
+    @Autowired
+    PhotoService photoService;
+
+    @Autowired
+    PlanePhotoService planePhotoService;
+
+    @Autowired
+    MqttService mqttService;
+
+    /**
+     *  获取最新的无人机图片文件
+     **/
+    @GetMapping("/getNewFile")
+    public NewFileBo getNewFile(){
+        return FileUtil.getNewFilePath();
+    }
+
+    /**
+     *  发送最新任务图片Mqtt给图像识别
+     **/
+    @GetMapping("/sendMqtt")
+    public void sendMqtt() throws IOException, JpegProcessingException, ParseException, InterruptedException {
+        mqttService.sendPhotoMqtt();
+    }
+}

+ 50 - 0
src/main/java/com/keystar/plane/inspection/dao/DegreesVo.java

@@ -0,0 +1,50 @@
+package com.keystar.plane.inspection.dao;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+@Data
+public class DegreesVo {
+
+    /**
+     * a的x坐标
+     */
+    private double aX;
+
+    /**
+     * a的y坐标
+     */
+    private double aY;
+
+    /**
+     * b的x坐标
+     */
+    private double bX;
+
+    /**
+     * b的y坐标
+     */
+    private double bY;
+
+    /**
+     * c的x坐标
+     */
+    private double cX;
+    /**
+     * c的y坐标
+     */
+    private double cY;
+
+    /**
+     * d的x坐标
+     */
+    private double dX;
+
+    /**
+     * d的y坐标
+     */
+    private double dY;
+
+
+}

+ 12 - 0
src/main/java/com/keystar/plane/inspection/dao/LoginVo.java

@@ -0,0 +1,12 @@
+package com.keystar.plane.inspection.dao;
+
+
+import lombok.Data;
+
+@Data
+public class LoginVo {
+
+    private Boolean isWeak;
+
+    private String token;
+}

+ 11 - 0
src/main/java/com/keystar/plane/inspection/dao/NestStatusVo.java

@@ -0,0 +1,11 @@
+package com.keystar.plane.inspection.dao;
+
+import lombok.Data;
+
+@Data
+public class NestStatusVo {
+
+    private String name;
+
+    private Integer status;
+}

+ 42 - 0
src/main/java/com/keystar/plane/inspection/dao/PhotoMessageVo.java

@@ -0,0 +1,42 @@
+package com.keystar.plane.inspection.dao;
+
+import lombok.Data;
+
+@Data
+public class PhotoMessageVo {
+    
+    /**
+     *  图片宽度
+     **/
+    private Double imageWidth;
+    
+    /**
+     *  图片高度
+     **/
+    private Double imageHigh;
+
+    /**
+     *  焦距
+     **/
+    private Double focalLength;
+    
+    /**
+     *  35mm焦距
+     **/
+    private Double focalLength35;
+    
+    /**
+     *  纬度
+     **/
+    private Double latitude;
+    
+    /**
+     *  经度
+     **/
+    private Double longitude;
+    
+    /**
+     *  高度
+     **/
+    private Double altitude;
+}

+ 20 - 0
src/main/java/com/keystar/plane/inspection/dao/PlanePhotoVo.java

@@ -0,0 +1,20 @@
+package com.keystar.plane.inspection.dao;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class PlanePhotoVo {
+
+    /**
+     *  方阵名字
+     **/
+    private String PZName;
+
+    /**
+     *  光伏板名字
+     **/
+    private List<String> PVNames;
+}

+ 61 - 0
src/main/java/com/keystar/plane/inspection/entity/PhotoResultEntity.java

@@ -0,0 +1,61 @@
+package com.keystar.plane.inspection.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *  识别结果
+ **/
+@Data
+@TableName("kr_photo_result")
+public class PhotoResultEntity {
+
+    private static final long serialVersionUID = 1650634709644831520L;
+
+    /**
+     *  id
+     **/
+    private Long id;
+
+    /**
+     *  图片id
+     **/
+    @TableField(value = "photo_id")
+    private Long photoId;
+
+    /**
+     *  图片地址
+     **/
+    private String path;
+    
+    /**
+     *  阵列序号
+     **/
+    @TableField(value = "array_index")
+    private String arrayIndex;
+
+    /**
+     *  行数
+     **/
+    @TableField(value = "row_index")
+    private String rowIndex;
+
+    /**
+     *  列数
+     **/
+    @TableField(value = "column_index")
+    private String columnIndex;
+
+    /**
+     *  异常类型
+     **/
+    private String type;
+    
+    /**
+     *  异常位置
+     **/
+    private String coordinates;
+}

+ 59 - 0
src/main/java/com/keystar/plane/inspection/entity/PlanePhotoEntity.java

@@ -0,0 +1,59 @@
+package com.keystar.plane.inspection.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *  无人机图片
+ **/
+@Data
+@TableName("kr_plane_photo")
+public class PlanePhotoEntity implements Serializable {
+
+    private static final long serialVersionUID = 1650634709644831520L;
+
+    /**
+     *  id
+     **/
+    private Long id;
+
+    /**
+     *  航线id
+     **/
+    @TableField(value = "mission_id")
+    private Integer missionId;
+    
+    /**
+     *  架次id
+     **/
+    @TableField(value = "record_id")
+    private Integer recordId; 
+    
+    /**
+     *  图片地址
+     **/
+    private String path;
+    
+    /**
+     *  方阵名字
+     **/
+    @TableField(value = "pz_name")
+    private String pzName;
+    
+    /**
+     *  光伏板名字
+     **/
+    @TableField(value = "pv_name")
+    private String pvName;
+
+    /**
+     *  记录时间
+     **/
+    private Date time;
+
+
+}

+ 107 - 0
src/main/java/com/keystar/plane/inspection/enums/NestStatusEnum.java

@@ -0,0 +1,107 @@
+package com.keystar.plane.inspection.enums;
+
+import lombok.Getter;
+
+public enum NestStatusEnum {
+
+    INIT("INIT", "初始化"),
+
+    SELF_TEST("SELF_TEST", "自检中"),
+
+    WAIT_RESET("WAIT_RESET", "等待重置"),
+
+    RESETTING("RESETTING", "重置中"),
+
+    STANDBY("STANDBY", "待机"),
+
+    PREPARING("PREPARING", "启动中"),
+
+    READY_TO_GO("READY_TO_GO", "准备起飞"),
+
+    TAKE_OFF("TAKE_OFF","起飞中"),
+
+    EXECUTING("EXECUTING", "任务执行中"),
+
+    GOING_HOME("GOING_HOME", "返航"),
+
+    LANDING("LANDING", "着陆中"),
+
+    RECOVERING("RECOVERING", "回收中"),
+
+    BATTERY_LOADING("BATTERY_LOADING", "电池装载中"),
+
+    BATTERY_UNLOADING("BATTERY_UNLOADING", "电池卸载中"),
+
+    BATTERY_LOADED("BATTERY_LOADED", "电池已装载"),
+
+    BATTERY_REPLACING("BATTERY_REPLACING", "电池替换中"),
+
+    OPERATING("OPERATING", "操作中"),
+
+    OPEN_WITHOUT_BATTERY("OPEN_WITHOUT_BATTERY", "未装载开启模式"),
+
+    SYS_SUSPEND("SYS_SUSPEND", "系统挂起"),
+
+    ERROR("ERROR", "状态错误"),
+
+    DEBUG("DEBUG", "调试模式"),
+
+    DRONE_POWER_ON_DOING("DRONE_POWER_ON_DOING", "无人机开关机进行中"),
+
+    DRONE_PAIRING_DOING("DRONE_PAIRING_DOING", "无人机对频进行中"),
+
+    BOOTLOADER_IDLE("BOOTLOADER_IDLE", "MPS固件更新初始化"),
+
+    BOOTLOADER_WAITING_FOR_UPGRADE_CMD("BOOTLOADER_WAITING_FOR_UPGRADE_CMD", "MPS等待固件更新指令"),
+
+    BOOTLOADER_PREPARE_TO_RECEIVE_FW("BOOTLOADER_PREPARE_TO_RECEIVE_FW", "MPS准备接收固件数据"),
+
+    BOOTLOADER_RECEIVING_FM("BOOTLOADER_RECEIVING_FM", "MPS正在接收固件数据"),
+
+    BOOTLOADER_FINISH_RECEIVE_FW("BOOTLOADER_FINISH_RECEIVE_FW", "MPS固件数据接收完成"),
+
+    BOOTLOADER_UPGRADING("BOOTLOADER_UPGRADING", "MPS正在更新固件"),
+
+    BOOTLOADER_UPGRADED("BOOTLOADER_UPGRADED", "MPS固件更新完成"),
+
+    BOOTLOADER_MAIN_PROGRAM_LAUNCHING("BOOTLOADER_MAIN_PROGRAM_LAUNCHING", "MPS正在启动"),
+
+    BOOTLOADER_ENTERING_MPS_FW_UPGRADE_MODE("BOOTLOADER_ENTERING_MPS_FW_UPGRADE_MODE", "MPS正在进入固件更新模式"),
+
+    BOOTLOADER_UPGRADE_ERR("BOOTLOADER_UPGRADE_ERR", "MPS固件更新异常"),
+
+    CONNECTING("CONNECTING", "MPS连接中"),
+
+    DISCONNECTED("DISCONNECTED", "MPS未连接"),
+
+    /**
+     *  文档上没有的状态
+     **/
+    DRONE_STARTED("DRONE_STARTED", "无人机已准备");
+
+
+    @Getter
+    private final String code;
+
+    @Getter
+    private final String name;
+
+    NestStatusEnum(String code, String name){
+        this.code=code;
+        this.name=name;
+    }
+
+
+    /**
+     *  根据code获取机巢的状态
+     **/
+    public static NestStatusEnum getNameByCode(String code){
+        for (NestStatusEnum statusEnum : NestStatusEnum.values()){
+            if (statusEnum.getCode().equals(code)){
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+
+}

+ 36 - 0
src/main/java/com/keystar/plane/inspection/enums/ResultEnum.java

@@ -0,0 +1,36 @@
+package com.keystar.plane.inspection.enums;
+
+import lombok.Getter;
+
+public enum ResultEnum {
+
+    COVERED("covered", "遮挡"),
+
+    DIODEFAULT("diodeFault", "二极管故障");
+
+
+
+    @Getter
+    private final String code;
+
+    @Getter
+    private final String name;
+
+    ResultEnum(String code, String name){
+        this.code=code;
+        this.name=name;
+    }
+
+
+    /**
+     *  根据code获取图片异常的名字
+     **/
+    public static NestStatusEnum getNameByCode(String code){
+        for (NestStatusEnum statusEnum : NestStatusEnum.values()){
+            if (statusEnum.getCode().equals(code)){
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}

+ 9 - 0
src/main/java/com/keystar/plane/inspection/mapper/PhotoResultMapper.java

@@ -0,0 +1,9 @@
+package com.keystar.plane.inspection.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.keystar.plane.inspection.entity.PhotoResultEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PhotoResultMapper extends BaseMapper<PhotoResultEntity> {
+}

+ 10 - 0
src/main/java/com/keystar/plane/inspection/mapper/PlanePhotoMapper.java

@@ -0,0 +1,10 @@
+package com.keystar.plane.inspection.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.keystar.plane.inspection.entity.PlanePhotoEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.mybatis.spring.annotation.MapperScan;
+
+@Mapper
+public interface PlanePhotoMapper extends BaseMapper<PlanePhotoEntity> {
+}

+ 46 - 0
src/main/java/com/keystar/plane/inspection/mqtt/NestMqttHandler.java

@@ -0,0 +1,46 @@
+package com.keystar.plane.inspection.mqtt;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.keystar.mqtt.annotation.MqttHandlerType;
+import com.keystar.mqtt.annotation.MqttSubScribe;
+import com.keystar.mqtt.handler.AbstractMqttHandler;
+import com.keystar.plane.inspection.utils.RedisUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+
+import java.io.IOException;
+import java.util.Map;
+
+@MqttHandlerType(
+        {
+                @MqttSubScribe(topic = "/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/base", qos = 0)
+        }
+)
+@Slf4j
+public class NestMqttHandler implements AbstractMqttHandler {
+
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+
+    @Override
+    public void handle(MqttMessage message) throws IOException {
+
+        String messageContent = new String(message.getPayload());
+
+        Map<String, String> map;
+        try{
+            map = OBJECT_MAPPER.readValue(messageContent,Map.class);
+        }catch (IOException e){
+            return;
+        }
+
+        String key = "PlaneInspection:nestStatus";
+
+        if (map.containsKey("nestStateConstant")){
+            String nestState = map.get("nestStateConstant");
+            RedisUtils.set(key,nestState);
+        }
+
+
+    }
+}

+ 134 - 0
src/main/java/com/keystar/plane/inspection/mqtt/PlaneMqttHandler.java

@@ -0,0 +1,134 @@
+package com.keystar.plane.inspection.mqtt;
+
+import cn.hutool.core.util.ReUtil;
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.keystar.mqtt.annotation.MqttHandlerType;
+import com.keystar.mqtt.annotation.MqttSubScribe;
+import com.keystar.mqtt.handler.AbstractMqttHandler;
+import com.keystar.plane.inspection.constant.PlaneStatusConstant;
+import com.keystar.plane.inspection.constant.UrlConstant;
+import com.keystar.plane.inspection.dao.LoginVo;
+import com.keystar.plane.inspection.dao.PlanePhotoVo;
+import com.keystar.plane.inspection.utils.HttpUtils;
+import com.keystar.plane.inspection.utils.RedisUtils;
+import com.keystar.plane.inspection.utils.Utils;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.cache.CacheProperties;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+@MqttHandlerType(
+        {
+                @MqttSubScribe(topic = "/70ddc6e4-1b3e-4da9-9952-16c04ec5c415/status/media", qos = 0)
+        }
+)
+@Slf4j
+public class PlaneMqttHandler implements AbstractMqttHandler {
+
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
+
+    @SneakyThrows
+    @Override
+    public void handle(MqttMessage message) {
+
+        String key = "PlaneInspection:status";
+
+        String messageContent = new String(message.getPayload());
+
+        Map<String, String> map;
+        try{
+            map = OBJECT_MAPPER.readValue(messageContent,Map.class);
+        }catch (IOException ioex){
+            return;
+        }
+
+        if (map.containsKey("currentState")){
+
+            String currentState = map.get("currentState");
+            // 如果无人机当前状态是一边上传一边下载
+            if (currentState.equals(PlaneStatusConstant.DOWNLOAD_UPLOAD_MEANWHILE)){
+                RedisUtils.set(key,currentState);
+            }
+
+            // 如果无人机是处于空闲状态
+            if (currentState.equals(PlaneStatusConstant.IDLE)){
+                // 上一个状态还是上传下载
+                if (RedisUtils.hasKey(key) && RedisUtils.get(key).equals(PlaneStatusConstant.DOWNLOAD_UPLOAD_MEANWHILE)){
+                    String token = planeLogin();
+
+
+                    if (token != null){
+                        // todo 拿取最新的无人机图片
+
+                    }
+                }
+
+                RedisUtils.set(key,currentState);
+            }
+
+        }
+    }
+
+
+    /**
+     *  根据无人机登录接口返回token
+     **/
+    public static String planeLogin() throws Exception {
+
+        String password = "Keystar@2022";
+        String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCDrKWklonbo4ZFgwLgE63wt+sHiB4Uq0Tl6V6g2Aoj5IPRd4TL8mJlMkaJu/c3G212jhjbUjYkWn5HOnrUwrVN1q+mJGGUCED6ruTNMiAc1Oe5gbLwGIeyk4IMuZFUVwq7XdTgVfFo9cVRAM8jIWftJrCm63ZrqqU/AdBoU4FSTQIDAQAB";
+        String encrypt = Utils.encrypt(password, publicKey);
+
+        Map<String,Object> paramMap = new HashMap<>();
+        paramMap.put("account","keystar");
+        paramMap.put("password",encrypt);
+        paramMap.put("type","1");
+        paramMap.put("platform","0");
+
+        String response = HttpUtils.doPost(UrlConstant.PLANE_LOGIN, paramMap, null);
+        log.debug("======无人机登录接口返回结果: " + response);
+        // 通过无人机的登录接口获取token
+        Map<String, Object> responseMap = null;
+        try {
+            responseMap = OBJECT_MAPPER.readValue(response, Map.class);
+        }catch (Exception e) {
+            log.debug("通过无人机登录接口获取异常");
+        }
+        if (responseMap != null){
+
+            Object param = responseMap.get("param");
+            LoginVo loginVo = JSON.parseObject(JSON.toJSONString(param), LoginVo.class);
+            return loginVo.getToken();
+        }
+        return null;
+    }
+
+    /**
+     *  获取最新的无人机图片
+     **/
+    public static String getPlanePhoto() throws Exception {
+
+        String token = planeLogin();
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Authorization", token);
+        String response = HttpUtils.doGet(UrlConstant.PLANE_PHOTO, headers);
+        log.debug("======获取无人机图片返回结果: " + response);
+
+        return response;
+    }
+
+
+}

+ 81 - 0
src/main/java/com/keystar/plane/inspection/mqtt/RecognizeMqttHandler.java

@@ -0,0 +1,81 @@
+package com.keystar.plane.inspection.mqtt;
+
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.keystar.mqtt.annotation.MqttHandlerType;
+import com.keystar.mqtt.annotation.MqttSubScribe;
+import com.keystar.mqtt.handler.AbstractMqttHandler;
+import com.keystar.plane.inspection.bo.RecognizeMessageBo;
+import com.keystar.plane.inspection.entity.PhotoResultEntity;
+import com.keystar.plane.inspection.entity.PlanePhotoEntity;
+import com.keystar.plane.inspection.service.PhotoResultService;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+@MqttHandlerType(
+        {
+                @MqttSubScribe(topic = "LightSpot_recognize_result", qos = 0)
+        }
+)
+@Slf4j
+public class RecognizeMqttHandler implements AbstractMqttHandler {
+
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+    @Autowired
+    PhotoResultService photoResultService;
+
+    @Override
+    public void handle(MqttMessage message) throws IOException {
+
+        String messageContent = new String(message.getPayload());
+        log.info("======接收到的识别结果mq: " + messageContent);
+        JSONObject messageObject = JSONObject.parseObject(messageContent);
+        JSONArray dataList = messageObject.getJSONArray("data");
+        // 将dataList中的结果遍历
+        for( Object data : dataList){
+            JSONObject dataObject = JSONObject.parseObject(data.toString());
+            // 图片id
+            String id = dataObject.getString("id");
+//            JSONObject id1 = dataObject.getJSONObject("id");
+//            String id = id1.toJSONString();
+//            String id = dataObject.getJSONObject("id").toJSONString();
+            // 检测功能(0热斑检测,1掉串检测)
+            List<String> funcIndex = dataObject.getJSONArray("funcIndex").toJavaList(String.class);
+            // 可见光图片
+            String visiblePath = dataObject.getString("visibleImagePath");
+            // 红外图片
+            String infraredPath = dataObject.getString("infraredImagePath");
+            // 识别结果
+            JSONArray detectResult = dataObject.getJSONArray("detectResult");
+            List<RecognizeMessageBo> recognizeMessageBoList = detectResult.toJavaList(RecognizeMessageBo.class);
+
+            // 将识别结果入库
+            for (RecognizeMessageBo recognizeMessageBo : recognizeMessageBoList){
+                PhotoResultEntity photoResultEntity = new PhotoResultEntity();
+                photoResultEntity.setId(IdUtil.getSnowflake().nextId());
+                photoResultEntity.setPhotoId(Long.parseLong(id));
+                photoResultEntity.setPath(visiblePath);
+                photoResultEntity.setArrayIndex(recognizeMessageBo.getArrayIndex());
+                photoResultEntity.setRowIndex(recognizeMessageBo.getRowIndex());
+                photoResultEntity.setColumnIndex(recognizeMessageBo.getColumnIndex());
+                photoResultEntity.setType(recognizeMessageBo.getResult().getType());
+                String joined = String.join(",", recognizeMessageBo.getResult().getCoordinates());
+                photoResultEntity.setCoordinates(joined);
+                log.info("======识别结果入库:" + photoResultEntity);
+                photoResultService.save(photoResultEntity);
+            }
+
+        }
+
+
+
+    }
+}

+ 9 - 0
src/main/java/com/keystar/plane/inspection/service/LoginService.java

@@ -0,0 +1,9 @@
+package com.keystar.plane.inspection.service;
+
+/**
+ *  无人机登录类
+ **/
+public interface LoginService {
+
+    String getToken() throws Exception;
+}

+ 33 - 0
src/main/java/com/keystar/plane/inspection/service/MqttService.java

@@ -0,0 +1,33 @@
+package com.keystar.plane.inspection.service;
+
+import com.drew.imaging.jpeg.JpegProcessingException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.keystar.plane.inspection.bo.PhotoMqttMessageBo;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.List;
+
+public interface MqttService {
+
+    /**
+     *  发送Mqtt给图像识别
+     **/
+    void sendMqtt(List<PhotoMqttMessageBo> messageBos) throws JsonProcessingException;
+
+    /**
+     *  发送多条图片道图像识别
+     **/
+    void sendPhotos(String path, String type) throws JsonProcessingException;
+
+    /**
+     *  发送最新架次的图片目录给图像识别
+     **/
+    void sendPhotoFile(String path, String type) throws JsonProcessingException;
+
+    /**
+     *  发送最新任务的红外图片给图像识别
+     **/
+    void sendPhotoMqtt() throws IOException, JpegProcessingException, ParseException, InterruptedException;
+
+}

+ 29 - 0
src/main/java/com/keystar/plane/inspection/service/NestService.java

@@ -0,0 +1,29 @@
+package com.keystar.plane.inspection.service;
+
+
+import com.keystar.plane.inspection.bo.DateBo;
+import com.keystar.plane.inspection.bo.PlaneInspectionBo;
+import com.keystar.plane.inspection.dao.NestStatusVo;
+
+/**
+ *  机巢状态类
+ **/
+public interface NestService {
+
+    /**
+     *  获取无人机的具体状态
+     **/
+    String getNestStatus();
+
+    /**
+     *  获取无人机的在线状态
+     **/
+    NestStatusVo getNestOnline();
+
+    /**
+     *  获取无人机的巡检任务总览
+     **/
+    PlaneInspectionBo getInspection(DateBo dateBo) throws Exception;
+
+
+}

+ 10 - 0
src/main/java/com/keystar/plane/inspection/service/PhotoResultService.java

@@ -0,0 +1,10 @@
+package com.keystar.plane.inspection.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.keystar.plane.inspection.entity.PhotoResultEntity;
+
+/**
+ *  无人机结果入库
+ **/
+public interface PhotoResultService extends IService<PhotoResultEntity> {
+}

+ 17 - 0
src/main/java/com/keystar/plane/inspection/service/PhotoService.java

@@ -0,0 +1,17 @@
+package com.keystar.plane.inspection.service;
+
+import com.drew.imaging.jpeg.JpegProcessingException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.keystar.plane.inspection.dao.PlanePhotoVo;
+
+import java.io.IOException;
+
+public interface PhotoService {
+
+    /**
+     *  通过图片判断是哪个光伏区的光伏板
+     **/
+    PlanePhotoVo queryPhoto(String filePath) throws IOException, JpegProcessingException;
+
+
+}

+ 10 - 0
src/main/java/com/keystar/plane/inspection/service/PlanePhotoService.java

@@ -0,0 +1,10 @@
+package com.keystar.plane.inspection.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.keystar.plane.inspection.entity.PlanePhotoEntity;
+
+/**
+ *  无人机图片入库
+ **/
+public interface PlanePhotoService extends IService<PlanePhotoEntity> {
+}

+ 18 - 0
src/main/java/com/keystar/plane/inspection/service/impl/LoginServiceImpl.java

@@ -0,0 +1,18 @@
+package com.keystar.plane.inspection.service.impl;
+
+import com.keystar.plane.inspection.mqtt.PlaneMqttHandler;
+import com.keystar.plane.inspection.service.LoginService;
+import com.keystar.plane.inspection.utils.FileUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class LoginServiceImpl implements LoginService {
+
+    @Override
+    public String getToken() throws Exception {
+
+        return PlaneMqttHandler.planeLogin();
+    }
+}

+ 131 - 0
src/main/java/com/keystar/plane/inspection/service/impl/MinioService.java

@@ -0,0 +1,131 @@
+package com.keystar.plane.inspection.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.keystar.plane.inspection.config.MinIoConfig;
+import io.minio.MinioClient;
+import io.minio.Result;
+import io.minio.errors.*;
+import io.minio.messages.Item;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.xmlpull.v1.XmlPullParserException;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class MinioService {
+
+    @Resource
+    private MinioClient minioClient;
+
+    @Autowired
+    private MinIoConfig minIoConfig;
+
+
+    /**
+     * 判断 bucket是否存在
+     * @param bucketName
+     * @return
+     */
+    public boolean bucketExists(String bucketName){
+        try {
+            return minioClient.bucketExists(bucketName);
+        } catch (Exception e) {
+            log.error("判断 bucket是否存在,出现错误:{}",e);
+            return false;
+        }
+    }
+
+    /**
+     * 根据 bucket 获取该桶下边的所有目录
+     * @param bucketName
+     */
+    public List<Item> listObject(String bucketName){
+        try {
+            Iterable<Result<Item>> myObjects = minioClient.listObjects(bucketName);
+            return getItems(myObjects);
+        } catch (Exception e) {
+            log.error("获取桶{}的文件内容,出现错误:{}",bucketName,e);
+            return null;
+        }
+    }
+
+    private List<Item> getItems(Iterable<Result<Item>> myObjects) throws InvalidBucketNameException, NoSuchAlgorithmException, InsufficientDataException, IOException, InvalidKeyException, NoResponseException, XmlPullParserException, ErrorResponseException, InternalException {
+        List<Item> items = CollUtil.newArrayList();
+        for (Result<Item> result : myObjects) {
+            items.add(result.get());
+        }
+        return items;
+    }
+
+    /**
+     * 获取文件流
+     * @param bucketName
+     * @param objectName
+     * @return
+     */
+    public InputStream getObject(String bucketName, String objectName)  {
+        try {
+            return minioClient.getObject(bucketName,objectName);
+        } catch (Exception e) {
+            log.error("获取桶{}的{}文件内容,出现错误:{}",bucketName,objectName,e);
+        }
+        return null;
+    }
+
+
+    /***
+     * 根据 bucket 和 prefix 获取该所有目录和文件
+     * @param bucketName
+     * @param prefix
+     * @param recursive
+     * @param useVersion1
+     * @return
+     */
+    public List<Item> listObject(String bucketName,String prefix, boolean recursive, boolean useVersion1){
+        try {
+            Iterable<Result<Item>> myObjects = minioClient.listObjects(bucketName,prefix,recursive,useVersion1);
+            return getItems(myObjects);
+        } catch (Exception e) {
+            log.error("获取桶{}的文件内容,出现错误:{}",bucketName,e);
+            return null;
+        }
+    }
+
+
+    /**
+     * 获取最新架次的红外图片地址
+     **/
+    public List<String> getInfraredPhoto(){
+        List<String> infraredList = new ArrayList<>();
+        // 获取最新航线
+        List<Item> missions = this.listObject(minIoConfig.getBucketName(), minIoConfig.getResourcePath(), false, false);
+        String missionId = missions.get(missions.size()-1).objectName();
+        // 获取最新架次
+        List<Item> records = this.listObject(minIoConfig.getBucketName(), missionId, false, false);
+        String recordsId = records.get(records.size()-1).objectName();
+        // 获取红外图片
+        List<Item> photos = this.listObject(minIoConfig.getBucketName(), recordsId, false, false);
+        List<String> photoList = photos.stream().map(Item::objectName).collect(Collectors.toList());
+        for ( String name : photoList){
+            if (name.contains("THRM.jpg") || name.contains("T.jpg")){
+                infraredList.add(name);
+            }
+        }
+        return infraredList;
+    }
+
+
+
+    
+
+}

+ 194 - 0
src/main/java/com/keystar/plane/inspection/service/impl/MqttServiceImpl.java

@@ -0,0 +1,194 @@
+package com.keystar.plane.inspection.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.drew.imaging.jpeg.JpegProcessingException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.keystar.mqtt.bo.MqttMessageBo;
+import com.keystar.plane.inspection.bo.NewFileBo;
+import com.keystar.plane.inspection.bo.PhotoMqttMessageBo;
+import com.keystar.plane.inspection.dao.PlanePhotoVo;
+import com.keystar.plane.inspection.entity.PlanePhotoEntity;
+import com.keystar.plane.inspection.service.MqttService;
+import com.keystar.plane.inspection.service.PhotoService;
+import com.keystar.plane.inspection.service.PlanePhotoService;
+import com.keystar.plane.inspection.utils.FileUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Slf4j
+@Service
+public class MqttServiceImpl implements MqttService {
+
+    @Autowired
+    MqttAsyncClient mqttAsyncClient;
+
+    @Autowired
+    PhotoService photoService;
+
+    @Autowired
+    PlanePhotoService planePhotoService;
+
+    @Autowired
+    MqttService mqttService;
+
+
+
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+    @Override
+    public void sendMqtt(List<PhotoMqttMessageBo> messageBos) throws JsonProcessingException {
+        MqttMessage mqttMessage = new MqttMessage();
+        Map<String, Object> map = new HashMap<>();
+        map.put("data", messageBos);
+        byte[] bytes = OBJECT_MAPPER.writeValueAsBytes(map);
+        mqttMessage.setPayload(bytes);
+        try {
+            mqttAsyncClient.publish("LightSpot_recognize",mqttMessage);
+        } catch (MqttException e) {
+
+        }
+    }
+
+    /**
+     *  发送最新任务图片目录给图像识别
+     **/
+    @Override
+    public void sendPhotos(String path, String type) throws JsonProcessingException {
+        // 获取新图片的minio地址
+//        List<String> newPhoto = FileUtil.getNewPhoto(path);
+//        MqttMessage mqttMessage = new MqttMessage();
+//        for (String photoPath : newPhoto){
+//            // 先初步判断
+//
+//
+//            // 每张图片单独发一个MQ
+//            PhotoMqttMessageBo mqttMessageBo = new PhotoMqttMessageBo();
+//            mqttMessageBo.setFuncIndex(type);
+//            mqttMessageBo.setInfraredImagePath(photoPath);
+//            byte[] bytes = OBJECT_MAPPER.writeValueAsBytes(mqttMessageBo);
+//            mqttMessage.setPayload(bytes);
+//            try {
+//                mqttAsyncClient.publish("LightSpot_recognize",mqttMessage);
+//            } catch (MqttException e) {
+//
+//            }
+//        }
+    }
+
+    /**
+     *  发送最新图片目录mqtt给图像
+     **/
+    @Override
+    public void sendPhotoFile(String path, String type) throws JsonProcessingException {
+        // 获取最新修改的目录地址
+//        String newFilePath = FileUtil.getNewFilePath();
+//
+//        PhotoMqttMessageBo photoMqttMessageBo = new PhotoMqttMessageBo();
+//        Map<String, List<PhotoMqttMessageBo>> map = new HashMap<>();
+//        photoMqttMessageBo.setFunc_index("0");
+//        photoMqttMessageBo.setInfrared_image_path(path);
+//        MqttMessage mqttMessage = new MqttMessage();
+//        List<PhotoMqttMessageBo> messageBoList = new ArrayList<>();
+//        messageBoList.add(photoMqttMessageBo);
+//        map.put("data", messageBoList);
+//        byte[] bytes = OBJECT_MAPPER.writeValueAsBytes(map);
+//        mqttMessage.setPayload(bytes);
+//        try {
+//            mqttAsyncClient.publish("sunboard_recognize_result",mqttMessage);
+//        } catch (MqttException e) {
+//
+//        }
+    }
+
+    @Override
+    public void sendPhotoMqtt() throws IOException, JpegProcessingException, ParseException, InterruptedException {
+//        NewFileBo newFile = FileUtil.getNewFilePath();
+        NewFileBo newFile = new NewFileBo();
+        newFile.setMissionId(2418);
+        newFile.setRecordId(1869);
+        newFile.setPath("/data/autoUpload/photo/"+ "2418" + "/" + "1869");
+        log.info("=====返回的最新的图片文件目录:" + newFile.toString());
+        File path = new File(newFile.getPath());
+        log.info("=====图片目录:" + path.getPath());
+        File[] files = path.listFiles();
+        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        if (files != null){
+            log.info("======目录里面的文件数:" + files.length);
+            // 取出红外图片
+            List <PlanePhotoEntity> photoEntityList = new ArrayList<>();
+            for ( File file : files){
+                log.info("========图片名:" + file.getPath());
+                if (file.getName().contains("THRM.jpg") || file.getName().contains("T.jpg") || file.getName().contains("T.JPG") || file.getName().contains("THRM.JPG")){
+                    log.info("=======红外图片地址:" + file.getPath());
+                    // 且图片是在光伏区内
+                    PlanePhotoVo planePhotoVo = photoService.queryPhoto(file.getPath());
+                    log.info("======图片算法判断结果:"+ planePhotoVo.toString());
+                    if (planePhotoVo.getPZName() != null){
+                        // 将图片入库
+                        PlanePhotoEntity planePhotoEntity = new PlanePhotoEntity();
+                        planePhotoEntity.setId(IdUtil.getSnowflake().nextId());
+                        // minio地址
+                        String minioPath = "nest/autoUpload/photo/"+newFile.getMissionId()+"/"+newFile.getRecordId()+"/"+file.getName();
+                        planePhotoEntity.setPath(minioPath);
+                        planePhotoEntity.setPzName(planePhotoVo.getPZName());
+                        String joined = String.join(",", planePhotoVo.getPVNames());
+                        planePhotoEntity.setPvName(joined);
+                        planePhotoEntity.setTime(sd.parse(sd.format(new Date(file.lastModified()))));
+                        planePhotoEntity.setMissionId(newFile.getMissionId());
+                        planePhotoEntity.setRecordId(newFile.getRecordId());
+                        photoEntityList.add(planePhotoEntity);
+//                        planePhotoService.save(planePhotoEntity);
+//                        log.info("======将图片入库:" + planePhotoEntity.toString());
+
+//                        // 发送mqtt给图像识别
+//                        Thread.sleep(3000);
+//                        PhotoMqttMessageBo photoMqttMessageBo = new PhotoMqttMessageBo();
+//                        photoMqttMessageBo.setId(planePhotoEntity.getId());
+//                        photoMqttMessageBo.setFunc_index("0");
+//                        photoMqttMessageBo.setInfrared_image_path(minioPath);
+//                        mqttService.sendMqtt(photoMqttMessageBo);
+//                        log.info("======将图片发送mqtt给图像识别:" + photoMqttMessageBo.toString());
+
+                    }
+
+                }
+            }
+            // 遍历完图片后,一起入库和发给图像识别
+            planePhotoService.saveBatch(photoEntityList);
+            log.info("======遍历完成,将图像信息入库======");
+            List<String> funcIndex = new ArrayList<>();
+            // 二极管故障
+            funcIndex.add("1");
+            // 遮挡
+            funcIndex.add("1");
+            // 掉串
+            funcIndex.add("0");
+            List<PhotoMqttMessageBo> messageBoList = new ArrayList<>();
+            for ( PlanePhotoEntity photoEntity : photoEntityList){
+                PhotoMqttMessageBo photoMqttMessageBo = new PhotoMqttMessageBo();
+                photoMqttMessageBo.setId(photoEntity.getId());
+                photoMqttMessageBo.setFuncIndex(funcIndex);
+                photoMqttMessageBo.setVisibleImagePath("");
+                photoMqttMessageBo.setInfraredImagePath(photoEntity.getPath());
+                messageBoList.add(photoMqttMessageBo);
+            }
+            mqttService.sendMqtt(messageBoList);
+
+        }else {
+            log.info("======文件夹是空的======");
+        }
+    }
+
+
+}

+ 115 - 0
src/main/java/com/keystar/plane/inspection/service/impl/NestServiceImpl.java

@@ -0,0 +1,115 @@
+package com.keystar.plane.inspection.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.keystar.plane.inspection.bo.DateBo;
+import com.keystar.plane.inspection.bo.PlaneInspectionBo;
+import com.keystar.plane.inspection.bo.TaskMissionRecordBo;
+import com.keystar.plane.inspection.constant.UrlConstant;
+import com.keystar.plane.inspection.dao.LoginVo;
+import com.keystar.plane.inspection.dao.NestStatusVo;
+import com.keystar.plane.inspection.enums.NestStatusEnum;
+import com.keystar.plane.inspection.service.LoginService;
+import com.keystar.plane.inspection.service.NestService;
+import com.keystar.plane.inspection.utils.HttpUtils;
+import com.keystar.plane.inspection.utils.RedisUtils;
+import com.keystar.plane.inspection.utils.Utils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class NestServiceImpl implements NestService {
+
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Autowired
+    private LoginService loginService;
+
+    @Override
+    public String getNestStatus() {
+
+        String key = "PlaneInspection:nestStatus";
+        String nestStatus = redisTemplate.opsForValue().get(key);
+        NestStatusEnum statusEnum = NestStatusEnum.getNameByCode(nestStatus);
+        if (statusEnum != null){
+            return statusEnum.getName();
+        }
+        log.info("监听到MQ的状态:" + nestStatus);
+        return "未知状态";
+    }
+
+    @Override
+    public NestStatusVo getNestOnline() {
+        String key = "PlaneInspection:nestStatus";
+        String nestStatus = redisTemplate.opsForValue().get(key);
+        NestStatusVo nestStatusVo = new NestStatusVo();
+        nestStatusVo.setName("无人机状态");
+        if (NestStatusEnum.ERROR.getCode().equals(nestStatus)){
+            nestStatusVo.setStatus(0);
+            return nestStatusVo;
+        }
+        nestStatusVo.setStatus(1);
+        return nestStatusVo;
+    }
+
+
+    /**
+     *  获取无人机的巡检任务总览
+     **/
+    @Override
+    public PlaneInspectionBo getInspection(DateBo dateBo) throws Exception {
+        // 先拿token
+        String token = loginService.getToken();
+        PlaneInspectionBo planeInspectionBo = new PlaneInspectionBo();
+        if (token != null){
+            // 访问无人机任务接口
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Authorization", token);
+
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            Map<String,Object> paramMap = new HashMap<>();
+            paramMap.put("startTime",dateFormat.format(dateBo.getStartTime()));
+            paramMap.put("endTime",dateFormat.format(dateBo.getEndTime()));
+
+            String response = HttpUtils.doPost(UrlConstant.PLANE_TASK, paramMap, headers);
+            JSONObject jsonObject = JSONObject.parseObject(response);
+            JSONObject param = jsonObject.getJSONObject("param");
+            JSONObject result = param.getJSONObject("result");
+            JSONArray taskList = result.getJSONArray("taskMissionRecordsEntityList");
+            List<TaskMissionRecordBo> missionList = taskList.toJavaList(TaskMissionRecordBo.class);
+
+            planeInspectionBo.setAllTask(missionList.size());
+            int finish = 0;
+            int unfinished = 0;
+            for ( TaskMissionRecordBo recordBo : missionList){
+                if (recordBo.getTaskCount() > 0){
+                    finish +=1 ;
+                }else {
+                    unfinished +=1 ;
+                }
+            }
+            planeInspectionBo.setFinishedTask(finish);
+            planeInspectionBo.setUnfinishedTask(unfinished);
+            planeInspectionBo.setPlaneStatus(getNestStatus());
+            }
+        return planeInspectionBo;
+        }
+
+
+
+
+}

+ 13 - 0
src/main/java/com/keystar/plane/inspection/service/impl/PhotoResultServiceImpl.java

@@ -0,0 +1,13 @@
+package com.keystar.plane.inspection.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.keystar.plane.inspection.entity.PhotoResultEntity;
+import com.keystar.plane.inspection.mapper.PhotoResultMapper;
+import com.keystar.plane.inspection.service.PhotoResultService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class PhotoResultServiceImpl extends ServiceImpl<PhotoResultMapper, PhotoResultEntity> implements PhotoResultService {
+}

+ 104 - 0
src/main/java/com/keystar/plane/inspection/service/impl/PhotoServiceImpl.java

@@ -0,0 +1,104 @@
+package com.keystar.plane.inspection.service.impl;
+
+import com.drew.imaging.jpeg.JpegProcessingException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.keystar.plane.inspection.bo.Location;
+import com.keystar.plane.inspection.bo.PhotoMqttMessageBo;
+import com.keystar.plane.inspection.constant.LocationConstant;
+import com.keystar.plane.inspection.dao.PhotoMessageVo;
+import com.keystar.plane.inspection.dao.PlanePhotoVo;
+import com.keystar.plane.inspection.service.PhotoService;
+import com.keystar.plane.inspection.utils.FileUtil;
+import com.keystar.plane.inspection.utils.GisCheckUtils;
+import com.keystar.plane.inspection.utils.PhotoUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.LowerCaseConversion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ResourceUtils;
+
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+@Slf4j
+@Service
+public class PhotoServiceImpl implements PhotoService {
+
+//    @Autowired
+//    MqttAsyncClient mqttAsyncClient;
+
+//    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+
+    @Override
+    public PlanePhotoVo queryPhoto(String filePath) throws IOException, JpegProcessingException {
+        PlanePhotoVo planePhotoVo = new PlanePhotoVo();
+//            file = ResourceUtils.getFile("classpath:1114_THRM.JPG");
+        File file = new File(filePath);
+
+        // 获取图片中的信息
+        PhotoMessageVo photoMessage = PhotoUtils.getPhotoMessage(file.getPath());
+        // 根据图片信息,获取图片四个角的经纬度,判断图片在哪个光伏区
+        List<Location> degrees = PhotoUtils.getDegrees(photoMessage);
+        Location location = new Location();
+        location.setLat(photoMessage.getLatitude());
+        location.setLon(photoMessage.getLongitude());
+        for ( Map.Entry<String, List<Location>> pzMap : LocationConstant.PZLocation.entrySet()){
+            List<Location> value = pzMap.getValue();
+            // 判断第一个多边形是否全部在第二个多边形内
+//            if (GisCheckUtils.isPolygonAllInPolygon(degrees, value)){
+//                planePhotoVo.setPZName(pzMap.getKey());
+//            }
+
+            // 判断第一个多边形是否存在一个点在第二个多边形内
+//            if (GisCheckUtils.isPolygonInPolygon(degrees, value)){
+//                planePhotoVo.setPZName(pzMap.getKey());
+//            }
+
+            // 当图片与光伏区的重合面积大于图片本身面积的百分之80才判断图片属于这个光伏区
+            double photoArea = GisCheckUtils.planarPolygonAreaMeters(degrees);
+            if (GisCheckUtils.CoincidentArea(degrees, value) >= photoArea * 0.6){
+                planePhotoVo.setPZName(pzMap.getKey());
+            }
+        }
+
+        // 查出图片中包含哪些光伏板
+        if (planePhotoVo.getPZName() != null){
+            String pzName = planePhotoVo.getPZName();
+            Map<String, List<Location>> stringListMap = LocationConstant.PVLocation.get(pzName.split("FZ")[1]);
+            List<String> pvNameList = new ArrayList<>();
+            for (Map.Entry<String, List<Location>> pvMap : stringListMap.entrySet()){
+                // 判断第一个多边形是否存在一个点在第二个多边形内
+//                if (GisCheckUtils.isPolygonInPolygon(pvMap.getValue(), degrees)){
+//                    pvNameList.add(pvMap.getKey());
+//                }
+                // 判断第一个多边形是否全部在第二个多边形内
+//                if (GisCheckUtils.isPolygonAllInPolygon(pvMap.getValue(), degrees)){
+//                    pvNameList.add(pvMap.getKey());
+//                }
+
+                // 当图片与的支架重合面积大于支架本身面积的百分之80才判断这个支架属于这个图片
+                double pvArea = GisCheckUtils.planarPolygonAreaMeters(pvMap.getValue());
+                if (GisCheckUtils.CoincidentArea(degrees, pvMap.getValue()) >= pvArea * 0.6){
+                    pvNameList.add(pvMap.getKey());
+                }
+            }
+            planePhotoVo.setPVNames(pvNameList);
+        }
+
+        return planePhotoVo;
+    }
+
+
+
+}

+ 14 - 0
src/main/java/com/keystar/plane/inspection/service/impl/PlanePhotoServiceImpl.java

@@ -0,0 +1,14 @@
+package com.keystar.plane.inspection.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.keystar.plane.inspection.entity.PlanePhotoEntity;
+import com.keystar.plane.inspection.mapper.PlanePhotoMapper;
+import com.keystar.plane.inspection.service.PlanePhotoService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class PlanePhotoServiceImpl extends ServiceImpl<PlanePhotoMapper, PlanePhotoEntity> implements PlanePhotoService {
+
+}

+ 434 - 0
src/main/java/com/keystar/plane/inspection/utils/FileUtil.java

@@ -0,0 +1,434 @@
+package com.keystar.plane.inspection.utils;
+
+import cn.hutool.core.io.resource.ClassPathResource;
+import cn.hutool.core.io.resource.Resource;
+import com.alibaba.druid.util.StringUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.keystar.plane.inspection.bo.Location;
+import com.keystar.plane.inspection.bo.NewFileBo;
+import com.keystar.plane.inspection.constant.LocationConstant;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+@Slf4j
+public class FileUtil {
+
+    public static Map<String, Map<String, List<Location>>> readCurrent(String mFilePath) {
+
+        Map<String, Map<String, List<Location>>> mReMap = new HashMap<>();
+
+        FileInputStream fileInputStream = null;
+        BufferedInputStream bufferedInputStream = null;
+
+        JSONObject mFeatureJSONObject = null;
+
+        try {
+
+            StringBuffer mStringBuffer = new StringBuffer();
+
+//            fileInputStream = new FileInputStream(new File(mFilePath));
+//            bufferedInputStream = new BufferedInputStream(fileInputStream);
+            Resource resource = new ClassPathResource(mFilePath);
+            bufferedInputStream = new BufferedInputStream(resource.getStream());
+
+            byte[] bytes = new byte[1024];
+            int mReadLength = -1;
+            while ((mReadLength = bufferedInputStream.read(bytes, 0, 1024)) != -1) {
+                if (mReadLength == 1024) {
+                    mStringBuffer.append(new String(bytes));
+                }else {
+                    byte[] mBytes = new byte[mReadLength];
+                    System.arraycopy(bytes, 0, mBytes, 0, mReadLength);
+                    mStringBuffer.append(new String(mBytes));
+                }
+            }
+            String mJSONStr = mStringBuffer.toString();
+            JSONObject mJSONObject = JSONObject.parseObject(mJSONStr.replace("\t","").replace("\n", "")
+                    .replace("\r", "").replace("\\s", ""));
+            JSONArray mFeatureJSONArray = mJSONObject.getJSONArray("features");
+            for (int index = 0; index < mFeatureJSONArray.size(); index++) {
+                mFeatureJSONObject = mFeatureJSONArray.getJSONObject(index);
+                JSONObject mPropertieJSONObject = mFeatureJSONObject.getJSONObject("properties");
+                String mCurrentName = mPropertieJSONObject.getString("Name");
+                JSONObject mGeometryJSONObject = mFeatureJSONObject.getJSONObject("geometry");
+                JSONArray mCoordinateJSONArray = mGeometryJSONObject.getJSONArray("coordinates");
+                JSONArray mCoordinateLLJSONArray = mCoordinateJSONArray.getJSONArray(0);
+                List<Location> mLocationList = new ArrayList<>();
+                for (int mIndex = 0; mIndex < 4; mIndex++) {
+                    JSONArray mCoordinateLLValueJSONArray = mCoordinateLLJSONArray.getJSONArray(mIndex);
+                    Location mLocation = new Location();
+                    mLocation.setLon(mCoordinateLLValueJSONArray.getDouble(0));
+                    mLocation.setLat(mCoordinateLLValueJSONArray.getDouble(1));
+                    mLocationList.add(mLocation);
+                }
+                String[] mCurrentNameArray = mCurrentName.split("\\|");
+                String mFZKey = mCurrentNameArray[0].split("HL")[0];
+                if (!mReMap.containsKey(mFZKey)) {
+                    mReMap.put(mFZKey, new HashMap<>());
+                }
+                mReMap.get(mFZKey).put(mCurrentName, mLocationList);
+            }
+        }catch (Exception e) {
+
+        }finally {
+            if (bufferedInputStream != null) {
+                try {
+                    bufferedInputStream.close();
+                }catch (Exception e) {
+
+                }
+            }
+            if (fileInputStream != null) {
+                try {
+                    fileInputStream.close();
+                }catch (Exception e) {
+
+                }
+            }
+        }
+
+        return mReMap;
+
+    }
+
+    public static Map<String, List<Location>> readFZLatLng(String mFilePath) {
+
+        Map<String, List<Location>> mReMap = new HashMap<>();
+
+        FileInputStream fileInputStream = null;
+        BufferedInputStream bufferedInputStream = null;
+
+        JSONObject mFeatureJSONObject = null;
+
+        try {
+            StringBuffer mStringBuffer = new StringBuffer();
+
+//            fileInputStream = new FileInputStream(new File(mFilePath));
+//            bufferedInputStream = new BufferedInputStream(fileInputStream);
+            Resource resource = new ClassPathResource(mFilePath);
+            bufferedInputStream = new BufferedInputStream(resource.getStream());
+
+            byte[] bytes = new byte[1024];
+            int mReadLength = -1;
+            while ((mReadLength = bufferedInputStream.read(bytes, 0, 1024)) != -1) {
+                if (mReadLength == 1024) {
+                    mStringBuffer.append(new String(bytes));
+                }else {
+                    byte[] mBytes = new byte[mReadLength];
+                    System.arraycopy(bytes, 0, mBytes, 0, mReadLength);
+                    mStringBuffer.append(new String(mBytes));
+                }
+            }
+            String mJSONStr = mStringBuffer.toString();
+            JSONObject mJSONObject = JSONObject.parseObject(mJSONStr.replace("\t","").replace("\n", "")
+                    .replace("\r", "").replace("\\s", ""));
+            JSONArray mFeatureJSONArray = mJSONObject.getJSONArray("features");
+            for (int index = 0; index < mFeatureJSONArray.size(); index++) {
+                mFeatureJSONObject = mFeatureJSONArray.getJSONObject(index);
+                JSONObject mPropertieJSONObject = mFeatureJSONObject.getJSONObject("properties");
+                String mCurrentName = mPropertieJSONObject.getString("Name");
+                JSONObject mGeometryJSONObject = mFeatureJSONObject.getJSONObject("geometry");
+                JSONArray mCoordinateJSONArray = mGeometryJSONObject.getJSONArray("coordinates");
+                JSONArray mCoordinateLLJSONArray = mCoordinateJSONArray.getJSONArray(0);
+                List<Location> mLocationList = new ArrayList<>();
+                for (int mIndex = 0; mIndex < mCoordinateLLJSONArray.size() - 1; mIndex++) {
+                    JSONArray mCoordinateLLValueJSONArray = mCoordinateLLJSONArray.getJSONArray(mIndex);
+                    Location mLocation = new Location();
+                    mLocation.setLon(mCoordinateLLValueJSONArray.getDouble(0));
+                    mLocation.setLat(mCoordinateLLValueJSONArray.getDouble(1));
+                    mLocationList.add(mLocation);
+                }
+                mReMap.put(mCurrentName, mLocationList);
+            }
+        }catch (Exception e) {
+
+        }finally {
+            if (bufferedInputStream != null) {
+                try {
+                    bufferedInputStream.close();
+                }catch (Exception e) {
+
+                }
+            }
+            if (fileInputStream != null) {
+                try {
+                    fileInputStream.close();
+                }catch (Exception e) {
+
+                }
+            }
+        }
+
+        return mReMap;
+
+    }
+
+
+    /**
+     *  获取每个光伏板四角的经纬度坐标,存入Map中
+     **/
+    public static Map<String, Map<String, List<Location>>> ReadFileByIO(String mFilePath) {
+
+        Map<String, Map<String, List<Location>>> mReMap = new HashMap<>();
+
+        FileInputStream fileInputStream = null;
+        BufferedInputStream bufferedInputStream = null;
+
+        JSONObject mFeatureJSONObject = null;
+
+        try {
+
+            StringBuffer mStringBuffer = new StringBuffer();
+
+            fileInputStream = new FileInputStream(new File(mFilePath));
+            bufferedInputStream = new BufferedInputStream(fileInputStream);
+
+            byte[] bytes = new byte[1024];
+            int mReadLength = -1;
+            while ((mReadLength = bufferedInputStream.read(bytes, 0, 1024)) != -1) {
+                if (mReadLength == 1024) {
+                    mStringBuffer.append(new String(bytes));
+                }else {
+                    byte[] mBytes = new byte[mReadLength];
+                    System.arraycopy(bytes, 0, mBytes, 0, mReadLength);
+                    mStringBuffer.append(new String(mBytes));
+                }
+            }
+            String mJSONStr = mStringBuffer.toString();
+            JSONObject mJSONObject = JSONObject.parseObject(mJSONStr.replace("\t","").replace("\n", "")
+                    .replace("\r", "").replace("\\s", ""));
+            JSONArray mFeatureJSONArray = mJSONObject.getJSONArray("features");
+            for (int index = 0; index < mFeatureJSONArray.size(); index++) {
+                mFeatureJSONObject = mFeatureJSONArray.getJSONObject(index);
+                JSONObject mPropertieJSONObject = mFeatureJSONObject.getJSONObject("properties");
+                String mCurrentName = mPropertieJSONObject.getString("Name");
+                JSONObject mGeometryJSONObject = mFeatureJSONObject.getJSONObject("geometry");
+                JSONArray mCoordinateJSONArray = mGeometryJSONObject.getJSONArray("coordinates");
+                JSONArray mCoordinateLLJSONArray = mCoordinateJSONArray.getJSONArray(0);
+                List<Location> mLocationList = new ArrayList<>();
+                for (int mIndex = 0; mIndex < 4; mIndex++) {
+                    JSONArray mCoordinateLLValueJSONArray = mCoordinateLLJSONArray.getJSONArray(mIndex);
+                    Location mLocation = new Location();
+                    mLocation.setLon(mCoordinateLLValueJSONArray.getDouble(1));
+                    mLocation.setLat(mCoordinateLLValueJSONArray.getDouble(0));
+                    mLocationList.add(mLocation);
+                }
+                String[] mCurrentNameArray = mCurrentName.split("\\|");
+                String mFZKey = mCurrentNameArray[0].split("HL")[0];
+                if (!mReMap.containsKey(mFZKey)) {
+                    mReMap.put(mFZKey, new HashMap<>());
+                }
+                mReMap.get(mFZKey).put(mCurrentName, mLocationList);
+            }
+        }catch (Exception e) {
+
+        }finally {
+            if (bufferedInputStream != null) {
+                try {
+                    bufferedInputStream.close();
+                }catch (Exception e) {
+
+                }
+            }
+            if (fileInputStream != null) {
+                try {
+                    fileInputStream.close();
+                }catch (Exception e) {
+
+                }
+            }
+        }
+        return mReMap;
+    }
+
+    /**
+     *  获取每个光伏区多边形的经纬度坐标,存入Map中
+     **/
+    public static Map<String, List<Location>> ReadFZFileByIO(String mFilePath) {
+
+        Map<String, List<Location>> mReMap = new HashMap<>();
+
+        FileInputStream fileInputStream = null;
+        BufferedInputStream bufferedInputStream = null;
+
+        JSONObject mFeatureJSONObject = null;
+
+        try {
+
+            StringBuffer mStringBuffer = new StringBuffer();
+
+            fileInputStream = new FileInputStream(new File(mFilePath));
+            bufferedInputStream = new BufferedInputStream(fileInputStream);
+
+            byte[] bytes = new byte[1024];
+            int mReadLength = -1;
+            while ((mReadLength = bufferedInputStream.read(bytes, 0, 1024)) != -1) {
+                if (mReadLength == 1024) {
+                    mStringBuffer.append(new String(bytes));
+                }else {
+                    byte[] mBytes = new byte[mReadLength];
+                    System.arraycopy(bytes, 0, mBytes, 0, mReadLength);
+                    mStringBuffer.append(new String(mBytes));
+                }
+            }
+            String mJSONStr = mStringBuffer.toString();
+            JSONObject mJSONObject = JSONObject.parseObject(mJSONStr.replace("\t","").replace("\n", "")
+                    .replace("\r", "").replace("\\s", ""));
+            JSONArray mFeatureJSONArray = mJSONObject.getJSONArray("features");
+            for (int index = 0; index < mFeatureJSONArray.size(); index++) {
+                mFeatureJSONObject = mFeatureJSONArray.getJSONObject(index);
+                JSONObject mPropertieJSONObject = mFeatureJSONObject.getJSONObject("properties");
+                String mCurrentName = mPropertieJSONObject.getString("Name");
+                JSONObject mGeometryJSONObject = mFeatureJSONObject.getJSONObject("geometry");
+                JSONArray mCoordinateJSONArray = mGeometryJSONObject.getJSONArray("coordinates");
+                JSONArray mCoordinateLLJSONArray = mCoordinateJSONArray.getJSONArray(0);
+                List<Location> mLocationList = new ArrayList<>();
+                for (int mIndex = 0; mIndex < mCoordinateLLJSONArray.size(); mIndex++) {
+                    JSONArray mCoordinateLLValueJSONArray = mCoordinateLLJSONArray.getJSONArray(mIndex);
+                    Location mLocation = new Location();
+                    mLocation.setLon(mCoordinateLLValueJSONArray.getDouble(0));
+                    mLocation.setLat(mCoordinateLLValueJSONArray.getDouble(1));
+                    mLocationList.add(mLocation);
+                }
+                String mFZKey = mCurrentName.split("FZ")[1];
+                mReMap.put(mFZKey, mLocationList);
+            }
+        }catch (Exception e) {
+
+        }finally {
+            if (bufferedInputStream != null) {
+                try {
+                    bufferedInputStream.close();
+                }catch (Exception e) {
+
+                }
+            }
+            if (fileInputStream != null) {
+                try {
+                    fileInputStream.close();
+                }catch (Exception e) {
+
+                }
+            }
+        }
+        return mReMap;
+    }
+
+    /**
+     * 获取最新任务的红外图片地址
+     **/
+    public static List<String> getNewPhoto(String photoPath){
+        // 获取最新修改的航线
+//        File path = new File("/data/autoUpload/photo/");
+//        File path = new File("C:\\Users\\KR0282\\Desktop\\photo");
+        File path = new File(photoPath);
+        File[] files = path.listFiles();
+        File[] sort = fileSort(files);
+        String missionName = sort[0].getName();
+        log.info("最新修改的航线是:" + missionName);
+
+        // 获取最新的架次
+//        File record = new File("/data/autoUpload/photo/" + missionName);
+        File record = new File(path.getPath() +"\\"+ missionName);
+        File[] records = record.listFiles();
+        File[] sort1 = fileSort(records);
+        String recordName = sort1[0].getName();
+        log.info("最新的架次是:" + recordName);
+
+        // 获取最新架次里面的红外图片
+        File photoFile = new File(record.getPath() + "\\" + recordName);
+        File[] photos = photoFile.listFiles();
+        List<String> photoList = new ArrayList<>();
+        if (photos != null){
+            for (File file : photos){
+                String name = file.getName();
+                if (name.contains("THRM.jpg") || name.contains("T.jpg")){
+                    photoList.add("/nest/autoUpload/photo"+ "/" + missionName + "/" + recordName + "/" + name);
+                }
+            }
+        }
+
+        return photoList;
+    }
+
+
+    /**
+     *  将文件按时间排序,最新的在前
+     **/
+    public static File[] fileSort(File[] files){
+        Arrays.sort(files, new Comparator<File>() {
+            @Override
+            public int compare(File file1, File file2) {
+                return (int)(file2.lastModified()-file1.lastModified());
+            }
+        });
+        return files;
+    }
+
+    /**
+     *  查询minio中最新目录
+     **/
+    public static NewFileBo getNewFilePath(){
+        // 获取最新修改的航线
+        File path = new File("/data/autoUpload/photo/");
+//        File path = new File("C:\\Users\\KR0282\\Desktop\\photo");
+//        File path = new File(photoPath);
+        File[] files = path.listFiles();
+        File[] sort = fileSort(files);
+        String missionName = sort[0].getName();
+        log.info("最新修改的航线是:" + missionName);
+
+        // 获取最新的架次
+//        File record = new File("/data/autoUpload/photo/" + missionName);
+        File record = new File(path.getPath() +"/"+ missionName);
+        File[] records = record.listFiles();
+        String recordName ;
+        // 文件大于一个才进行排序
+        if (records.length > 1){
+            File[] sort1 = fileSort(records);
+            recordName = sort1[0].getName();
+        }else {
+            recordName = records[0].getName();
+        }
+        log.info("最新的架次是:" + recordName);
+        NewFileBo newFileBo = new NewFileBo();
+        newFileBo.setMissionId(Integer.valueOf(missionName));
+        newFileBo.setRecordId(Integer.valueOf(recordName));
+        newFileBo.setPath("/data/autoUpload/photo/"+ missionName + "/" + recordName);
+//        newFileBo.setPath("C:\\Users\\KR0282\\Desktop\\photo\\"+ missionName + "\\" + recordName);
+        return newFileBo;
+    }
+
+    /**
+     *  读取读取resources目录下的文件
+     **/
+    public static String getContent(String filePath){
+        String res = "";
+        if(StringUtils.isEmpty(filePath)){
+            log.info("文件路径不能为空");
+            return res;
+        }
+        try {
+            Resource resource = new ClassPathResource(filePath);
+            BufferedReader br = new BufferedReader(new InputStreamReader(resource.getStream(), StandardCharsets.UTF_8));
+            StringBuilder sb = new StringBuilder();
+            String str = "";
+            while((str=br.readLine())!=null) {
+                sb.append(str);
+            }
+            res = sb.toString();
+        } catch (Exception e) {
+            log.info("读取文件{}时发生异常",filePath);
+            e.printStackTrace();
+        }
+        return res;
+
+    }
+
+    // String Content = FileUtil.getContent("pv.json");
+
+}

+ 87 - 0
src/main/java/com/keystar/plane/inspection/utils/FileUtils.java

@@ -0,0 +1,87 @@
+package com.keystar.plane.inspection.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.util.ResourceUtils;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class FileUtils {
+    /**
+     * 从json文件中读取数据
+     */
+    public static String getDataFromJsonFile() throws FileNotFoundException {
+
+        StringBuilder jsonString = new StringBuilder();
+        File file = ResourceUtils.getFile("classpath:pv.json");
+        if (file.exists()) {
+            BufferedReader bufferedReader = null;
+            try {
+//                bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
+//                char[] chars = new char[100000];
+//                int length;
+//                while ((length = bufferedReader.read(chars)) != -1) {
+//                    String temp = new String(chars, 0, length);
+//                    jsonString.append(temp);
+//                }
+                bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
+                char[] chars =  new char[1000];
+                while (bufferedReader.read(chars, 0, chars.length) > 0){
+                    String temp = new String(chars, 0, chars.length);
+                    jsonString.append(temp);
+                }
+            } catch (IOException e) {
+                System.out.println("=====获取数据异常=====" + e);
+            } finally {
+                if (null != bufferedReader) {
+                    try {
+                        bufferedReader.close();
+                    } catch (IOException ex) {
+                        System.out.println("=======获取数据时,关闭流异常=======" + ex);
+                    }
+                }
+            }
+        }
+        return jsonString.toString();
+    }
+
+
+
+    /**
+     *  读取json文件
+     **/
+    public static String getPVJson() throws IOException {
+        File file = ResourceUtils.getFile("classpath:pv.json");
+        try(FileInputStream fileInputStream = new FileInputStream(file)) {
+            int size = fileInputStream.available();
+            StringBuilder jsonString = new StringBuilder();
+            for (int i = 0; i <= size; i+=1000) {
+                byte[] buffer = new byte[1000];
+                fileInputStream.read(buffer);
+                String str = new String(buffer, StandardCharsets.UTF_8);
+                jsonString.append(str);
+            }
+            return jsonString.toString();
+        }
+    }
+
+    public static Map<String, List> jsonTransData (String payload){
+        JSONObject jsonObject = JSON.parseObject(payload);
+        List<JSONObject> featureList = (List<JSONObject>)jsonObject.get("features");
+        Map<String,List> result = new HashMap<>();
+        for (int i = 0; i<featureList.size(); i++){
+            JSONObject object1 = featureList.get(i);
+            List<List> coordinatesAll = (List<List>) object1.get("coordinates");
+            List<List> coordinates = coordinatesAll.get(0);
+            JSONObject properties = (JSONObject) object1.get("properties");
+            result.put((String) properties.get("名称"),coordinates);
+        }
+        return result;
+    }
+
+
+}

+ 57 - 0
src/main/java/com/keystar/plane/inspection/utils/FtpUtils.java

@@ -0,0 +1,57 @@
+package com.keystar.plane.inspection.utils;
+
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPFile;
+
+import java.io.IOException;
+
+public class FtpUtils {
+
+    /**
+     *  获取服务器中最新的文件
+     **/
+    public static void getFtpFile() {
+        String server = "10.138.6.221";
+        int port = 22;
+        String user = "root";
+        String pass = "keystar";
+        FTPClient ftpClient = new FTPClient();
+        try {
+            ftpClient.connect(server, port);
+            ftpClient.login(user, pass);
+            ftpClient.enterLocalPassiveMode();
+            String remoteFilePath = "/data/minio/data/nest/autoUpload/photo/";
+//            FTPFile[] ftpFiles = ftpClient.listFiles(remoteFilePath);
+            FTPFile ftpFile = ftpClient.mlistFile(remoteFilePath);
+            if (ftpFile != null) {
+                String name = ftpFile.getName();
+                long size = ftpFile.getSize();
+                String timestamp = ftpFile.getTimestamp().getTime().toString();
+                String type = ftpFile.isDirectory() ? "Directory" : "File";
+                System.out.println("Name: " + name);
+                System.out.println("Size: " + size);
+                System.out.println("Type: " + type);
+                System.out.println("Timestamp: " + timestamp);
+            } else {
+                System.out.println("文件不存在");
+            }
+            ftpClient.logout();
+            ftpClient.disconnect();
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            if (ftpClient.isConnected()) {
+                try {
+                    ftpClient.disconnect();
+                } catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+            }
+        }
+    }
+
+
+
+
+}

+ 744 - 0
src/main/java/com/keystar/plane/inspection/utils/GisCheckUtils.java

@@ -0,0 +1,744 @@
+package com.keystar.plane.inspection.utils;
+
+import com.keystar.plane.inspection.bo.Line;
+import com.keystar.plane.inspection.bo.Location;
+import lombok.extern.slf4j.Slf4j;
+
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Line2D;
+import java.util.*;
+
+/**
+ * @program:
+ * @description 获取两条经纬度线段的交点坐标工具类
+ * @author: Lucien
+ * @create: 2020-11-27 09:21
+ **/
+@Slf4j
+public class GisCheckUtils {
+    /**
+     * 地球周长
+     */
+    private static double L = 6381372 * Math.PI * 2;
+    /**
+     * 平面展开后,x轴等于周长
+     */
+    private static double W = L;
+    /**
+     * y轴约等于周长一半
+     */
+    private static double H = L / 2;
+    /**
+     * 米勒投影中的一个常数,范围大约在正负2.3之间
+     */
+    private static double mill = 2.3;
+
+
+    /**
+     * 地球半径(米)
+     * 6371000.0 ~ 6371009.0
+     */
+    private static double earthRadiusMeters = 6371006.0;
+
+    /**
+     * 米每度
+     */
+    private static double metersPerDegree = 2.0 * Math.PI * earthRadiusMeters / 360.0;
+
+    /**
+     * 弧度每度
+     */
+    private static double radiansPerDegree = Math.PI / 180.0;
+
+
+
+    /**
+     * 将经纬度转换成X和Y轴
+     * 米勒投影算法
+     *
+     * @param lat 纬度
+     * @param lon 经度
+     * @return
+     */
+    private static Point millierConvertion(double lat, double lon) {
+        // 将经度从度数转换为弧度
+        double x = lon * Math.PI / 180;
+        // 将纬度从度数转换为弧度
+        double y = lat * Math.PI / 180;
+        // 米勒投影的转换
+        y = 1.25 * Math.log(Math.tan(0.25 * Math.PI + 0.4 * y));
+        // 弧度转为实际距离
+        x = (W / 2) + (W / (2 * Math.PI)) * x;
+        y = (H / 2) - (H / (2 * mill)) * y;
+        return new Point(x, y);
+    }
+
+    /**
+     * xy轴转坐标
+     *
+     * @param x
+     * @param y
+     * @return 坐标点
+     */
+    private static Location xyToLocation(double x, double y) {
+        //实际距离 转为弧度
+        x = (x - (W / 2)) / (W / (2 * Math.PI));
+        y = -1 * (y - (H / 2)) / (H / (2 * mill));
+        // 米勒投影的转换反转
+        y = (Math.atan(Math.pow(Math.E, y / 1.25)) - 0.25 * Math.PI) / 0.4;
+        //将经度从弧度转换为度数
+        double lon = 180 / Math.PI * x;
+        //将纬度从弧度转换为度数
+        double lat = 180 / Math.PI * y;
+        return new Location(lon, lat);
+    }
+
+
+    /**
+     * 获取两条直线相交的点
+     *
+     * @param LineOne 线段一
+     * @param LineTwo 线段二
+     * @return 相交点坐标  为null 不相交
+     */
+    public static Location getIntersectPoint(Line LineOne, Line LineTwo) {
+        //先判断有没有相交 (延长线不算) 不相交返回null 相交执行获取交点坐标 (如需获取延长线交点注释此方法)----
+        if (!segIntersect(LineOne, LineTwo)) {
+            return null;
+        }
+
+        //转换对象
+        Point[] points = LineToPoint(LineOne, LineTwo);
+        //获取两条直线相交的点
+        Point Location = getIntersectPoint(points[0], points[1], points[2], points[3]);
+        if (Location != null) {
+            return xyToLocation(Location.x, Location.y);
+        }
+        return null;
+    }
+    /**
+     * 获取两条直线list所有相交的点
+     *
+     * @param LineOneList 线段集合一
+     * @param LineTwoList 线段集合二
+     * @return 相交点坐标  为null 不相交
+     */
+    public static List<Location> getIntersectPointList(List<Line> LineOneList, List<Line> LineTwoList) {
+        List<Location> locationList = new ArrayList<>();
+        for (Line line : LineOneList) {
+            for (Line line1 : LineTwoList) {
+                Location location = getIntersectPoint(line,line1);
+                if (Objects.nonNull(location)) {
+                    locationList.add(location);
+                }
+            }
+        }
+        return locationList;
+    }
+
+    /**
+     * 获取两条直线相交的点
+     *
+     * @param p1 线段一 开始点
+     * @param p2 线段一 结束点
+     * @param p3 线段二 开始点
+     * @param p4 线段二 结束点
+     * @return
+     */
+    public static Point getIntersectPoint(Point p1, Point p2, Point p3, Point p4) {
+
+        double A1 = p1.getY() - p2.getY();
+        double B1 = p2.getX() - p1.getX();
+        double C1 = A1 * p1.getX() + B1 * p1.getY();
+
+        double A2 = p3.getY() - p4.getY();
+        double B2 = p4.getX() - p3.getX();
+        double C2 = A2 * p3.getX() + B2 * p3.getY();
+
+        double det_k = A1 * B2 - A2 * B1;
+
+        if (Math.abs(det_k) < 0.00001) {
+            return null;
+        }
+
+        double a = B2 / det_k;
+        double b = -1 * B1 / det_k;
+        double c = -1 * A2 / det_k;
+        double d = A1 / det_k;
+
+        double x = a * C1 + b * C2;
+        double y = c * C1 + d * C2;
+
+        return new Point(x, y);
+    }
+
+    /**
+     * 验证两条线有没有相交
+     *
+     * @param LineOne 线段1
+     * @param LineTwo 线段2
+     * @return true 相交
+     */
+    public static boolean segIntersect(Line LineOne, Line LineTwo) {
+        //转换对象
+        Point[] points = LineToPoint(LineOne, LineTwo);
+        //验证两条线有没有相交
+        return segIntersect(points[0], points[1], points[2], points[3]) > 0;
+
+    }
+
+    /**
+     * 线段转换为点对象
+     *
+     * @param LineOne 线段一
+     * @param LineTwo 线段二
+     * @return 点对象数组
+     */
+    private static Point[] LineToPoint(Line LineOne, Line LineTwo) {
+        //线段1
+        Double oneStartLat = LineOne.getStartLocation().getLat();
+        Double oneStartLon = LineOne.getStartLocation().getLon();
+        Double oneEndLat = LineOne.getEndLocation().getLat();
+        Double oneEndLon = LineOne.getEndLocation().getLon();
+        // 线段2
+        Double twoStartLat = LineTwo.getStartLocation().getLat();
+        Double twoStartLon = LineTwo.getStartLocation().getLon();
+        Double twoEndLat = LineTwo.getEndLocation().getLat();
+        Double twoEndLon = LineTwo.getEndLocation().getLon();
+        Point[] points = new Point[4];
+        //将经纬度转换成X和Y轴
+        points[0] = millierConvertion(oneStartLat, oneStartLon);
+        points[1] = millierConvertion(oneEndLat, oneEndLon);
+        points[2] = millierConvertion(twoStartLat, twoStartLon);
+        points[3] = millierConvertion(twoEndLat, twoEndLon);
+
+        return points;
+
+    }
+
+    /**
+     * 验证两条线有没有相交
+     *
+     * @param A 线段一 开始点
+     * @param B 线段一 结束点
+     * @param C 线段二 开始点
+     * @param D 线段二 结束点
+     * @return
+     */
+    public static int segIntersect(Point A, Point B, Point C, Point D) {
+        Point intersection = new Point();
+
+        if (Math.abs(B.getY() - A.getY()) + Math.abs(B.getX() - A.getX()) + Math.abs(D.getY() - C.getY())
+                + Math.abs(D.getX() - C.getX()) == 0) {
+            if ((C.getX() - A.getX()) + (C.getY() - A.getY()) == 0) {
+                log.info("ABCD是同一个点!");
+            } else {
+                log.info("AB是一个点,CD是一个点,且AC不同!");
+            }
+            return 0;
+        }
+
+        if (Math.abs(B.getY() - A.getY()) + Math.abs(B.getX() - A.getX()) == 0) {
+            if ((A.getX() - D.getX()) * (C.getY() - D.getY()) - (A.getY() - D.getY()) * (C.getX() - D.getX()) == 0) {
+                log.info("A、B是一个点,且在CD线段上!");
+            } else {
+                log.info("A、B是一个点,且不在CD线段上!");
+            }
+            return 0;
+        }
+        if (Math.abs(D.getY() - C.getY()) + Math.abs(D.getX() - C.getX()) == 0) {
+            if ((D.getX() - B.getX()) * (A.getY() - B.getY()) - (D.getY() - B.getY()) * (A.getX() - B.getX()) == 0) {
+                log.info("C、D是一个点,且在AB线段上!");
+            } else {
+                log.info("C、D是一个点,且不在AB线段上!");
+            }
+            return 0;
+        }
+
+        if ((B.getY() - A.getY()) * (C.getX() - D.getX()) - (B.getX() - A.getX()) * (C.getY() - D.getY()) == 0) {
+            log.info("线段平行,无交点!");
+            return 0;
+        }
+
+        intersection
+                .setX(((B.getX() - A.getX()) * (C.getX() - D.getX())
+                        * (C.getY() - A.getY()) - C.getX()
+                        * (B.getX() - A.getX()) * (C.getY() - D.getY()) + A
+                        .getX() * (B.getY() - A.getY()) * (C.getX() - D.getX()))
+                        / ((B.getY() - A.getY()) * (C.getX() - D.getX()) - (B
+                        .getX() - A.getX()) * (C.getY() - D.getY())));
+        intersection
+                .setY(((B.getY() - A.getY()) * (C.getY() - D.getY())
+                        * (C.getX() - A.getX()) - C.getY()
+                        * (B.getY() - A.getY()) * (C.getX() - D.getX()) + A
+                        .getY() * (B.getX() - A.getX()) * (C.getY() - D.getY()))
+                        / ((B.getX() - A.getX()) * (C.getY() - D.getY()) - (B
+                        .getY() - A.getY()) * (C.getX() - D.getX())));
+
+        if ((intersection.getX() - A.getX()) * (intersection.getX() - B.getX()) <= 0
+                && (intersection.getX() - C.getX())
+                * (intersection.getX() - D.getX()) <= 0
+                && (intersection.getY() - A.getY())
+                * (intersection.getY() - B.getY()) <= 0
+                && (intersection.getY() - C.getY())
+                * (intersection.getY() - D.getY()) <= 0) {
+
+            if ((A.getX() == C.getX() && A.getY() == C.getY()) || (A.getX() == D.getX() && A.getY() == D.getY())
+                    || (B.getX() == C.getX() && B.getY() == C.getY()) || (B.getX() == D.getX() && B.getY() == D.getY())) {
+
+//                log.info("线段相交于端点上");
+                return 2;
+            } else {
+//                log.info("线段相交于点(" + intersection.getX() + ","
+//                        + intersection.getY() + ")!");
+                //相交
+                return 1;
+            }
+        } else {
+//            log.info("线段相交于虚交点(" + intersection.getX() + ","
+//                    + intersection.getY() + ")!");
+            //相交但不在线段上
+            return -1;
+        }
+    }
+    /**
+     * 点对象
+     */
+    public static class Point {
+        private double x;
+        private double y;
+
+        public Point() {
+        }
+
+        public Point(double x, double y) {
+            this.x = x;
+            this.y = y;
+        }
+
+        @Override
+        public String toString() {
+            return  x  + ","+ y ;
+        }
+
+        public double getX() {
+            return x;
+        }
+
+        public void setX(double x) {
+            this.x = x;
+        }
+
+        public double getY() {
+            return y;
+        }
+
+        public void setY(double y) {
+            this.y = y;
+        }
+
+    }
+
+    /**
+     * 球面积计算公式
+     *
+     * @param locationList
+     * @return
+     */
+    public static double calculatePolygonArea(List<Location> locationList) {
+        double area = 0;
+        int size = locationList.size();
+        if (size > 2) {
+            double LowX = 0.0;
+            double LowY = 0.0;
+            double MiddleX = 0.0;
+            double MiddleY = 0.0;
+            double HighX = 0.0;
+            double HighY = 0.0;
+
+            double AM = 0.0;
+            double BM = 0.0;
+            double CM = 0.0;
+
+            double AL = 0.0;
+            double BL = 0.0;
+            double CL = 0.0;
+
+            double AH = 0.0;
+            double BH = 0.0;
+            double CH = 0.0;
+
+            double CoefficientL = 0.0;
+            double CoefficientH = 0.0;
+
+            double ALtangent = 0.0;
+            double BLtangent = 0.0;
+            double CLtangent = 0.0;
+
+            double AHtangent = 0.0;
+            double BHtangent = 0.0;
+            double CHtangent = 0.0;
+
+            double ANormalLine = 0.0;
+            double BNormalLine = 0.0;
+            double CNormalLine = 0.0;
+
+            double OrientationValue = 0.0;
+
+            double AngleCos = 0.0;
+
+            double Sum1 = 0.0;
+            double Sum2 = 0.0;
+            double Count2 = 0;
+            double Count1 = 0;
+
+            double Sum = 0.0;
+            double Radius = 6378000;
+
+            for (int i = 0; i < size; i++) {
+                if (i == 0) {
+                    LowX = locationList.get(size - 1).getLon() * Math.PI / 180;
+                    LowY = locationList.get(size - 1).getLat() * Math.PI / 180;
+                    MiddleX = locationList.get(0).getLon() * Math.PI / 180;
+                    MiddleY = locationList.get(0).getLat() * Math.PI / 180;
+                    HighX = locationList.get(1).getLon() * Math.PI / 180;
+                    HighY = locationList.get(1).getLat() * Math.PI / 180;
+                } else if (i == size - 1) {
+                    LowX = locationList.get(size - 2).getLon() * Math.PI / 180;
+                    LowY = locationList.get(size - 2).getLat() * Math.PI / 180;
+                    MiddleX = locationList.get(size - 1).getLon() * Math.PI / 180;
+                    MiddleY = locationList.get(size - 1).getLat() * Math.PI / 180;
+                    HighX = locationList.get(0).getLon() * Math.PI / 180;
+                    HighY = locationList.get(0).getLat() * Math.PI / 180;
+                } else {
+                    LowX = locationList.get(i - 1).getLon() * Math.PI / 180;
+                    LowY = locationList.get(i - 1).getLat() * Math.PI / 180;
+                    MiddleX = locationList.get(i).getLon() * Math.PI / 180;
+                    MiddleY = locationList.get(i).getLat() * Math.PI / 180;
+                    HighX = locationList.get(i + 1).getLon() * Math.PI / 180;
+                    HighY = locationList.get(i + 1).getLat() * Math.PI / 180;
+                }
+
+                AM = Math.cos(MiddleY) * Math.cos(MiddleX);
+                BM = Math.cos(MiddleY) * Math.sin(MiddleX);
+                CM = Math.sin(MiddleY);
+                AL = Math.cos(LowY) * Math.cos(LowX);
+                BL = Math.cos(LowY) * Math.sin(LowX);
+                CL = Math.sin(LowY);
+                AH = Math.cos(HighY) * Math.cos(HighX);
+                BH = Math.cos(HighY) * Math.sin(HighX);
+                CH = Math.sin(HighY);
+
+                CoefficientL = (AM * AM + BM * BM + CM * CM) / (AM * AL + BM * BL + CM * CL);
+                CoefficientH = (AM * AM + BM * BM + CM * CM) / (AM * AH + BM * BH + CM * CH);
+
+                ALtangent = CoefficientL * AL - AM;
+                BLtangent = CoefficientL * BL - BM;
+                CLtangent = CoefficientL * CL - CM;
+                AHtangent = CoefficientH * AH - AM;
+                BHtangent = CoefficientH * BH - BM;
+                CHtangent = CoefficientH * CH - CM;
+
+                AngleCos = (AHtangent * ALtangent + BHtangent * BLtangent + CHtangent * CLtangent) / (
+                        Math.sqrt(AHtangent * AHtangent + BHtangent * BHtangent + CHtangent * CHtangent)
+                                * Math.sqrt(ALtangent * ALtangent + BLtangent * BLtangent
+                                + CLtangent * CLtangent));
+
+                AngleCos = Math.acos(AngleCos);
+
+                ANormalLine = BHtangent * CLtangent - CHtangent * BLtangent;
+                BNormalLine = 0 - (AHtangent * CLtangent - CHtangent * ALtangent);
+                CNormalLine = AHtangent * BLtangent - BHtangent * ALtangent;
+
+                if (AM != 0) {
+                    OrientationValue = ANormalLine / AM;
+                } else if (BM != 0) {
+                    OrientationValue = BNormalLine / BM;
+                } else {
+                    OrientationValue = CNormalLine / CM;
+                }
+
+                if (OrientationValue > 0) {
+                    Sum1 += AngleCos;
+                    Count1++;
+                } else {
+                    Sum2 += AngleCos;
+                    Count2++;
+                    //Sum +=2*Math.PI-AngleCos;
+                }
+            }
+            if (Sum1 > Sum2) {
+                Sum = Sum1 + (2 * Math.PI * Count2 - Sum2);
+            } else {
+                Sum = (2 * Math.PI * Count1 - Sum1) + Sum2;
+            }
+            //平方米
+            area = (Sum - (size - 2) * Math.PI) * Radius * Radius;
+        }
+        return Math.abs(area);
+    }
+    /**
+     * 求重合面积
+     *
+     * @param circleList
+     * @param locationList
+     * @return
+     */
+    public static double CoincidentArea(List<Location> circleList, List<Location> locationList) {
+        List<Location> areaList = new ArrayList<>();
+        //先处理所有的点,防止顺序不对
+        circleList = sortLocation(circleList);
+        locationList = sortLocation(locationList);
+        //获取圈地线段
+        List<Line> circleLineList = getLines(circleList);
+        //获取线段
+        List<Line> lineList = getLines(locationList);
+
+        //判断是否相交
+        boolean isIntersect = isIntersect(circleLineList, lineList);
+        if (isIntersect) {
+            areaList = GisCheckUtils.getIntersectPointList(circleLineList, lineList);
+            //判断圈地的点是否在范围内
+            for (Location location : circleList) {
+                boolean isPointInPolygon = isPointInPolygon(location, locationList);
+                if (isPointInPolygon){
+                    areaList.add(location);
+                }
+            }
+            //判断是否在圈地的点范围内
+            for (Location location : locationList) {
+                boolean isPointInPolygon = isPointInPolygon(location, circleList);
+                if (isPointInPolygon) {
+                    areaList.add(location);
+                }
+            }
+
+//            double area = GisCheckUtils.calculatePolygonArea(sortLocation(areaList));
+            double area = GisCheckUtils.planarPolygonAreaMeters(sortLocation(areaList));
+            log.info("重合区域面积为: " + area + "平方米");
+            return area;
+        }
+        //如果不相交判断是否包含-由于没有相交线段只要存在点在多边形内就说明包含
+        //先判断圈地是否被包含
+        boolean isPointInPolygon = isPolygonInPolygon(circleList,locationList);
+        if (isPointInPolygon) {
+//            double area = GisCheckUtils.calculatePolygonArea(circleList);
+            double area = GisCheckUtils.planarPolygonAreaMeters(circleList);
+            log.info("重合区域面积为: " + area + "平方米");
+            return area;
+        }
+        //如果不相交判断是否包含-由于没有相交线段只要存在点在多边形内就说明包含
+        //再判断圈地是否包含
+        isPointInPolygon = isPolygonInPolygon(locationList,circleList);
+        if (isPointInPolygon) {
+//            double area = GisCheckUtils.calculatePolygonArea(locationList);
+            double area = GisCheckUtils.planarPolygonAreaMeters(locationList);
+            log.info("重合区域面积为: " + area + "平方米");
+            return area;
+        }
+        return  0;
+    }
+    /**
+     * 判断第一个多边形是否存在一个点在第二个多边形内
+     *
+     * @param locationList1
+     * @param locationList2
+     * @return
+     */
+    public static boolean isPolygonInPolygon(List<Location> locationList1, List<Location> locationList2) {
+
+        //判断第一个多边形是否在第二个多边形内
+        for (Location location : locationList1) {
+            boolean isPointInPolygon = isPointInPolygon(location, locationList2);
+            if (isPointInPolygon) return true;
+        }
+        return false;
+    }
+
+    /**
+     * 判断第一个多边形是否全部在第二个多边形内
+     *
+     * @param locationList1
+     * @param locationList2
+     * @return
+     */
+    public static boolean isPolygonAllInPolygon(List<Location> locationList1, List<Location> locationList2) {
+
+        //判断第一个多边形是否在第二个多边形内
+        for (Location location : locationList1) {
+            boolean isPointInPolygon = isPointInPolygon(location, locationList2);
+            if (!isPointInPolygon) return false;
+        }
+        return true;
+    }
+
+    /**
+     * 判断点是否在多边形内
+     *
+     * @param location
+     * @param locationList2
+     * @return
+     */
+    public static boolean isPointInPolygon(Location location, List<Location> locationList2) {
+        //点是否在多边形内
+        GeneralPath path = new GeneralPath();
+        //设定多边形起始点
+        path.moveTo(locationList2.get(0).getLon(), locationList2.get(0).getLat());
+        for (Location l : locationList2) {
+            path.lineTo(l.getLon(), l.getLat());
+        }
+        //图像完成,封闭
+        path.moveTo(locationList2.get(0).getLon(), locationList2.get(0).getLat());
+        //多边形结束
+        path.closePath();
+        return path.contains(location.getLon(), location.getLat());
+    }
+    /**
+     * 判断线段是否相交
+     *
+     * @param lineList
+     * @param lineList2
+     * @return
+     */
+    private static boolean isIntersect(List<Line> lineList, List<Line> lineList2) {
+        for (Line line : lineList) {
+            for (Line line1 : lineList2) {
+                //两条线段是否相交
+                boolean b = Line2D.linesIntersect(line.getStartLocation().getLon(), line.getStartLocation().getLat(), line.getEndLocation().getLon(), line.getEndLocation().getLat(),
+                        line1.getStartLocation().getLon(), line1.getStartLocation().getLat(), line1.getEndLocation().getLon(), line1.getEndLocation().getLat());
+                if (b) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 根据点获取线段
+     *
+     * @param locationList
+     * @return
+     */
+    private static List<Line> getLines(List<Location> locationList) {
+        List<Line> lineList = new ArrayList();
+        for (int i = 0; i < locationList.size(); i++) {
+            if (i < locationList.size() - 1) {
+                Location l = locationList.get(i);
+                Location l2 = locationList.get(i + 1);
+                Line line = new Line(l, l2);
+                lineList.add(line);
+            } else {
+                Location l = locationList.get(i);
+                Location l2 = locationList.get(0);
+                Line line = new Line(l, l2);
+                lineList.add(line);
+            }
+        }
+        return lineList;
+    }
+
+    /**
+     * 将多边形的点排序
+     *
+     * @param locationList
+     * @return
+     */
+    public static List<Location> sortLocation(List<Location> locationList) {
+        double plusX = 0, plusY = 0;
+
+        for (Location location : locationList) {
+
+            plusX += location.getLon();
+
+            plusY += location.getLat();
+
+        }
+        Location location = new Location(plusX / locationList.size(), plusY / locationList.size());
+
+        Map<Integer,List> mapAll = new HashMap<>();
+        for (int i = 0; i < locationList.size(); i++) {
+            //第一个放经纬度 第二个放角度
+            List objList = new ArrayList<>();
+            objList.add(locationList.get(i));
+            objList.add(getAngle1(location.getLat(), location.getLon(),
+                    locationList.get(i).getLat(), locationList.get(i).getLon()));
+            mapAll.put(i, objList);
+        }
+        List temp = new ArrayList<>();
+        int size = mapAll.size();
+        for (int i = 0; i < size - 1; i++) {
+            for (int j = 0; j < size - 1 - i; j++) {
+                if (Double.parseDouble(mapAll.get(j).get(1).toString()) >
+                        Double.parseDouble(mapAll.get(j + 1).get(1).toString())) //交换两数位置
+                {
+                    temp = mapAll.get(j);
+                    mapAll.put(j, mapAll.get(j + 1));
+                    mapAll.put(j + 1, temp);
+                }
+            }
+        }
+        //生成新的顺时针的坐标点集合
+        locationList.clear();
+        for (Integer integer : mapAll.keySet()) {
+            if (mapAll.get(integer).get(0) instanceof Location) {
+                locationList.add((Location) mapAll.get(integer).get(0));
+            }
+        }
+        return  locationList;
+    }
+
+    /**
+     * 将多边形的点排序
+     *
+     * @param lat_a 纬度1
+     * @param lng_a 经度1
+     * @param lat_b 纬度2
+     * @param lng_b 经度2
+     * @return
+     */
+    private static double getAngle1(double lat_a, double lng_a, double lat_b, double lng_b) {
+
+        double y = Math.sin(lng_b - lng_a) * Math.cos(lat_b);
+
+        double x = Math.cos(lat_a) * Math.sin(lat_b) - Math.sin(lat_a) * Math.cos(lat_b) * Math.cos(lng_b - lng_a);
+
+        double brng = Math.atan2(y, x);
+
+        brng = Math.toDegrees(brng);
+
+        if (brng < 0)
+
+            brng = brng + 360;
+
+        return brng;
+    }
+
+    /**
+     * 平面多边形面积
+     * @return double
+     */
+    public static double planarPolygonAreaMeters(List<Location> locationList) {
+        // 现对坐标点进行排序
+        List<Location> list = sortLocation(locationList);
+
+        double a = 0;
+        for (int i = 0; i < list.size(); i++) {
+            int j = (i + 1) % list.size();
+
+            Location point_i = list.get(i);
+            double xi = point_i.getLon() * metersPerDegree * Math.cos(point_i.getLat() * radiansPerDegree);
+            double yi = point_i.getLat() * metersPerDegree;
+
+            Location point_j = list.get(j);
+            double xj = point_j.getLon() * metersPerDegree * Math.cos(point_j.getLat() * radiansPerDegree);
+            double yj = point_j.getLat() * metersPerDegree;
+
+            a += xi * yj - xj * yi;
+        }
+        // 转化为正数
+        return Math.abs(a / 2);
+    }
+
+
+}

+ 132 - 0
src/main/java/com/keystar/plane/inspection/utils/HttpUtils.java

@@ -0,0 +1,132 @@
+package com.keystar.plane.inspection.utils;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Map;
+import java.util.Set;
+
+
+public class HttpUtils {
+
+
+    /**
+     * http get请求方法
+     */
+    public static String doGet(String url,Map<String, String> headers) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+        String resultString = "";
+        CloseableHttpResponse response = null;
+        try {
+            // 创建url
+            URIBuilder builder = new URIBuilder(url);
+            URI uri = builder.build();
+            // 创建http GET请求
+            HttpGet httpGet = new HttpGet(uri);
+            // 设置超时时间
+            RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(3000)
+                    .setSocketTimeout(3000).setConnectTimeout(3000).build();
+            httpGet.setConfig(requestConfig);
+            try {
+                for (Map.Entry<String, String> entry : headers.entrySet()) {
+                    httpGet.addHeader(entry.getKey(), entry.getValue());
+                }
+            }catch (Exception e){
+            }
+
+//            // 设置token值
+//            httpGet.addHeader("Authorization", "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoie1widXNlcm5hbWVcIjpcInN5c3RlbVwiLFwiaXBcIjpudWxsLFwiaWRcIjotMSxcImp3dFwiOlwiZXlKaGJHY2lPaUpJVXpJMU5pSjkuZXlKMWMyVnlJam9pZTF3aWRYTmxjbTVoYldWY0lqcGNJbk41YzNSbGJWd2lMRndpYVhCY0lqcHVkV3hzTEZ3aWFXUmNJam90TVN4Y0ltcDNkRndpT201MWJHeDlJaXdpYVdGMElqb3hOakk1TkRZMk1qWXhMQ0pxZEdraU9pSlpWRkUxV2xkTmVrOVVUWFJOYWs1cVRVTXdNRTlFV1RKTVYwWnNUVmROZEU1RVp6Rk9WRTVxVGxSbmVFNUhXVFFpTENKbGVIQWlPakUyTWprMU5USTJOakY5LkpVZjBZNVE2SnJVTlZoaXpZQ2dJNWpWVUJVTzluOGhlVnFqTkd4eGdZNHNcIn0iLCJpYXQiOjE2Mjk0NjYyNjEsImp0aSI6Ill6QXpOVFZrWVRZdE5UZGhNeTAwTURVMkxXRTBOVEF0TWpRMk5qVTNabVV4T1RneSIsImV4cCI6Mjc0MDU3NzM3Mn0.peHm3MmYLWyqne1-K-3JHqpZhW5jtQX-STDfgIaNjpI");
+            // 执行请求
+            response = httpclient.execute(httpGet);
+            // 判断返回状态是否为200
+            if (response.getStatusLine().getStatusCode() == 200) {
+                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+            }
+        } catch (Exception ignored) {
+
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                httpclient.close();
+            } catch (IOException ignored) {
+            }
+        }
+        return resultString;
+    }
+
+    /**
+     * http post请求方法
+     */
+    public static String doPost(String url, Map<String,Object> paramMap, Map<String, String> headers)  {
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+
+        try {
+            // 创建url
+            URIBuilder builder = new URIBuilder(url);
+            URI uri = builder.build();
+            // 创建http post请求
+            HttpPost httpPost = new HttpPost(uri);
+            // 设置超时时间
+            RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(3000)
+                    .setSocketTimeout(3000).setConnectTimeout(3000).build();
+            httpPost.setConfig(requestConfig);
+            String body = paramToString(paramMap);
+            StringEntity stringEntity = new StringEntity(body, "utf-8");
+            httpPost.setEntity(stringEntity);
+            try {
+                for (Map.Entry<String, String> entry : headers.entrySet()) {
+                    httpPost.addHeader(entry.getKey(), entry.getValue());
+                }
+            }catch (Exception e){
+            }
+
+            httpPost.addHeader("Content-Type","application/json;charset=utf-8");
+            CloseableHttpResponse apiRes = httpclient.execute(httpPost);
+
+            HttpEntity entity = apiRes.getEntity();
+            //            System.out.println("接收到了返回信息:"+content);
+            return EntityUtils.toString(entity);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String paramToString(Map<String, Object> paramMap) {
+        String json;
+        StringBuffer stringBuffer = new StringBuffer();
+        //json字符串的第一个位置应该是 {
+        stringBuffer.append("{");
+        //去除Map中的所有Key值,放入Set集合中
+        Set<String> paramKey = paramMap.keySet();
+        //遍历出每一个key值,然后取出Map中的对应value做非空判断,若非空就进行拼接到stringBuffer中
+        for (String param : paramKey) {
+            if (paramMap.get(param) != null) {
+                stringBuffer.append("\"" + param + "\":\"" + paramMap.get(param).toString().trim() + "\",");
+            }
+        }
+        //若stringBuffer的长度大于2,则表示Map中有非空value并拼接到stringBuffer,那么就要去掉stringBuffer最后位置的逗号,然后再拼接上}即可;
+        //若stringBuffer的长度小于2,则表示Map中没有非空value拼接到stringBuffer,那么只需给stringBuffer再拼接上}即可
+        if (stringBuffer.length() > 2) {
+            String substring = stringBuffer.substring(0, stringBuffer.length() - 1);
+            json = substring + "}";
+        } else {
+            json = stringBuffer.toString() + "}";
+        }
+        return json;
+    }
+}

+ 170 - 0
src/main/java/com/keystar/plane/inspection/utils/PhotoUtils.java

@@ -0,0 +1,170 @@
+package com.keystar.plane.inspection.utils;
+
+import com.drew.imaging.jpeg.JpegMetadataReader;
+import com.drew.imaging.jpeg.JpegProcessingException;
+import com.drew.lang.GeoLocation;
+import com.drew.metadata.Directory;
+import com.drew.metadata.Metadata;
+import com.drew.metadata.Tag;
+import com.drew.metadata.exif.GpsDirectory;
+import com.keystar.plane.inspection.bo.Location;
+import com.keystar.plane.inspection.dao.DegreesVo;
+import com.keystar.plane.inspection.dao.PhotoMessageVo;
+import org.springframework.util.ResourceUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+
+public class PhotoUtils {
+
+
+    /**
+     *  获取JPG图片的metadata信息
+     **/
+    public static PhotoMessageVo getPhotoMessage(String mFilePath) throws IOException, JpegProcessingException {
+
+//        File file = ResourceUtils.getFile("classpath:20230208144300_DJI_20230208141838_0001_THRM.jpg");
+        Metadata metadata = JpegMetadataReader.readMetadata(new File(mFilePath));
+        PhotoMessageVo photoMessageVo = new PhotoMessageVo();
+        for (Directory directory : metadata.getDirectories()) {
+            for (Tag tag : directory.getTags()) {
+                String tagName = tag.getTagName();  //标签名
+                String desc = tag.getDescription(); //标签信息
+//                System.out.println(tagName + "===" + desc);//照片信息
+
+                switch(tagName)
+                {
+                    case "Image Height" :
+                        photoMessageVo.setImageHigh(Utils.getNumber(desc));
+                        break;
+                    case "Image Width" :
+                        photoMessageVo.setImageWidth(Utils.getNumber(desc));
+                        break;
+                    case "Focal Length" :
+                        photoMessageVo.setFocalLength(Utils.getNumber(desc));
+                        break;
+                    case "Focal Length 35" :
+                        photoMessageVo.setFocalLength35(Utils.getNumber(desc));
+                        break;
+                    case "GPS Altitude" :
+                        photoMessageVo.setAltitude(Utils.getNumber(desc));
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+
+        Collection<GpsDirectory> gpsDirectories = metadata.getDirectoriesOfType(GpsDirectory.class);
+        for(GpsDirectory gps : gpsDirectories) {
+            //获取图片的经纬度信息
+            GeoLocation geoLocation = gps.getGeoLocation();
+            photoMessageVo.setLatitude(geoLocation.getLatitude());
+            photoMessageVo.setLongitude(geoLocation.getLongitude());
+        }
+        return photoMessageVo;
+    }
+
+
+    /**
+     *  获取图片的经纬度信息
+     **/
+    public static void getPhotoGps() throws IOException, JpegProcessingException {
+
+        File file = ResourceUtils.getFile("classpath:20230208144300_DJI_20230208141838_0001_THRM.jpg");
+        Metadata metadata = JpegMetadataReader.readMetadata(file);
+
+        Collection<GpsDirectory> gpsDirectories = metadata.getDirectoriesOfType(GpsDirectory.class);
+        for(GpsDirectory gps : gpsDirectories) {
+            //获取图片的经纬度信息
+            GeoLocation geoLocation = gps.getGeoLocation();
+            System.out.println(geoLocation.getLongitude());
+            System.out.println(geoLocation.getLatitude());
+        }
+    }
+
+    /**
+     *  求解图片四个角的经纬度坐标
+     **/
+    public static List<Location> getDegrees(PhotoMessageVo photoMessageVo){
+        //飞行高度 l  altitude
+        //图片宽度 h  imageWidth
+        //图片高度 w  imageHigh
+        //焦距 p    focalLength
+        //显示视场角 dFov = 40.6
+
+//        double altitude = photoMessageVo.getAltitude() - 52;
+        double altitude = photoMessageVo.getAltitude() - 50;
+
+        double dFov = 40.6;
+        //对角线d  diagonal 根据dFov计算
+        double a = Math.toRadians(dFov / 2);
+        double tan = Math.tan(a);
+        BigDecimal diagonal  = new BigDecimal(photoMessageVo.getFocalLength()).multiply(BigDecimal.valueOf(tan));
+        //开平方:高度的平方+宽度的平方
+        double num1 = Math.sqrt(Math.pow(photoMessageVo.getImageWidth(), 2) + Math.pow(photoMessageVo.getImageHigh(),2));
+        DegreesVo degreesVo = new DegreesVo();
+        //经度换算单位(w)
+        BigDecimal num2 = new BigDecimal(0.00001141);
+        //纬度换算单位(h)
+        BigDecimal num3 = new BigDecimal(0.00000899);
+        // w
+        BigDecimal w = BigDecimal.valueOf(photoMessageVo.getImageWidth()/num1).multiply(diagonal);
+        // h
+        BigDecimal h = BigDecimal.valueOf(photoMessageVo.getImageHigh()/num1).multiply(diagonal);
+        // HFov
+        BigDecimal divide = w.divide(BigDecimal.valueOf(photoMessageVo.getFocalLength()), 10, BigDecimal.ROUND_HALF_UP);
+        double atan = Math.atan(divide.doubleValue());
+        BigDecimal aa = BigDecimal.valueOf(Math.atan(atan)).multiply(BigDecimal.valueOf(180)).divide(BigDecimal.valueOf(Math.PI), 10, BigDecimal.ROUND_HALF_UP);
+        BigDecimal HFov = new BigDecimal(2).multiply(aa);
+
+        double wTan = Math.tan(Math.toRadians(HFov.divide(BigDecimal.valueOf(2),10,BigDecimal.ROUND_HALF_UP).doubleValue()));
+        // 实际精度的长度(米)
+        BigDecimal airLong = new BigDecimal(altitude).multiply(BigDecimal.valueOf(wTan));
+        // 实际经度 W(角度)
+        BigDecimal airLongitude = airLong.multiply(num2);
+
+        // VFov
+        BigDecimal HDivide = h.divide(BigDecimal.valueOf(photoMessageVo.getFocalLength()), 10, BigDecimal.ROUND_HALF_UP);
+        double bTan = Math.atan(HDivide.doubleValue());
+        BigDecimal H = BigDecimal.valueOf(Math.atan(bTan)).multiply(BigDecimal.valueOf(180)).divide(BigDecimal.valueOf(Math.PI), 10, BigDecimal.ROUND_HALF_UP);
+        BigDecimal VFov = new BigDecimal(2).multiply(H);
+
+        double HTan = Math.tan(Math.toRadians(VFov.divide(BigDecimal.valueOf(2),10,BigDecimal.ROUND_HALF_UP).doubleValue()));
+        // 实际纬度的高(米)
+        BigDecimal airHight = new BigDecimal(altitude).multiply(BigDecimal.valueOf(HTan));
+        //实际纬度H(角度)
+        BigDecimal airLatitude = airHight.multiply(num3);
+
+
+        List<Location> locations = new ArrayList<>();
+        Location location = new Location();
+        location.setLon(photoMessageVo.getLongitude() - airLongitude.doubleValue());
+        location.setLat(photoMessageVo.getLatitude() + airLatitude.doubleValue());
+        locations.add(location);
+
+        Location location1 = new Location();
+        location1.setLon(photoMessageVo.getLongitude() + airLongitude.doubleValue());
+        location1.setLat(photoMessageVo.getLatitude() + airLatitude.doubleValue());
+        locations.add(location1);
+
+        Location location2 = new Location();
+        location2.setLon(photoMessageVo.getLongitude() - airLongitude.doubleValue());
+        location2.setLat(photoMessageVo.getLatitude() - airLatitude.doubleValue());
+        locations.add(location2);
+
+        Location location3 = new Location();
+        location3.setLon(photoMessageVo.getLongitude() + airLongitude.doubleValue());
+        location3.setLat(photoMessageVo.getLatitude() - airLatitude.doubleValue());
+        locations.add(location3);
+
+        return locations;
+    }
+
+
+}

+ 170 - 0
src/main/java/com/keystar/plane/inspection/utils/RedisUtils.java

@@ -0,0 +1,170 @@
+package com.keystar.plane.inspection.utils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class RedisUtils {
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    private static RedisUtils redisUtils;
+
+    /**
+     * 初始化
+     */
+    @PostConstruct
+    public void init() {
+        redisUtils = this;
+        redisUtils.redisTemplate = this.redisTemplate;
+    }
+
+    /**
+     * 查询key,支持模糊查询
+     *
+     * @param key
+     */
+    public static Set<String> keys(String key) {
+        return redisUtils.redisTemplate.keys(key);
+    }
+
+    /**
+     * 获取值
+     *
+     * @param key
+     */
+    public static Object get(String key) {
+        return redisUtils.redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 设置值
+     *
+     * @param key
+     * @param value
+     */
+    public static void set(String key, String value) {
+        redisUtils.redisTemplate.opsForValue().set(key, value);
+    }
+
+    /**
+     * 设置值,并设置过期时间
+     *
+     * @param key
+     * @param value
+     * @param expire 过期时间,单位秒
+     */
+    public static void set(String key, String value, Integer expire) {
+        redisUtils.redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 删出key
+     *
+     * @param key
+     */
+    public static void delete(String key) {
+        redisUtils.redisTemplate.opsForValue().getOperations().delete(key);
+    }
+
+    /**
+     * 设置对象
+     *
+     * @param key     key
+     * @param hashKey hashKey
+     * @param object  对象
+     */
+    public static void hset(String key, String hashKey, Object object) {
+        redisUtils.redisTemplate.opsForHash().put(key, hashKey, object);
+    }
+
+    /**
+     * 设置对象
+     *
+     * @param key     key
+     * @param hashKey hashKey
+     * @param object  对象
+     * @param expire  过期时间,单位秒
+     */
+    public static void hset(String key, String hashKey, Object object, Integer expire) {
+        redisUtils.redisTemplate.opsForHash().put(key, hashKey, object);
+        redisUtils.redisTemplate.expire(key, expire, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 设置HashMap
+     *
+     * @param key key
+     * @param map map值
+     */
+    public static void hset(String key, HashMap<String, Object> map) {
+        redisUtils.redisTemplate.opsForHash().putAll(key, map);
+    }
+
+    /**
+     * key不存在时设置值
+     *
+     * @param key
+     * @param hashKey
+     * @param object
+     */
+    public static void hsetAbsent(String key, String hashKey, Object object) {
+        redisUtils.redisTemplate.opsForHash().putIfAbsent(key, hashKey, object);
+    }
+
+    /**
+     * 获取Hash值
+     *
+     * @param key
+     * @param hashKey
+     * @return
+     */
+    public static Object hget(String key, String hashKey) {
+        return redisUtils.redisTemplate.opsForHash().get(key, hashKey);
+    }
+
+    /**
+     * 获取key的所有值
+     *
+     * @param key
+     * @return
+     */
+    public static Object hget(String key) {
+        return redisUtils.redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * 删除key的所有值
+     *
+     * @param key
+     */
+    public static void deleteKey(String key) {
+        redisUtils.redisTemplate.opsForHash().getOperations().delete(key);
+    }
+
+    /**
+     * 判断key下是否有值
+     *
+     * @param key
+     */
+    public static Boolean hasKey(String key) {
+        return redisUtils.redisTemplate.opsForHash().getOperations().hasKey(key);
+    }
+
+    /**
+     * 判断key和hasKey下是否有值
+     *
+     * @param key
+     * @param hasKey
+     */
+    public static Boolean hasKey(String key, String hasKey) {
+        return redisUtils.redisTemplate.opsForHash().hasKey(key, hasKey);
+    }
+}

+ 289 - 0
src/main/java/com/keystar/plane/inspection/utils/SSHRemoteCall.java

@@ -0,0 +1,289 @@
+package com.keystar.plane.inspection.utils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Properties;
+import java.util.Vector;
+
+import com.jcraft.jsch.Channel;
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
+import com.jcraft.jsch.SftpException;
+
+/**
+ * exec用于执行命令;sftp用于文件处理
+ */
+public class SSHRemoteCall {
+
+    // 私有的对象
+    private static SSHRemoteCall sshRemoteCall;
+
+    /**
+     * 私有的构造方法
+     */
+    private SSHRemoteCall() {
+    }
+
+    // 懒汉式,线程不安全,适合单线程
+    public static SSHRemoteCall getInstance() {
+        if (sshRemoteCall == null) {
+            sshRemoteCall = new SSHRemoteCall();
+        }
+        return sshRemoteCall;
+    }
+
+    // 懒汉式,线程安全,适合多线程
+    public static synchronized SSHRemoteCall getInstance2() {
+        if (sshRemoteCall == null) {
+            sshRemoteCall = new SSHRemoteCall();
+        }
+        return sshRemoteCall;
+    }
+
+    private static final int DEFAULT_PORT = 22;// 默认端口号
+    private int port;// 端口号
+
+    private static String ipAddress = "192.168.110.130";// ip地址
+    private static String userName = "root";// 账号
+    private static String password = "hadoop";// 密码
+
+    private Session session;// JSCH session
+    private boolean logined = false;// 是否登陆
+
+    /**
+     * 构造方法,可以直接使用DEFAULT_PORT
+     *
+     * @param ipAddress
+     * @param userName
+     * @param password
+     */
+    public SSHRemoteCall(String ipAddress, String userName, String password) {
+        this(ipAddress, DEFAULT_PORT, userName, password);
+    }
+
+    /**
+     * 构造方法,方便直接传入ipAddress,userName,password进行调用
+     *
+     * @param ipAddress
+     * @param port
+     * @param userName
+     * @param password
+     */
+    public SSHRemoteCall(String ipAddress, int port, String userName, String password) {
+        super();
+        this.ipAddress = ipAddress;
+        this.userName = userName;
+        this.password = password;
+        this.port = port;
+    }
+
+    /**
+     * 远程登陆
+     *
+     * @throws Exception
+     */
+    public void sshRemoteCallLogin(String ipAddress, String userName, String password) throws Exception {
+        // 如果登陆就直接返回
+        if (logined) {
+            return;
+        }
+        // 创建jSch对象
+        JSch jSch = new JSch();
+        try {
+            // 获取到jSch的session, 根据用户名、主机ip、端口号获取一个Session对象
+            session = jSch.getSession(userName, ipAddress, DEFAULT_PORT);
+            // 设置密码
+            session.setPassword(password);
+
+            // 方式一,通过Session建立连接
+            // session.setConfig("StrictHostKeyChecking", "no");
+            // session.connect();
+
+            // 方式二,通过Session建立连接
+            // java.util.Properties;
+            Properties config = new Properties();
+            config.put("StrictHostKeyChecking", "no");
+            config.put("PreferredAuthentications", "keystar");
+            session.setConfig(config);// 为Session对象设置properties
+            session.setTimeout(3000);// 设置超时
+            session.connect();//// 通过Session建立连接
+
+            // 设置登陆状态
+            logined = true;
+        } catch (JSchException e) {
+            // 设置登陆状态为false
+            logined = false;
+            throw new Exception(
+                    "主机登录失败, IP = " + ipAddress + ", USERNAME = " + userName + ", Exception:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 关闭连接
+     */
+    public void closeSession() {
+        // 调用session的关闭连接的方法
+        if (session != null) {
+            // 如果session不为空,调用session的关闭连接的方法
+            session.disconnect();
+        }
+
+    }
+
+    /**
+     * 执行相关的命令
+     *
+     * @param command
+     * @throws IOException
+     */
+    public void execCommand(String command) throws IOException {
+        InputStream in = null;// 输入流(读)
+        Channel channel = null;// 定义channel变量
+        try {
+            // 如果命令command不等于null
+            if (command != null) {
+                // 打开channel
+                //说明:exec用于执行命令;sftp用于文件处理
+                channel = session.openChannel("exec");
+                // 设置command
+                ((ChannelExec) channel).setCommand(command);
+                // channel进行连接
+                channel.connect();
+                // 获取到输入流
+                in = channel.getInputStream();
+                // 执行相关的命令
+                String processDataStream = processDataStream(in);
+                // 打印相关的命令
+                System.out.println("1、打印相关返回的命令: " + processDataStream);
+            }
+        } catch (JSchException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (in != null) {
+                in.close();
+            }
+            if (channel != null) {
+                channel.disconnect();
+            }
+        }
+
+    }
+
+    /**
+     * 对将要执行的linux的命令进行遍历
+     *
+     * @param in
+     * @return
+     * @throws Exception
+     */
+    public String processDataStream(InputStream in) throws Exception {
+        StringBuffer sb = new StringBuffer();
+        BufferedReader br = new BufferedReader(new InputStreamReader(in));
+        String result = "";
+        try {
+            while ((result = br.readLine()) != null) {
+                sb.append(result);
+                // System.out.println(sb.toString());
+            }
+        } catch (Exception e) {
+            throw new Exception("获取数据流失败: " + e);
+        } finally {
+            br.close();
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 上传文件 可参考:https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html
+     *
+     * @param directory  上传文件的目录
+     * @param uploadFile 将要上传的文件
+     */
+    public void uploadFile(String directory, String uploadFile) {
+        try {
+            // 打开channelSftp
+            ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
+            // 远程连接
+            channelSftp.connect();
+            // 创建一个文件名称问uploadFile的文件
+            File file = new File(uploadFile);
+            // 将文件进行上传(sftp协议)
+            // 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同.
+            // 采用默认的传输模式:OVERWRITE
+            channelSftp.put(new FileInputStream(file), directory, ChannelSftp.OVERWRITE);
+            // 切断远程连接
+            channelSftp.exit();
+            System.out.println("2、" + file.getName() + " 文件上传成功.....");
+        } catch (JSchException e) {
+            e.printStackTrace();
+        } catch (SftpException e) {
+            e.printStackTrace();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    /**
+     * 下载文件 采用默认的传输模式:OVERWRITE
+     *
+     * @param src linux服务器文件地址
+     * @param dst 本地存放地址
+     * @throws JSchException
+     * @throws SftpException
+     */
+    public void fileDownload(String src, String dst) throws JSchException, SftpException {
+        // src 是linux服务器文件地址,dst 本地存放地址
+        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
+        // 远程连接
+        channelSftp.connect();
+        // 下载文件,多个重载方法
+        channelSftp.get(src, dst);
+        // 切断远程连接,quit()等同于exit(),都是调用disconnect()
+        channelSftp.quit();
+        // channelSftp.disconnect();
+        System.out.println("3、" + src + " ,下载文件成功.....");
+    }
+
+    /**
+     * 删除文件
+     */
+    public void deleteFile(String directoryFile) throws SftpException, JSchException {
+        // 打开openChannel的sftp
+        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
+        // 远程连接
+        channelSftp.connect();
+        // 删除文件
+        channelSftp.rm(directoryFile);
+        // 切断远程连接
+        channelSftp.exit();
+        System.out.println("4、" + directoryFile + " 删除的文件.....");
+    }
+
+    /**
+     * 列出目录下的文件
+     */
+    public Vector listFiles(String directory) throws JSchException, SftpException {
+        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
+        // 远程连接
+        channelSftp.connect();
+        // 显示目录信息
+        Vector ls = channelSftp.ls(directory);
+        System.out.println("5、" + ls);
+        // 切断连接
+        channelSftp.exit();
+        return ls;
+    }
+}

+ 89 - 0
src/main/java/com/keystar/plane/inspection/utils/SSHUtils.java

@@ -0,0 +1,89 @@
+package com.keystar.plane.inspection.utils;
+
+import com.jcraft.jsch.*;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Properties;
+import java.util.Vector;
+
+public class SSHUtils {
+
+    private static JSch jsch;
+    private static Session session;
+
+    /**
+     * 连接到指定的IP
+     */
+    public static void connect(String user, String passwd, String host, int port) throws JSchException {
+        jsch = new JSch();// 创建JSch对象
+        session = jsch.getSession(user, host, port);// 根据用户名、主机ip、端口号获取一个Session对象
+        session.setPassword(passwd);// 设置密码
+
+        Properties config = new Properties();
+        config.put("StrictHostKeyChecking", "no");
+        session.setConfig(config);// 为Session对象设置properties
+        session.setTimeout(1500);// 设置超时
+        session.connect();// 通过Session建立连接
+    }
+
+    /**
+     * 关闭连接
+     */
+    public static void close() {
+     session.disconnect();
+    }
+
+
+    /**
+     * 执行相关的命令
+     *
+     * @throws JSchException
+     */
+    public static void execCmd(String command) throws JSchException {
+        BufferedReader reader = null;
+        Channel channel = null;
+        try {
+            if (command != null) {
+                channel = session.openChannel("exec");
+                ((ChannelExec) channel).setCommand(command);
+                // ((ChannelExec) channel).setErrStream(System.err);
+                channel.connect();
+                InputStream in = channel.getInputStream();
+                reader = new BufferedReader(new InputStreamReader(in));
+                String buf = null;
+                while ((buf = reader.readLine()) != null) {
+                    System.out.println(buf);
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (JSchException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                reader.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            channel.disconnect();
+        }
+    }
+
+    /**
+     * 列出目录下的文件
+     */
+    public static Vector listFiles(String directory) throws JSchException, SftpException {
+        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
+        // 远程连接
+        channelSftp.connect();
+        // 显示目录信息
+        Vector ls = channelSftp.ls(directory);
+        System.out.println(""+ls);
+        // 切断连接
+        channelSftp.exit();
+        return ls;
+    }
+}

+ 50 - 0
src/main/java/com/keystar/plane/inspection/utils/Utils.java

@@ -0,0 +1,50 @@
+package com.keystar.plane.inspection.utils;
+
+import com.keystar.plane.inspection.bo.Location;
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import java.nio.charset.StandardCharsets;
+import java.security.KeyFactory;
+import java.security.interfaces .RSAPublicKey;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Utils {
+
+
+    /**
+     *  RSA加密
+     **/
+    public static String encrypt(String str, String publicKey ) throws Exception {
+        //base64编码的公钥
+        byte[] decoded = Base64.decodeBase64(publicKey);
+        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
+        //RSA加密
+        Cipher cipher = Cipher.getInstance("RSA");
+        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
+        return Base64.encodeBase64String(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
+
+    }
+
+    /**
+     *  截取字符串中数字转成double
+     **/
+    public static Double getNumber(String str){
+        String[] s = str.split(" ");
+        return Double.parseDouble(s[0]);
+    }
+
+
+    /**
+     *  获取光伏区域坐标
+     **/
+    public static List<Location> getAllLocation(){
+        Location location = new Location();
+//        location.setLat();
+//        location.setLon();
+        return null;
+    }
+}

+ 25 - 0
src/main/java/com/keystar/plane/inspection/utils/jsonUtil.java

@@ -0,0 +1,25 @@
+package com.keystar.plane.inspection.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class jsonUtil {
+
+//    public static Map<String, List> jsonTransData(String payload){
+//        JSONObject jsonObject = JSON.parseObject(payload);
+//        List<String> featureList = (List<String>)jsonObject.get("features");
+//        Map<String,List> result = new HashMap<>();
+//        for (int i = 0; i<featureList.size(); i++){
+//            JSONObject object1 = JSON.parseObject(featureList.get(i));
+//            List<List> coordinatesAll = (List<List>) object1.get("coordinates");
+//            List<List> coordinates = coordinatesAll.get(0);
+//            JSONObject properties = (JSONObject) object1.get("properties");
+//            result.put((String) properties.get("名称"),coordinates);
+//        }
+//        return result;
+//    }
+}

+ 87 - 0
src/main/java/com/keystar/plane/inspection/websocket/BaseWebsocketClient.java

@@ -0,0 +1,87 @@
+//package com.keystar.plane.inspection.websocket;
+//
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.java_websocket.client.WebSocketClient;
+//import org.java_websocket.drafts.Draft_6455;
+//import org.java_websocket.handshake.ServerHandshake;
+//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+//
+//import java.net.URI;
+//import java.util.Map;
+//
+//@Slf4j
+//public class BaseWebsocketClient extends WebSocketClient{
+//    //客户端标识
+//    private String clientName;
+//    //客户端连接状态
+//    private boolean isConnect = false;
+//    //spring包下的线程池类
+//    private ThreadPoolTaskExecutor workPoolScheduler;
+//
+//    public BaseWebsocketClient(URI serverUri) {
+//        super(serverUri);
+//    }
+//
+//    public BaseWebsocketClient(URI serverUri, Map<String, String> httpHeaders,
+//                               String clientName,
+//                               ThreadPoolTaskExecutor workPoolScheduler) {
+//        super(serverUri, new Draft_6455(), httpHeaders, 0);
+//        this.clientName = clientName;
+//        this.workPoolScheduler = workPoolScheduler;
+//    }
+//
+//    @Override
+//    public void onOpen(ServerHandshake serverHandshake) {
+//    }
+//
+//    @Override
+//    public void onMessage(String s) {
+//    }
+//    /***检测到连接关闭之后,会更新连接状态以及尝试重新连接***/
+//    @Override
+//    public void onClose(int i, String s, boolean b) {
+//        log.info("-------连接关闭------");
+//        setConnectState(false);
+//        recontact();
+//    }
+//    /***检测到错误,更新连接状态***/
+//    @Override
+//    public void onError(Exception e) {
+//        log.info("-------连接失败------");
+//        setConnectState(false);
+//    }
+//
+//    public void setConnectState(boolean isConnect) {
+//        this.isConnect = isConnect;
+//    }
+//
+//    public boolean getConnectState(){
+//        return this.isConnect;
+//    }
+//
+//    public ThreadPoolTaskExecutor getWorkPoolScheduler() {
+//        return workPoolScheduler;
+//    }
+//
+//    /**
+//     * 重连
+//     */
+//    public void recontact() {
+//        workPoolScheduler.execute(() -> {
+//            Thread.currentThread().setName( "ReconnectThread-" + Thread.currentThread().getId() );
+//            try {
+//                Thread.sleep(5000);
+//                log.info("重连开始");
+//                if (isConnect) {
+//                    log.info("{} 重连停止", clientName);
+//                    return;
+//                }
+//                this.reconnect();
+//                log.info("重连结束");
+//            } catch (Exception e) {
+//                log.info("{} 重连失败", clientName);
+//            }
+//        });
+//    }
+//}

Some files were not shown because too many files changed in this diff