diff --git a/README.md b/README.md
index b3aa75e..c2819dd 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ For more documentation, please visit the [DJI Developer Documentation](https://d
 
 ## Latest Release
 
-Cloud API 1.10.0 was released on 7 Apr 2024.. For more information, please visit the [Release Note](https://developer.dji.com/doc/cloud-api-tutorial/cn/).
+Cloud API 1.10.0 was released on 7 Apr 2024. For more information, please visit the [Release Note](https://developer.dji.com/doc/cloud-api-tutorial/cn/).
 
 ## License
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/config/ProductConfigResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/config/ProductConfigResponse.java
index f3a9bd2..de01ce7 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/config/ProductConfigResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/config/ProductConfigResponse.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.config;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraAimRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraAimRequest.java
index ab9ea9d..f9fa25f 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraAimRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraAimRequest.java
@@ -3,9 +3,9 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraExposureModeSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraExposureModeSetRequest.java
index 6c8e6ec..c2ecc38 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraExposureModeSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraExposureModeSetRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraExposureSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraExposureSetRequest.java
index a6bc91b..b410387 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraExposureSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraExposureSetRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocalLengthSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocalLengthSetRequest.java
index 73de6a0..63fbad4 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocalLengthSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocalLengthSetRequest.java
@@ -3,9 +3,9 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocusModeSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocusModeSetRequest.java
index 845e6b5..8ac4ee2 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocusModeSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocusModeSetRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocusValueSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocusValueSetRequest.java
index f137367..9a2889b 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocusValueSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFocusValueSetRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFrameZoomRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFrameZoomRequest.java
new file mode 100644
index 0000000..8520432
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraFrameZoomRequest.java
@@ -0,0 +1,99 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年04月19日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import com.dji.sdk.cloudapi.device.PayloadIndex;
+import com.dji.sdk.common.BaseModel;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+
+public class CameraFrameZoomRequest extends BaseModel {
+
+    @NotNull
+    private PayloadIndex payloadIndex;
+
+    @NotNull
+    private CameraTypeEnum cameraType;
+
+    @NotNull
+    private Boolean locked;
+
+    @Min(0)
+    @Max(1)
+    private Float x;
+
+    @Min(0)
+    @Max(1)
+    private Float y;
+
+    @Min(0)
+    @Max(1)
+    private Float width;
+
+    @Min(0)
+    @Max(1)
+    private Float height;
+
+
+    public PayloadIndex getPayloadIndex() {
+        return payloadIndex;
+    }
+
+    public void setPayloadIndex(PayloadIndex payloadIndex) {
+        this.payloadIndex = payloadIndex;
+    }
+
+    public CameraTypeEnum getCameraType() {
+        return cameraType;
+    }
+
+    public void setCameraType(CameraTypeEnum cameraType) {
+        this.cameraType = cameraType;
+    }
+
+    public Boolean getLocked() {
+        return locked;
+    }
+
+    public void setLocked(Boolean locked) {
+        this.locked = locked;
+    }
+
+    public Float getX() {
+        return x;
+    }
+
+    public void setX(Float x) {
+        this.x = x;
+    }
+
+    public Float getY() {
+        return y;
+    }
+
+    public void setY(Float y) {
+        this.y = y;
+    }
+
+    public Float getWidth() {
+        return width;
+    }
+
+    public void setWidth(Float width) {
+        this.width = width;
+    }
+
+    public Float getHeight() {
+        return height;
+    }
+
+    public void setHeight(Float height) {
+        this.height = height;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraLookAtRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraLookAtRequest.java
index 634c48b..30b7d5b 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraLookAtRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraLookAtRequest.java
@@ -2,10 +2,10 @@ package com.dji.sdk.cloudapi.control;
 
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
-
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
@@ -95,4 +95,24 @@ public class CameraLookAtRequest extends BaseModel {
         this.height = height;
         return this;
     }
+
+    public PayloadIndex getPayloadIndex() {
+        return payloadIndex;
+    }
+
+    public Boolean getLocked() {
+        return locked;
+    }
+
+    public Float getLatitude() {
+        return latitude;
+    }
+
+    public Float getLongitude() {
+        return longitude;
+    }
+
+    public Float getHeight() {
+        return height;
+    }
 }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraModeSwitchRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraModeSwitchRequest.java
index 37d00c8..a744f43 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraModeSwitchRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraModeSwitchRequest.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.device.CameraModeEnum;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPhotoStopRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPhotoStopRequest.java
index a20ae8a..beeae28 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPhotoStopRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPhotoStopRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPhotoTakeRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPhotoTakeRequest.java
index a2fef96..cc50bde 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPhotoTakeRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPhotoTakeRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPointFocusActionRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPointFocusActionRequest.java
index 2b3b27c..ce61061 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPointFocusActionRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraPointFocusActionRequest.java
@@ -3,9 +3,9 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraRecordingStartRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraRecordingStartRequest.java
index f695c7d..57e8d20 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraRecordingStartRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraRecordingStartRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraRecordingStopRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraRecordingStopRequest.java
index f98e268..88c6ddf 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraRecordingStopRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraRecordingStopRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraScreenSplitRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraScreenSplitRequest.java
index cbc49e4..93aedb3 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraScreenSplitRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraScreenSplitRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/ControlMethodEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/ControlMethodEnum.java
index 4f870ab..482e55e 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/ControlMethodEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/ControlMethodEnum.java
@@ -62,6 +62,7 @@ public enum ControlMethodEnum {
     IR_METERING_AREA_SET("ir_metering_area_set"),
 
     CAMERA_POINT_FOCUS_ACTION("camera_point_focus_action"),
+    CAMERA_FRAME_ZOOM("camera_frame_zoom"),
 
     DRONE_CONTROL("drone_control"),
 
@@ -75,6 +76,16 @@ public enum ControlMethodEnum {
 
     POI_CIRCLE_SPEED_SET("poi_circle_speed_set"),
 
+    //add by witcom@2024-06-03
+    SPEAKER_AUDIO_PLAY_START("speaker_audio_play_start"),
+    SPEAKER_TTS_PLAY_START("speaker_tts_play_start"),
+    SPEAKER_REPLAY("speaker_replay"),
+    SPEAKER_PLAY_STOP("speaker_play_stop"),
+    SPEAKER_PLAY_MODE_SET("speaker_play_mode_set"),
+    SPEAKER_PLAY_VOLUME_SET("speaker_play_volume_set"),
+
+    PSDK_WIDGET_VALUE_SET("psdk_widget_value_set"),
+    PSDK_INPUT_BOX_TEXT_SET("psdk_input_box_text_set"),
     ;
 
     private final String method;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DrcModeEnterRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DrcModeEnterRequest.java
index 7c5bcf2..84de6f9 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DrcModeEnterRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DrcModeEnterRequest.java
@@ -2,10 +2,10 @@ package com.dji.sdk.cloudapi.control;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DrcModeMqttBroker.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DrcModeMqttBroker.java
index 7b16c71..26e6f35 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DrcModeMqttBroker.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DrcModeMqttBroker.java
@@ -1,8 +1,8 @@
 package com.dji.sdk.cloudapi.control;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DroneControlRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DroneControlRequest.java
index e6ba180..a408e90 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DroneControlRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/DroneControlRequest.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.control;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/FlyToPointRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/FlyToPointRequest.java
index 81c99d4..8ea8d7c 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/FlyToPointRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/FlyToPointRequest.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.control;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.*;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
 import java.util.List;
 
 /**
@@ -13,7 +13,7 @@ import java.util.List;
  */
 public class FlyToPointRequest extends BaseModel {
 
-    @Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
+    //@Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
     @NotNull
     private String flyToId;
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/FlyToPointUpdateRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/FlyToPointUpdateRequest.java
index 3bbb205..9ec03a0 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/FlyToPointUpdateRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/FlyToPointUpdateRequest.java
@@ -2,11 +2,11 @@ package com.dji.sdk.cloudapi.control;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/GimbalResetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/GimbalResetRequest.java
index 8030180..bab8b38 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/GimbalResetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/GimbalResetRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/HeartBeatRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/HeartBeatRequest.java
index 8ae23af..8127b70 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/HeartBeatRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/HeartBeatRequest.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.control;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringAreaSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringAreaSetRequest.java
index 6d8ad5d..964b0fe 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringAreaSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringAreaSetRequest.java
@@ -3,9 +3,9 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringModeSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringModeSetRequest.java
index 6510068..76c9132 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringModeSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringModeSetRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringPointSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringPointSetRequest.java
index f2bc6d5..a9af34b 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringPointSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/IrMeteringPointSetRequest.java
@@ -3,9 +3,9 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PSDKUiResourceUploadResult.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PSDKUiResourceUploadResult.java
new file mode 100644
index 0000000..ee3239f
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PSDKUiResourceUploadResult.java
@@ -0,0 +1,51 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+public class PSDKUiResourceUploadResult {
+
+    String objectKey;
+
+    Integer psdk_index;
+
+    Integer result;
+    Integer size;
+
+
+    public String getObjectKey() {
+        return objectKey;
+    }
+
+    public void setObjectKey(String objectKey) {
+        this.objectKey = objectKey;
+    }
+
+    public Integer getPsdk_index() {
+        return psdk_index;
+    }
+
+    public void setPsdk_index(Integer psdk_index) {
+        this.psdk_index = psdk_index;
+    }
+
+    public Integer getResult() {
+        return result;
+    }
+
+    public void setResult(Integer result) {
+        this.result = result;
+    }
+
+    public Integer getSize() {
+        return size;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PayloadAuthorityGrabRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PayloadAuthorityGrabRequest.java
index 4b99053..71c80d8 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PayloadAuthorityGrabRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PayloadAuthorityGrabRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PayloadControlMethodEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PayloadControlMethodEnum.java
index 7f23ea4..e252149 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PayloadControlMethodEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PayloadControlMethodEnum.java
@@ -52,6 +52,17 @@ public enum PayloadControlMethodEnum {
 
     CAMERA_POINT_FOCUS_ACTION(ControlMethodEnum.CAMERA_POINT_FOCUS_ACTION, CameraPointFocusActionRequest.class),
 
+    CAMERA_FRAME_ZOOM(ControlMethodEnum.CAMERA_FRAME_ZOOM, CameraFrameZoomRequest.class),
+
+    SPEAKER_AUDIO_PLAY_START(ControlMethodEnum.SPEAKER_AUDIO_PLAY_START,SpeakerAudioPlayStartRequest.class),
+    SPEAKER_TTS_PLAY_START(ControlMethodEnum.SPEAKER_TTS_PLAY_START,SpeakerTTSPlayStartRequest.class),
+    SPEAKER_REPLAY(ControlMethodEnum.SPEAKER_REPLAY,PsdkRequest.class),
+    SPEAKER_PLAY_STOP(ControlMethodEnum.SPEAKER_PLAY_STOP,PsdkRequest.class),
+    SPEAKER_PLAY_MODE_SET(ControlMethodEnum.SPEAKER_PLAY_MODE_SET, SpeakerPlayModeSetRequest.class),
+    SPEAKER_PLAY_VOLUME_SET(ControlMethodEnum.SPEAKER_PLAY_VOLUME_SET, SpeakerPlayVolumeSetRequest.class),
+
+    PSDK_WIDGET_VALUE_SET(ControlMethodEnum.PSDK_WIDGET_VALUE_SET,PsdkWidgetValueSetRequest.class),
+    PSDK_INPUT_BOX_TEXT_SET(ControlMethodEnum.PSDK_INPUT_BOX_TEXT_SET, PsdkInputBoxTextSetRequest.class),
     ;
 
     private final ControlMethodEnum payloadMethod;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PhotoStorageSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PhotoStorageSetRequest.java
index fc546ab..ecfce9b 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PhotoStorageSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PhotoStorageSetRequest.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PoiCircleSpeedSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PoiCircleSpeedSetRequest.java
index 9898b20..faeb96f 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PoiCircleSpeedSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PoiCircleSpeedSetRequest.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.control;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PoiModeEnterRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PoiModeEnterRequest.java
index e950483..29387f5 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PoiModeEnterRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PoiModeEnterRequest.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.control;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/Point.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/Point.java
index f44e76c..2004f5e 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/Point.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/Point.java
@@ -1,8 +1,8 @@
 package com.dji.sdk.cloudapi.control;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkFloatingWindowText.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkFloatingWindowText.java
new file mode 100644
index 0000000..a3cd49d
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkFloatingWindowText.java
@@ -0,0 +1,29 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+public class PsdkFloatingWindowText {
+    String value;
+    Integer psdkIndex;
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public Integer getPsdkIndex() {
+        return psdkIndex;
+    }
+
+    public void setPsdkIndex(Integer psdkIndex) {
+        this.psdkIndex = psdkIndex;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkInputBoxTextSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkInputBoxTextSetRequest.java
new file mode 100644
index 0000000..8f6509d
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkInputBoxTextSetRequest.java
@@ -0,0 +1,19 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月04日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import com.dji.sdk.common.BaseModel;
+import jakarta.validation.constraints.NotNull;
+
+public class PsdkInputBoxTextSetRequest extends BaseModel {
+
+    @NotNull
+    Integer psdkIndex;
+
+    String value;
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkRequest.java
new file mode 100644
index 0000000..a3ded41
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkRequest.java
@@ -0,0 +1,23 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import com.dji.sdk.common.BaseModel;
+
+public class PsdkRequest extends BaseModel {
+
+    Integer psdkIndex;
+
+    public Integer getPsdkIndex() {
+        return psdkIndex;
+    }
+
+    public void setPsdkIndex(Integer psdkIndex) {
+        this.psdkIndex = psdkIndex;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkWidgetValueSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkWidgetValueSetRequest.java
new file mode 100644
index 0000000..bc7aa76
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PsdkWidgetValueSetRequest.java
@@ -0,0 +1,45 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月04日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import com.dji.sdk.common.BaseModel;
+import jakarta.validation.constraints.NotNull;
+
+public class PsdkWidgetValueSetRequest extends BaseModel {
+
+    @NotNull
+    Integer index;
+
+    @NotNull
+    Integer psdkIndex;
+    Integer value;
+
+    public Integer getIndex() {
+        return index;
+    }
+
+    public void setIndex(Integer index) {
+        this.index = index;
+    }
+
+    public Integer getPsdkIndex() {
+        return psdkIndex;
+    }
+
+    public void setPsdkIndex(Integer psdkIndex) {
+        this.psdkIndex = psdkIndex;
+    }
+
+    public Integer getValue() {
+        return value;
+    }
+
+    public void setValue(Integer value) {
+        this.value = value;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerAudioPlayStartRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerAudioPlayStartRequest.java
new file mode 100644
index 0000000..dcb117b
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerAudioPlayStartRequest.java
@@ -0,0 +1,37 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import com.dji.sdk.common.BaseModel;
+import jakarta.validation.constraints.NotNull;
+
+public class SpeakerAudioPlayStartRequest extends BaseModel {
+
+    @NotNull
+    Integer psdkIndex;
+
+    @NotNull
+    SpeakerAudioPlayStartRequestFile file;
+
+
+    public Integer getPsdkIndex() {
+        return psdkIndex;
+    }
+
+    public void setPsdkIndex(Integer psdkIndex) {
+        this.psdkIndex = psdkIndex;
+    }
+
+    public SpeakerAudioPlayStartRequestFile getFile() {
+        return file;
+    }
+
+    public void setFile(SpeakerAudioPlayStartRequestFile file) {
+        this.file = file;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerAudioPlayStartRequestFile.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerAudioPlayStartRequestFile.java
new file mode 100644
index 0000000..87792e4
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerAudioPlayStartRequestFile.java
@@ -0,0 +1,55 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+
+public class SpeakerAudioPlayStartRequestFile {
+
+    String format = "pcm";
+
+    @NotEmpty
+    String md5;
+    @NotEmpty
+    String name;
+    @NotEmpty
+    String url;
+
+    public String getFormat() {
+        return format;
+    }
+
+    public void setFormat(String format) {
+        this.format = format;
+    }
+
+    public String getMd5() {
+        return md5;
+    }
+
+    public void setMd5(String md5) {
+        this.md5 = md5;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayModeSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayModeSetRequest.java
new file mode 100644
index 0000000..2d9c357
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayModeSetRequest.java
@@ -0,0 +1,37 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import com.dji.sdk.common.BaseModel;
+import jakarta.validation.constraints.NotNull;
+
+public class SpeakerPlayModeSetRequest extends BaseModel {
+
+    //"0":"单次播放","1":"循环播放(单曲)"
+    @NotNull
+    Integer playMode;
+
+    @NotNull
+    Integer psdkIndex;
+
+    public Integer getPlayMode() {
+        return playMode;
+    }
+
+    public void setPlayMode(Integer playMode) {
+        this.playMode = playMode;
+    }
+
+    public Integer getPsdkIndex() {
+        return psdkIndex;
+    }
+
+    public void setPsdkIndex(Integer psdkIndex) {
+        this.psdkIndex = psdkIndex;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayProgress.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayProgress.java
new file mode 100644
index 0000000..bbb9a7b
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayProgress.java
@@ -0,0 +1,29 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+public class SpeakerPlayProgress {
+    Integer percent;
+    String stepKey;
+
+    public Integer getPercent() {
+        return percent;
+    }
+
+    public void setPercent(Integer percent) {
+        this.percent = percent;
+    }
+
+    public String getStepKey() {
+        return stepKey;
+    }
+
+    public void setStepKey(String stepKey) {
+        this.stepKey = stepKey;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayStartProgress.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayStartProgress.java
new file mode 100644
index 0000000..d834b1e
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayStartProgress.java
@@ -0,0 +1,48 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+public class SpeakerPlayStartProgress {
+
+    String md5;
+    Integer psdkIndex;
+    String status;
+    SpeakerPlayProgress progress;
+
+    public String getMd5() {
+        return md5;
+    }
+
+    public void setMd5(String md5) {
+        this.md5 = md5;
+    }
+
+    public Integer getPsdkIndex() {
+        return psdkIndex;
+    }
+
+    public void setPsdkIndex(Integer psdkIndex) {
+        this.psdkIndex = psdkIndex;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public SpeakerPlayProgress getProgress() {
+        return progress;
+    }
+
+    public void setProgress(SpeakerPlayProgress progress) {
+        this.progress = progress;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayVolumeSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayVolumeSetRequest.java
new file mode 100644
index 0000000..b423af7
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerPlayVolumeSetRequest.java
@@ -0,0 +1,40 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import com.dji.sdk.common.BaseModel;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+
+public class SpeakerPlayVolumeSetRequest extends BaseModel {
+
+    @NotNull
+    Integer psdkIndex;
+
+    @NotNull
+    @Min(0)
+    @Max(100)
+    Integer playVolume;
+
+    public Integer getPsdkIndex() {
+        return psdkIndex;
+    }
+
+    public void setPsdkIndex(Integer psdkIndex) {
+        this.psdkIndex = psdkIndex;
+    }
+
+    public Integer getPlayVolume() {
+        return playVolume;
+    }
+
+    public void setPlayVolume(Integer playVolume) {
+        this.playVolume = playVolume;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerTTSPlayStartRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerTTSPlayStartRequest.java
new file mode 100644
index 0000000..d06bef0
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerTTSPlayStartRequest.java
@@ -0,0 +1,36 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import com.dji.sdk.common.BaseModel;
+import jakarta.validation.constraints.NotNull;
+
+public class SpeakerTTSPlayStartRequest extends BaseModel {
+
+    @NotNull
+    Integer psdkIndex;
+
+    @NotNull
+    SpeakerTTSPlayStartRequestTTS tts;
+
+    public Integer getPsdkIndex() {
+        return psdkIndex;
+    }
+
+    public void setPsdkIndex(Integer psdkIndex) {
+        this.psdkIndex = psdkIndex;
+    }
+
+    public SpeakerTTSPlayStartRequestTTS getTts() {
+        return tts;
+    }
+
+    public void setTts(SpeakerTTSPlayStartRequestTTS tts) {
+        this.tts = tts;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerTTSPlayStartRequestTTS.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerTTSPlayStartRequestTTS.java
new file mode 100644
index 0000000..32797c0
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/SpeakerTTSPlayStartRequestTTS.java
@@ -0,0 +1,43 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2024年06月03日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.cloudapi.control;
+
+import com.google.common.base.Charsets;
+import com.google.common.hash.Hashing;
+
+import java.beans.Encoder;
+
+public class SpeakerTTSPlayStartRequestTTS {
+    String md5;
+
+    String name;
+
+    String text;
+
+    public String getMd5() {
+        return md5;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+        this.md5 = Hashing.md5().newHasher().putString(text, Charsets.UTF_8)
+          .hash().toString();
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/TakeoffToPointRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/TakeoffToPointRequest.java
index f5a1692..f553efa 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/TakeoffToPointRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/TakeoffToPointRequest.java
@@ -8,11 +8,11 @@ import com.dji.sdk.cloudapi.wayline.SimulateMission;
 import com.dji.sdk.common.BaseModel;
 import com.dji.sdk.config.version.CloudSDKVersionEnum;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
@@ -21,7 +21,7 @@ import javax.validation.constraints.Pattern;
  */
 public class TakeoffToPointRequest extends BaseModel {
 
-    @Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
+    //@Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
     @NotNull
     private String flightId;
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/VideoStorageSetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/VideoStorageSetRequest.java
index eaba3e1..946ba92 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/VideoStorageSetRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/VideoStorageSetRequest.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.control;
 import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/api/AbstractControlService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/api/AbstractControlService.java
index e409615..7aafc9a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/api/AbstractControlService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/api/AbstractControlService.java
@@ -24,7 +24,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
@@ -486,6 +486,89 @@ public abstract class AbstractControlService {
                 request);
     }
 
+
+    @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_2, include = GatewayTypeEnum.DOCK2)
+    public TopicServicesResponse<ServicesReplyData> cameraFrameZoom(GatewayManager gateway, CameraFrameZoomRequest request) {
+        return servicesPublish.publish(
+          gateway.getGatewaySn(),
+          ControlMethodEnum.CAMERA_FRAME_ZOOM.getMethod(),
+          request);
+    }
+
+    //============================== Psdk ==============================
+
+    @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_PSDK_UI_RESOURCE_UPLOAD_RESULT, outputChannel = ChannelName.OUTBOUND_EVENTS)
+    public TopicEventsResponse<MqttReply> psdkUiResourceUploadResult(TopicEventsRequest<PSDKUiResourceUploadResult> request, MessageHeaders headers) {
+        throw new UnsupportedOperationException("psdkUiResourceUploadResult not implemented");
+    }
+
+    @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_PSDK_FLOATING_WINDOW_TEXT, outputChannel = ChannelName.OUTBOUND_EVENTS)
+    public TopicEventsResponse<MqttReply> psdkFloatingWindowText(TopicEventsRequest<PsdkFloatingWindowText> request, MessageHeaders headers) {
+        throw new UnsupportedOperationException("psdkFloatingWindowText not implemented");
+    }
+
+    @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_2, include = {GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2})
+    public TopicServicesResponse<ServicesReplyData> speakerAudioPlayStart(GatewayManager gateway, SpeakerAudioPlayStartRequest request) {
+        return servicesPublish.publish(
+          gateway.getGatewaySn(),
+          ControlMethodEnum.SPEAKER_AUDIO_PLAY_START.getMethod(),
+          request);
+    }
+
+    @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_SPEAKER_AUDIO_PLAY_START_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS)
+    public TopicEventsResponse<MqttReply> speakerAudioPlayStartProgress(TopicEventsRequest<EventsDataRequest<SpeakerPlayStartProgress>> request, MessageHeaders headers) {
+        throw new UnsupportedOperationException("speakerAudioPlayStartProgress not implemented");
+    }
+
+    @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_2, include = {GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2})
+    public TopicServicesResponse<ServicesReplyData> speakerTtsPlayStart(GatewayManager gateway, SpeakerTTSPlayStartRequest request) {
+        return servicesPublish.publish(
+          gateway.getGatewaySn(),
+          ControlMethodEnum.SPEAKER_TTS_PLAY_START.getMethod(),
+          request);
+    }
+
+    @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_SPEAKER_TTS_PLAY_START_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS)
+    public TopicEventsResponse<MqttReply> speakerTTSPlayStartProgress(TopicEventsRequest<EventsDataRequest<SpeakerPlayStartProgress>> request, MessageHeaders headers) {
+        throw new UnsupportedOperationException("speakerTTSPlayStartProgress not implemented");
+    }
+
+    @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_2, include = {GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2})
+    public TopicServicesResponse<ServicesReplyData> speakerReplay(GatewayManager gateway, PsdkRequest request) {
+        return servicesPublish.publish(
+          gateway.getGatewaySn(),
+          ControlMethodEnum.SPEAKER_REPLAY.getMethod(),
+          request);
+    }
+
+    @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_2, include = {GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2})
+    public TopicServicesResponse<ServicesReplyData> speakerPlayStop(GatewayManager gateway, PsdkRequest request) {
+        return servicesPublish.publish(
+          gateway.getGatewaySn(),
+          ControlMethodEnum.SPEAKER_PLAY_STOP.getMethod(),
+          request);
+    }
+
+    @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_2, include = {GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2})
+    public TopicServicesResponse<ServicesReplyData> speakerPlayModeSet(GatewayManager gateway, SpeakerPlayModeSetRequest request) {
+        return servicesPublish.publish(
+          gateway.getGatewaySn(),
+          ControlMethodEnum.SPEAKER_PLAY_MODE_SET.getMethod(),
+          request);
+    }
+
+
+    @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_2, include = {GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2})
+    public TopicServicesResponse<ServicesReplyData> speakerPlayVolumeSet(GatewayManager gateway, SpeakerPlayVolumeSetRequest request) {
+        return servicesPublish.publish(
+          gateway.getGatewaySn(),
+          ControlMethodEnum.SPEAKER_PLAY_VOLUME_SET.getMethod(),
+          request);
+    }
+
+    /////////////////////////////////////////////////////////////////////
+
+
     /**
      * Payload control
      * @param gateway
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/AirConditionerModeSwitchRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/AirConditionerModeSwitchRequest.java
index 78698bc..6f0c65d 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/AirConditionerModeSwitchRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/AirConditionerModeSwitchRequest.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.debug;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/AlarmStateSwitchRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/AlarmStateSwitchRequest.java
index 0f7c584..85c6f6e 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/AlarmStateSwitchRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/AlarmStateSwitchRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.debug;
 import com.dji.sdk.cloudapi.device.SwitchActionEnum;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/BatteryMaintenanceSwitchRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/BatteryMaintenanceSwitchRequest.java
index c25f1ca..93ce531 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/BatteryMaintenanceSwitchRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/BatteryMaintenanceSwitchRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.debug;
 import com.dji.sdk.cloudapi.device.SwitchActionEnum;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/BatteryStoreModeSwitchRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/BatteryStoreModeSwitchRequest.java
index 974bbcc..4a32938 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/BatteryStoreModeSwitchRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/BatteryStoreModeSwitchRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.debug;
 import com.dji.sdk.cloudapi.device.BatteryStoreModeEnum;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/EsimActivateRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/EsimActivateRequest.java
index 59b5c65..07af9ee 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/EsimActivateRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/EsimActivateRequest.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.debug;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/EsimOperatorSwitchRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/EsimOperatorSwitchRequest.java
index 753c992..4fba791 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/EsimOperatorSwitchRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/EsimOperatorSwitchRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.debug;
 import com.dji.sdk.cloudapi.device.TelecomOperatorEnum;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/RemoteDebugStepKeyEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/RemoteDebugStepKeyEnum.java
index ddeca50..60f99b6 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/RemoteDebugStepKeyEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/RemoteDebugStepKeyEnum.java
@@ -59,7 +59,9 @@ public enum RemoteDebugStepKeyEnum {
 
     FREE_PUTTER("free_putter", "Free Putter"),
 
-    STOP_CHARGE("stop_charge", "Stop charging");
+    STOP_CHARGE("stop_charge", "Stop charging"),
+
+    UNKNOWN("unknown","Unknown");
 
     private final String stepKey;
 
@@ -79,10 +81,11 @@ public enum RemoteDebugStepKeyEnum {
         return message;
     }
 
+    //fix: 提供unknown取代异常 witcom@2023.10.30
     @JsonCreator
     public static RemoteDebugStepKeyEnum find(String stepKey) {
         return Arrays.stream(values()).filter(stepKeyEnum -> stepKeyEnum.stepKey.equals(stepKey)).findAny()
-            .orElseThrow(() -> new CloudSDKException(RemoteDebugStepKeyEnum.class,stepKey));
+            .orElse(UNKNOWN);
     }
 
 }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/SdrWorkmodeSwitchRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/SdrWorkmodeSwitchRequest.java
index 2298a28..67d51d3 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/SdrWorkmodeSwitchRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/SdrWorkmodeSwitchRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.debug;
 import com.dji.sdk.cloudapi.device.LinkWorkModeEnum;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/SimSlotSwitchRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/SimSlotSwitchRequest.java
index 3f7c7b4..12fa70c 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/SimSlotSwitchRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/SimSlotSwitchRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.debug;
 import com.dji.sdk.cloudapi.device.SimSlotEnum;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/api/AbstractDebugService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/api/AbstractDebugService.java
index a8de7e7..f38ce1d 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/api/AbstractDebugService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/debug/api/AbstractDebugService.java
@@ -22,7 +22,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/CameraModeEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/CameraModeEnum.java
index a7a1869..3dc1a7f 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/CameraModeEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/CameraModeEnum.java
@@ -13,6 +13,8 @@ import java.util.Arrays;
  */
 public enum CameraModeEnum {
 
+    //fix: Cannot construct instance of `com.dji.sdk.cloudapi.device.CameraModeEnum`, problem: com.dji.sdk.cloudapi.device.CameraModeEnum has unknown data: [-1] vincent @ 2023.12.07
+    UNKNOWN(-1),
     PHOTO(0),
 
     VIDEO(1),
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DeviceOsdHost.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DeviceOsdHost.java
index f540f48..1e58d3f 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DeviceOsdHost.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DeviceOsdHost.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.device;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DeviceOsdWsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DeviceOsdWsResponse.java
index 57e17f5..b1e9312 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DeviceOsdWsResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DeviceOsdWsResponse.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.device;
 import com.dji.sdk.common.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockDroneCurrentRthMode.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockDroneCurrentRthMode.java
index b70fcba..0e37a17 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockDroneCurrentRthMode.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockDroneCurrentRthMode.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.device;
 import com.dji.sdk.cloudapi.wayline.RthModeEnum;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockLiveErrorStatus.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockLiveErrorStatus.java
index 67b58cf..3f9705e 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockLiveErrorStatus.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockLiveErrorStatus.java
@@ -37,11 +37,14 @@ public class DockLiveErrorStatus {
     }
 
     public String getMessage() {
+        if(success){ return "success";}
         return errorCode.getMessage();
     }
 
     @JsonValue
     public Integer getCode() {
+        //witcom: errorCode.getCode() will cause npe 2023.10.30
+        if(success){ return 0; }
         return source.getSource() * MOD + errorCode.getCode();
     }
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockSilentMode.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockSilentMode.java
index 4c11e5f..b326208 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockSilentMode.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/DockSilentMode.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.property.SilentModeEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/GearEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/GearEnum.java
index b22a957..8d80b74 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/GearEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/GearEnum.java
@@ -32,7 +32,8 @@ public enum GearEnum {
     G(8),
 
     T(9),
-    ;
+    //problem: com.dji.sdk.cloudapi.device.GearEnum has unknown data: [65535]
+    UNKNOWN(65535);
 
     private final int gear;
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/PayloadIndex.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/PayloadIndex.java
index c3c842f..87c2046 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/PayloadIndex.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/PayloadIndex.java
@@ -5,7 +5,7 @@ import com.dji.sdk.exception.CloudSDKException;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.util.Arrays;
 import java.util.Objects;
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/VideoId.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/VideoId.java
index a61b77b..6247807 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/VideoId.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/VideoId.java
@@ -7,7 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 import org.springframework.util.StringUtils;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.util.Arrays;
 import java.util.Objects;
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/OtaCreateDevice.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/OtaCreateDevice.java
index bef65e7..fced5e9 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/OtaCreateDevice.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/OtaCreateDevice.java
@@ -1,7 +1,7 @@
 package com.dji.sdk.cloudapi.firmware;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/OtaCreateRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/OtaCreateRequest.java
index 9c00762..df70319 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/OtaCreateRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/OtaCreateRequest.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.firmware;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/api/AbstractFirmwareService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/api/AbstractFirmwareService.java
index 461ae0c..bb8aebb 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/api/AbstractFirmwareService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/firmware/api/AbstractFirmwareService.java
@@ -18,7 +18,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FeatureProperty.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FeatureProperty.java
index 0fcbc73..7cde2b5 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FeatureProperty.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FeatureProperty.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.flightarea;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.Min;
+import jakarta.validation.constraints.Min;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaFeature.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaFeature.java
index 41ece85..d3b2f0e 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaFeature.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaFeature.java
@@ -1,8 +1,8 @@
 package com.dji.sdk.cloudapi.flightarea;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
@@ -11,7 +11,7 @@ import javax.validation.constraints.Pattern;
  */
 public class FlightAreaFeature {
 
-    @Pattern(regexp = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
+    //@Pattern(regexp = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
     @NotNull
     private String id;
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaGetFile.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaGetFile.java
index 174e44d..a13d898 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaGetFile.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaGetFile.java
@@ -1,7 +1,7 @@
 package com.dji.sdk.cloudapi.flightarea;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaJson.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaJson.java
index e976949..127a7d8 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaJson.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreaJson.java
@@ -1,6 +1,6 @@
 package com.dji.sdk.cloudapi.flightarea;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreasGetResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreasGetResponse.java
index f0199a0..fbc2b87 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreasGetResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/FlightAreasGetResponse.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.flightarea;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/api/AbstractFlightAreaService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/api/AbstractFlightAreaService.java
index 910acca..f2bdc25 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/api/AbstractFlightAreaService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/flightarea/api/AbstractFlightAreaService.java
@@ -18,7 +18,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/CustomDataTransmissionToEsdkRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/CustomDataTransmissionToEsdkRequest.java
index 2611233..a7c52ee 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/CustomDataTransmissionToEsdkRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/CustomDataTransmissionToEsdkRequest.java
@@ -1,9 +1,9 @@
 package com.dji.sdk.cloudapi.interconnection;
 
 import com.dji.sdk.common.BaseModel;
+import jakarta.validation.constraints.NotNull;
 import org.hibernate.validator.constraints.Length;
 
-import javax.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/CustomDataTransmissionToPsdkRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/CustomDataTransmissionToPsdkRequest.java
index 35dc96f..3812f02 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/CustomDataTransmissionToPsdkRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/CustomDataTransmissionToPsdkRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.interconnection;
 import com.dji.sdk.common.BaseModel;
 import org.hibernate.validator.constraints.Length;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/api/AbstractInterconnectionService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/api/AbstractInterconnectionService.java
index eccc52d..b80e8ab 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/api/AbstractInterconnectionService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/interconnection/api/AbstractInterconnectionService.java
@@ -1,10 +1,7 @@
 package com.dji.sdk.cloudapi.interconnection.api;
 
 import com.dji.sdk.annotations.CloudSDKVersion;
-import com.dji.sdk.cloudapi.interconnection.CustomDataTransmissionFromEsdk;
-import com.dji.sdk.cloudapi.interconnection.CustomDataTransmissionToEsdkRequest;
-import com.dji.sdk.cloudapi.interconnection.CustomDataTransmissionToPsdkRequest;
-import com.dji.sdk.cloudapi.interconnection.InterconnectionMethodEnum;
+import com.dji.sdk.cloudapi.interconnection.*;
 import com.dji.sdk.config.version.CloudSDKVersionEnum;
 import com.dji.sdk.config.version.GatewayManager;
 import com.dji.sdk.config.version.GatewayTypeEnum;
@@ -19,7 +16,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
@@ -64,7 +61,7 @@ public abstract class AbstractInterconnectionService {
      */
     @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_CUSTOM_DATA_TRANSMISSION_FROM_PSDK, outputChannel = ChannelName.OUTBOUND_EVENTS)
     @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_0)
-    public TopicEventsResponse<MqttReply> customDataTransmissionFromPsdk(TopicEventsRequest<CustomDataTransmissionFromEsdk> request, MessageHeaders headers) {
+    public TopicEventsResponse<MqttReply> customDataTransmissionFromPsdk(TopicEventsRequest<CustomDataTransmissionFromPsdk> request, MessageHeaders headers) {
         throw new UnsupportedOperationException("customDataTransmissionFromPsdk not implemented");
     }
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveLensChangeRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveLensChangeRequest.java
index ff498b9..8385ebd 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveLensChangeRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveLensChangeRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.livestream;
 import com.dji.sdk.cloudapi.device.VideoId;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveSetQualityRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveSetQualityRequest.java
index 541b25e..1965ab9 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveSetQualityRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveSetQualityRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.livestream;
 import com.dji.sdk.cloudapi.device.VideoId;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveStartPushRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveStartPushRequest.java
index e99507b..1793dba 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveStartPushRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveStartPushRequest.java
@@ -3,8 +3,9 @@ package com.dji.sdk.cloudapi.livestream;
 import com.dji.sdk.cloudapi.device.VideoId;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.Valid;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveStopPushRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveStopPushRequest.java
index 9107c53..e3521d0 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveStopPushRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LiveStopPushRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.livestream;
 import com.dji.sdk.cloudapi.device.VideoId;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamAgoraUrl.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamAgoraUrl.java
index f86c211..d5256df 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamAgoraUrl.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamAgoraUrl.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.livestream;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.net.URLEncoder;
 import java.nio.charset.Charset;
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamGb28181Url.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamGb28181Url.java
index 99622db..31be95e 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamGb28181Url.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamGb28181Url.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.livestream;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamRtmpUrl.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamRtmpUrl.java
index d3d4850..4a4d29c 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamRtmpUrl.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamRtmpUrl.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.livestream;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamRtspUrl.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamRtspUrl.java
index 5fda187..20745e3 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamRtspUrl.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamRtspUrl.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.livestream;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamWhipUrl.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamWhipUrl.java
index 32745da..e62ab74 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamWhipUrl.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/LivestreamWhipUrl.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.livestream;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/api/AbstractLivestreamService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/api/AbstractLivestreamService.java
index 7db68f6..a51997c 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/api/AbstractLivestreamService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/livestream/api/AbstractLivestreamService.java
@@ -12,7 +12,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadListRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadListRequest.java
index e1f52d1..bdbe007 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadListRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadListRequest.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.log;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartFile.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartFile.java
index cd905ab..a151370 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartFile.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartFile.java
@@ -1,7 +1,7 @@
 package com.dji.sdk.cloudapi.log;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartParam.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartParam.java
index 4bb8423..f096e96 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartParam.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartParam.java
@@ -1,8 +1,8 @@
 package com.dji.sdk.cloudapi.log;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartRequest.java
index 366836a..b72d036 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadStartRequest.java
@@ -5,8 +5,8 @@ import com.dji.sdk.cloudapi.storage.OssTypeEnum;
 import com.dji.sdk.cloudapi.storage.StsCredentialsResponse;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadUpdateRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadUpdateRequest.java
index e909ab6..c270727 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadUpdateRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/FileUploadUpdateRequest.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.log;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/LogFileIndex.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/LogFileIndex.java
index b830901..0d191b7 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/LogFileIndex.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/LogFileIndex.java
@@ -1,6 +1,6 @@
 package com.dji.sdk.cloudapi.log;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/api/AbstractLogService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/api/AbstractLogService.java
index e8daece..b668642 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/api/AbstractLogService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/log/api/AbstractLogService.java
@@ -15,7 +15,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/CreateMapElementRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/CreateMapElementRequest.java
index 8c5947c..2ec83c7 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/CreateMapElementRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/CreateMapElementRequest.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.map;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/CreateMapElementResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/CreateMapElementResponse.java
index 26769ed..a5a828c 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/CreateMapElementResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/CreateMapElementResponse.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.map;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementContent.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementContent.java
index 9890891..8905d8b 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementContent.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementContent.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.map;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementCoordinate.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementCoordinate.java
index 332f492..95382c7 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementCoordinate.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementCoordinate.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.map;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementLineStringGeometry.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementLineStringGeometry.java
index a24eeb4..9571bc0 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementLineStringGeometry.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementLineStringGeometry.java
@@ -5,8 +5,8 @@ import com.dji.sdk.exception.CloudSDKException;
 import io.swagger.v3.oas.annotations.media.Schema;
 import org.springframework.util.CollectionUtils;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPointGeometry.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPointGeometry.java
index 8fe6d8b..f1c06b2 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPointGeometry.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPointGeometry.java
@@ -5,8 +5,8 @@ import com.dji.sdk.exception.CloudSDKException;
 import io.swagger.v3.oas.annotations.media.Schema;
 import org.springframework.util.CollectionUtils;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPolygonGeometry.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPolygonGeometry.java
index e7d2670..e63a738 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPolygonGeometry.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementPolygonGeometry.java
@@ -5,8 +5,8 @@ import com.dji.sdk.exception.CloudSDKException;
 import io.swagger.v3.oas.annotations.media.Schema;
 import org.springframework.util.CollectionUtils;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementProperty.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementProperty.java
index d3a35aa..2d3aa63 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementProperty.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementProperty.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.map;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementResource.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementResource.java
index 33571d2..21366e0 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementResource.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementResource.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.map;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/GetMapElementsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/GetMapElementsResponse.java
index f2c41e1..4fa9e56 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/GetMapElementsResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/GetMapElementsResponse.java
@@ -4,9 +4,9 @@ import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementCreateWsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementCreateWsResponse.java
index 74933f5..72d8f31 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementCreateWsResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementCreateWsResponse.java
@@ -4,10 +4,10 @@ import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementDeleteWsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementDeleteWsResponse.java
index fdf48ae..3cda3e4 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementDeleteWsResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementDeleteWsResponse.java
@@ -4,8 +4,8 @@ import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementUpdateWsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementUpdateWsResponse.java
index 2ace077..7f2ee2c 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementUpdateWsResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementUpdateWsResponse.java
@@ -4,10 +4,10 @@ import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupElement.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupElement.java
index f360571..d3e599a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupElement.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupElement.java
@@ -3,10 +3,10 @@ package com.dji.sdk.cloudapi.map;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupRefreshWsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupRefreshWsResponse.java
index b30c2ea..8e66ded 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupRefreshWsResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupRefreshWsResponse.java
@@ -4,9 +4,9 @@ import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapFile.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapFile.java
index db8b364..b026762 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapFile.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapFile.java
@@ -1,7 +1,7 @@
 package com.dji.sdk.cloudapi.map;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapGetResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapGetResponse.java
index 43ebc83..a2c702d 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapGetResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapGetResponse.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.map;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/UpdateMapElementRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/UpdateMapElementRequest.java
index 1c712be..ac4346a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/UpdateMapElementRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/UpdateMapElementRequest.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.map;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/AbstractOfflineMapService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/AbstractOfflineMapService.java
index af47a44..54b5394 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/AbstractOfflineMapService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/AbstractOfflineMapService.java
@@ -11,6 +11,8 @@ import com.dji.sdk.config.version.GatewayManager;
 import com.dji.sdk.config.version.GatewayTypeEnum;
 import com.dji.sdk.mqtt.ChannelName;
 import com.dji.sdk.mqtt.MqttReply;
+import com.dji.sdk.mqtt.events.TopicEventsRequest;
+import com.dji.sdk.mqtt.events.TopicEventsResponse;
 import com.dji.sdk.mqtt.requests.TopicRequestsRequest;
 import com.dji.sdk.mqtt.requests.TopicRequestsResponse;
 import com.dji.sdk.mqtt.services.ServicesPublish;
@@ -22,7 +24,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
@@ -66,7 +68,8 @@ public abstract class AbstractOfflineMapService {
      */
     @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_OFFLINE_MAP_SYNC_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS)
     @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_1, include = GatewayTypeEnum.DOCK2)
-    public TopicRequestsResponse<MqttReply> offlineMapSyncProgress(TopicRequestsRequest<OfflineMapSyncProgress> request, MessageHeaders headers) {
+    //fix: SpelEvaluationException: EL1004E: Method call: Method offlineMapSyncProgress(com.dji.sdk.mqtt.events.TopicEventsRequest,org.springframework.messaging.MessageHeaders) cannot be found on type
+    public TopicEventsResponse<MqttReply> offlineMapSyncProgress(TopicEventsRequest<OfflineMapSyncProgress> request, MessageHeaders headers) {
         throw new UnsupportedOperationException("offlineMapSyncProgress not implemented");
     }
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/IHttpMapService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/IHttpMapService.java
index be0530b..9f9393a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/IHttpMapService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/IHttpMapService.java
@@ -11,9 +11,9 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FastUploadExtension.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FastUploadExtension.java
index 5426ceb..f852b9c 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FastUploadExtension.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FastUploadExtension.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.device.DeviceEnum;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FolderUploadCallbackRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FolderUploadCallbackRequest.java
index 78abab4..c4892c4 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FolderUploadCallbackRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FolderUploadCallbackRequest.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.media;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintRequest.java
index 7fe08bb..9e6d967 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintRequest.java
@@ -4,7 +4,7 @@ package com.dji.sdk.cloudapi.media;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintResponse.java
index d0ab21a..a0f8bd6 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintResponse.java
@@ -5,7 +5,7 @@ import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFastUploadRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFastUploadRequest.java
index 78c22b3..2e3fb51 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFastUploadRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFastUploadRequest.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.media;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileExtension.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileExtension.java
index 8e2f7c9..39381d4 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileExtension.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileExtension.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.device.DeviceEnum;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java
index 5a5a17b..541a3d2 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java
@@ -4,8 +4,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.time.LocalDateTime;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaUploadCallbackRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaUploadCallbackRequest.java
index 6567ea3..a5a7722 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaUploadCallbackRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaUploadCallbackRequest.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.media;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/Position.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/Position.java
index f192f6e..94f8567 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/Position.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/Position.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.media;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGetModuleEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGetModuleEnum.java
index b61fe8a..4552e9a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGetModuleEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGetModuleEnum.java
@@ -13,7 +13,9 @@ import java.util.Arrays;
  */
 public enum StorageConfigGetModuleEnum {
 
-    MEDIA(0);
+    MEDIA(0),
+
+    PSDK_UI(1);
 
     private final int module;
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/UploadFlighttaskMediaPrioritize.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/UploadFlighttaskMediaPrioritize.java
index b93fad3..37fa2ff 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/UploadFlighttaskMediaPrioritize.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/UploadFlighttaskMediaPrioritize.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.media;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
@@ -12,8 +12,9 @@ import javax.validation.constraints.Pattern;
  */
 public class UploadFlighttaskMediaPrioritize extends BaseModel {
 
+    /* fix: flightId是应用层提供的,应用层有自己的id构建规则,如果不是设备原因必须指定格式,最好就不要控制flightId的格式了 by witcom@2023.09.22 */
     @NotNull
-    @Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
+    //@Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
     private String flightId;
 
     public UploadFlighttaskMediaPrioritize() {
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/AbstractMediaService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/AbstractMediaService.java
index ad45aa8..6a1bbda 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/AbstractMediaService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/AbstractMediaService.java
@@ -17,7 +17,7 @@ import com.dji.sdk.mqtt.services.TopicServicesResponse;
 import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/IHttpMediaService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/IHttpMediaService.java
index 81a23e0..55032c7 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/IHttpMediaService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/IHttpMediaService.java
@@ -13,9 +13,9 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportBindStatusResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportBindStatusResponse.java
index 2bff608..49713b4 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportBindStatusResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportBindStatusResponse.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.organization;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationBindResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationBindResponse.java
index 296fcb6..694a58b 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationBindResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationBindResponse.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.organization;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetResponse.java
index cb10abf..079e7d1 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetResponse.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.organization;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusRequestDevice.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusRequestDevice.java
index 68a263e..934b27f 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusRequestDevice.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusRequestDevice.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.organization;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindInfo.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindInfo.java
index 128c44b..67e0e05 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindInfo.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindInfo.java
@@ -2,7 +2,7 @@ package com.dji.sdk.cloudapi.organization;
 
 import com.dji.sdk.mqtt.MqttReply;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusData.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusData.java
index cf03f33..960bb86 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusData.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusData.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.property;
 import com.dji.sdk.cloudapi.device.SwitchActionEnum;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
 
 /**
  * The state of the drone's limited distance
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusSet.java
index ddca848..bdbcfd8 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusSet.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.property;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * The state of the drone's limited distance
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderFlightHeight.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderFlightHeight.java
index 5178d1c..6793a97 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderFlightHeight.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderFlightHeight.java
@@ -3,9 +3,9 @@ package com.dji.sdk.cloudapi.property;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderModeLostAction.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderModeLostAction.java
index 014a4b6..1e5e9a0 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderModeLostAction.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderModeLostAction.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.control.CommanderModeLostActionEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneOfflineMapEnable.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneOfflineMapEnable.java
index c329212..f1e153c 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneOfflineMapEnable.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneOfflineMapEnable.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.property;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneRthMode.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneRthMode.java
index f900076..d47b6cc 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneRthMode.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneRthMode.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.wayline.RthModeEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ExitWaylineWhenRcLostSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ExitWaylineWhenRcLostSet.java
index d9053fa..0e5d158 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ExitWaylineWhenRcLostSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ExitWaylineWhenRcLostSet.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.device.ExitWaylineWhenRcLostEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/HeightLimitSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/HeightLimitSet.java
index 0fc3180..908e0a5 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/HeightLimitSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/HeightLimitSet.java
@@ -3,9 +3,9 @@ package com.dji.sdk.cloudapi.property;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/NightLightsStateSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/NightLightsStateSet.java
index feb5fea..3e779bb 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/NightLightsStateSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/NightLightsStateSet.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.device.SwitchActionEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ObstacleAvoidanceSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ObstacleAvoidanceSet.java
index f84ec4c..2fbce67 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ObstacleAvoidanceSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ObstacleAvoidanceSet.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.property;
 import com.dji.sdk.cloudapi.device.ObstacleAvoidance;
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RcLostActionSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RcLostActionSet.java
index 6866478..fe9e0db 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RcLostActionSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RcLostActionSet.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.device.RcLostActionEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RthAltitudeSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RthAltitudeSet.java
index 94e3094..a3a9a5c 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RthAltitudeSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RthAltitudeSet.java
@@ -3,9 +3,9 @@ package com.dji.sdk.cloudapi.property;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalCurrentPaletteStyleSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalCurrentPaletteStyleSet.java
index 6b5e847..536cd54 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalCurrentPaletteStyleSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalCurrentPaletteStyleSet.java
@@ -5,8 +5,8 @@ import com.dji.sdk.cloudapi.device.ThermalPaletteStyleEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.Map;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalGainModeSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalGainModeSet.java
index f49bea4..09415a2 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalGainModeSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalGainModeSet.java
@@ -5,8 +5,8 @@ import com.dji.sdk.cloudapi.device.ThermalGainModeEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.Map;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermLowerLimitSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermLowerLimitSet.java
index 66ff5b4..652c69d 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermLowerLimitSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermLowerLimitSet.java
@@ -4,8 +4,8 @@ import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.Map;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermStateSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermStateSet.java
index df25b38..7622125 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermStateSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermStateSet.java
@@ -5,8 +5,8 @@ import com.dji.sdk.cloudapi.device.SwitchActionEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.Map;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermUpperLimitSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermUpperLimitSet.java
index 3d5df2b..95d1b10 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermUpperLimitSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermUpperLimitSet.java
@@ -4,8 +4,8 @@ import com.dji.sdk.cloudapi.device.PayloadIndex;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.Map;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/UserExperienceImprovementSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/UserExperienceImprovementSet.java
index eda802d..f930cdf 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/UserExperienceImprovementSet.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/UserExperienceImprovementSet.java
@@ -4,7 +4,7 @@ import com.dji.sdk.cloudapi.device.UserExperienceImprovementEnum;
 import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/api/AbstractPropertyService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/api/AbstractPropertyService.java
index 56a9ab7..f3fb225 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/api/AbstractPropertyService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/api/AbstractPropertyService.java
@@ -12,8 +12,8 @@ import com.dji.sdk.mqtt.property.PropertySetPublish;
 import com.dji.sdk.mqtt.property.PropertySetReplyResultEnum;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import javax.annotation.Resource;
-import javax.validation.Valid;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
 import java.lang.reflect.Field;
 import java.util.HashMap;
 import java.util.Map;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/CredentialsToken.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/CredentialsToken.java
index c8ffc0e..dd79841 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/CredentialsToken.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/CredentialsToken.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.storage;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/StsCredentialsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/StsCredentialsResponse.java
index 0821274..14cbe0f 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/StsCredentialsResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/StsCredentialsResponse.java
@@ -4,9 +4,9 @@ import com.dji.sdk.common.BaseModel;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/api/IHttpStorageService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/api/IHttpStorageService.java
index 602a8d2..c3f69b8 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/api/IHttpStorageService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/api/IHttpStorageService.java
@@ -8,8 +8,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceIconUrl.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceIconUrl.java
index 937cb4a..0690e2f 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceIconUrl.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceIconUrl.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.tsa;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceTopology.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceTopology.java
index 437783d..68775e7 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceTopology.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceTopology.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.tsa;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyDeviceModel.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyDeviceModel.java
index 770c28b..a66e6fc 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyDeviceModel.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyDeviceModel.java
@@ -7,7 +7,7 @@ import com.dji.sdk.cloudapi.device.DeviceTypeEnum;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyList.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyList.java
index acdf7b2..6e064d3 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyList.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyList.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.tsa;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyResponse.java
index 352b947..046112a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyResponse.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.tsa;
 import com.dji.sdk.common.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/api/IHttpTsaService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/api/IHttpTsaService.java
index 6e9a2d8..7cd2a5d 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/api/IHttpTsaService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/api/IHttpTsaService.java
@@ -9,8 +9,8 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/ExecutableConditions.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/ExecutableConditions.java
index 768b301..f5e2f57 100755
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/ExecutableConditions.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/ExecutableConditions.java
@@ -1,7 +1,7 @@
 package com.dji.sdk.cloudapi.wayline;
 
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskBreakPoint.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskBreakPoint.java
index e52a3d9..757f151 100755
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskBreakPoint.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskBreakPoint.java
@@ -1,8 +1,8 @@
 package com.dji.sdk.cloudapi.wayline;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
@@ -24,12 +24,10 @@ public class FlighttaskBreakPoint {
     @NotNull
     private BreakpointStateEnum state;
 
-    /**
-     * Current wayline segment process
-     */
-    @NotNull
-    @Min(0)
-    @Max(1)
+
+//    @NotNull
+//    @Min(0)
+//    @Max(1)
     private Float progress;
 
     /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskCreateFile.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskCreateFile.java
index 271d2d4..2db2fcf 100755
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskCreateFile.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskCreateFile.java
@@ -1,6 +1,6 @@
 package com.dji.sdk.cloudapi.wayline;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskCreateRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskCreateRequest.java
index c614c96..f6b4d53 100755
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskCreateRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskCreateRequest.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.wayline;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskExecuteRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskExecuteRequest.java
index 5ef50d5..7e6533b 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskExecuteRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskExecuteRequest.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.wayline;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
@@ -12,8 +12,11 @@ import javax.validation.constraints.Pattern;
  */
 public class FlighttaskExecuteRequest extends BaseModel {
 
+    /**
+     * fix: flightId是应用层提供的,应用层有自己的id构建规则,如果不是设备原因必须指定格式,最好就不要控制flightId的格式了 by witcom@2023.09.22
+     */
     @NotNull
-    @Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
+    //@Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
     private String flightId;
 
     public FlighttaskExecuteRequest() {
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskFile.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskFile.java
index 70837fc..1958571 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskFile.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskFile.java
@@ -1,6 +1,6 @@
 package com.dji.sdk.cloudapi.wayline;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskPrepareRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskPrepareRequest.java
index c1777f8..3a7af42 100755
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskPrepareRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskPrepareRequest.java
@@ -6,11 +6,11 @@ import com.dji.sdk.common.BaseModel;
 import com.dji.sdk.config.version.CloudSDKVersionEnum;
 import com.dji.sdk.config.version.GatewayTypeEnum;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
@@ -21,9 +21,10 @@ public class FlighttaskPrepareRequest extends BaseModel {
 
     /**
      * Task ID
+     * fix: flightId是应用层提供的,应用层有自己的id构建规则,如果不是设备原因必须指定格式,最好就不要控制flightId的格式了 by witcom@2023.09.22
      */
     @NotNull
-    @Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
+    //@Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
     private String flightId;
 
     /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskResourceGetResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskResourceGetResponse.java
index 1a1f275..d595a50 100755
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskResourceGetResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskResourceGetResponse.java
@@ -2,8 +2,8 @@ package com.dji.sdk.cloudapi.wayline;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskUndoRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskUndoRequest.java
index 10b9a48..a0bbcea 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskUndoRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/FlighttaskUndoRequest.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.wayline;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
@@ -14,9 +14,12 @@ import java.util.List;
  */
 public class FlighttaskUndoRequest extends BaseModel {
 
+    /**
+     * fix: flightId是应用层提供的,应用层有自己的id构建规则,如果不是设备原因必须指定格式,最好就不要控制flightId的格式了 by witcom@2023.09.22
+     */
     @NotNull
     @Size(min = 1)
-    private List<@Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$") String> flightIds;
+    private List</*@Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")*/ String> flightIds;
 
     public FlighttaskUndoRequest() {
     }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListOrderBy.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListOrderBy.java
index e81d175..2ba129a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListOrderBy.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListOrderBy.java
@@ -3,7 +3,7 @@ package com.dji.sdk.cloudapi.wayline;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListRequest.java
index 5b28c32..66761a3 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListRequest.java
@@ -5,10 +5,10 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import jakarta.validation.Valid;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListResponse.java
index 69b7400..a754f9a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/GetWaylineListResponse.java
@@ -6,10 +6,10 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/ReadyConditions.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/ReadyConditions.java
index ea0288e..8a2f4e6 100755
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/ReadyConditions.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/ReadyConditions.java
@@ -2,9 +2,9 @@ package com.dji.sdk.cloudapi.wayline;
 
 import com.dji.sdk.common.BaseModel;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/SimulateMission.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/SimulateMission.java
index bf3c4bc..17af878 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/SimulateMission.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/SimulateMission.java
@@ -1,8 +1,8 @@
 package com.dji.sdk.cloudapi.wayline;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineUploadCallbackMetadata.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineUploadCallbackMetadata.java
index aa97993..819962d 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineUploadCallbackMetadata.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineUploadCallbackMetadata.java
@@ -4,8 +4,8 @@ import com.dji.sdk.cloudapi.device.DeviceEnum;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineUploadCallbackRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineUploadCallbackRequest.java
index 87f8214..9f94715 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineUploadCallbackRequest.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/WaylineUploadCallbackRequest.java
@@ -3,8 +3,8 @@ package com.dji.sdk.cloudapi.wayline;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/api/AbstractWaylineService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/api/AbstractWaylineService.java
index 783ef39..19b7c90 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/api/AbstractWaylineService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/api/AbstractWaylineService.java
@@ -22,7 +22,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
@@ -189,7 +189,10 @@ public abstract class AbstractWaylineService {
      */
     @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_RETURN_HOME_INFO, outputChannel = ChannelName.OUTBOUND_EVENTS)
     @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_0)
-    public TopicRequestsResponse<MqttReply> returnHomeInfo(TopicRequestsRequest<ReturnHomeInfo> request, MessageHeaders headers) {
+    //fix: SpelEvaluationException: EL1004E: Method call: Method returnHomeInfo(com.dji.sdk.mqtt.events.TopicEventsRequest,org.springframework.messaging.MessageHeaders) cannot be found on type xxx
+    //public TopicRequestsResponse<MqttReply> returnHomeInfo(TopicRequestsRequest<ReturnHomeInfo> request, MessageHeaders headers) {
+    public TopicEventsResponse<MqttReply> returnHomeInfo(TopicEventsRequest<ReturnHomeInfo> request, MessageHeaders headers){
+
         throw new UnsupportedOperationException("returnHomeInfo not implemented");
     }
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/api/IHttpWaylineService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/api/IHttpWaylineService.java
index 17fae68..2620054 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/api/IHttpWaylineService.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/wayline/api/IHttpWaylineService.java
@@ -12,11 +12,11 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springdoc.api.annotations.ParameterObject;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/BaseModel.java b/cloud-sdk/src/main/java/com/dji/sdk/common/BaseModel.java
index 77ef2d0..8d4ea5b 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/common/BaseModel.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/BaseModel.java
@@ -6,9 +6,7 @@ import com.dji.sdk.exception.CloudSDKErrorEnum;
 import com.dji.sdk.exception.CloudSDKException;
 import org.springframework.util.CollectionUtils;
 
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.Validator;
+import jakarta.validation.*;
 import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.HashSet;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/ErrorCodeSourceEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/common/ErrorCodeSourceEnum.java
index 01c1ef2..90f4cfe 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/common/ErrorCodeSourceEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/ErrorCodeSourceEnum.java
@@ -14,6 +14,9 @@ import java.util.Arrays;
  */
 public enum ErrorCodeSourceEnum {
 
+    //fix: Cannot construct instance of `com.dji.sdk.cloudapi.device.DockLiveErrorStatus`, problem: com.dji.sdk.common.ErrorCodeSourceEnum has unknown data: [0]
+    UNKNOWN(0),
+
     DEVICE(3),
 
     DOCK(5),
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/JDKLockBarrierImpl.java b/cloud-sdk/src/main/java/com/dji/sdk/common/JDKLockBarrierImpl.java
new file mode 100644
index 0000000..e7d5ae8
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/JDKLockBarrierImpl.java
@@ -0,0 +1,89 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月22日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.common;
+
+import com.dji.sdk.mqtt.Chan;
+import com.dji.sdk.mqtt.CommonTopicRequest;
+import com.dji.sdk.mqtt.CommonTopicResponse;
+
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class JDKLockBarrierImpl implements PublishBarrier{
+
+    /**
+     * 在我的实现中是采用一个定期清理的TimedCache储存请求
+     */
+    private final ConcurrentHashMap<String, JDKHolder> container = new ConcurrentHashMap<>();
+
+    @Override
+    public String generateIdentity(CommonTopicRequest requestData) {
+        return requestData.getTid();
+    }
+
+    @Override
+    public String generateIdentity(CommonTopicResponse receiveData) {
+        return receiveData.getTid();
+    }
+
+    @Override
+    public void put(String identity, CommonTopicResponse receiveData) {
+        if(hasIdentity(identity)){
+            container.get(identity).setData(receiveData);
+        }
+    }
+
+    @Override
+    public void registerRequest(String identity, CommonTopicRequest requestData) {
+        container.put(identity,new JDKHolder());
+    }
+
+    @Override
+    public PublishBarrierResult await(String identity, long timeout) {
+        JDKHolder jdkHolder = container.get(identity);
+        if(Objects.isNull(jdkHolder)){
+            throw new RuntimeException("等待指令返回前未注册指令到栅栏");
+        }
+        jdkHolder.await(timeout);
+
+        return jdkHolder.getResult();
+    }
+
+    @Override
+    public boolean hasIdentity(String identity) {
+        return container.containsKey(identity);
+    }
+
+    public static class JDKHolder{
+        volatile Object locker = new Object();
+        CommonTopicResponse response = null;
+
+        public void await(long timeout) {
+            synchronized (locker){
+                try {
+                    locker.wait(timeout);
+                }catch (InterruptedException e){}
+            }
+        }
+
+        public void setData(CommonTopicResponse receiveData) {
+            this.response = receiveData;
+            synchronized (locker){
+                locker.notify();
+            }
+        }
+
+        public PublishBarrierResult getResult() {
+            if(Objects.nonNull(response)){
+                return PublishBarrierResult.ok(response);
+            }else{
+                return PublishBarrierResult.EMPTY;
+            }
+        }
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/LocalCacheSDKManager.java b/cloud-sdk/src/main/java/com/dji/sdk/common/LocalCacheSDKManager.java
new file mode 100644
index 0000000..7dbfad3
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/LocalCacheSDKManager.java
@@ -0,0 +1,67 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月25日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.common;
+
+import com.dji.sdk.cloudapi.device.DeviceDomainEnum;
+import com.dji.sdk.cloudapi.device.DeviceEnum;
+import com.dji.sdk.cloudapi.device.DeviceSubTypeEnum;
+import com.dji.sdk.cloudapi.device.DeviceTypeEnum;
+import com.dji.sdk.config.version.GatewayManager;
+import com.dji.sdk.config.version.GatewayTypeEnum;
+import com.dji.sdk.exception.CloudSDKErrorEnum;
+import com.dji.sdk.exception.CloudSDKException;
+import org.springframework.stereotype.Component;
+
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class LocalCacheSDKManager implements SDKManager{
+
+    final ConcurrentHashMap<String, GatewayManager> SDK_MAP = new ConcurrentHashMap<>(16);
+
+
+    @Override
+    public GatewayManager getDeviceSDK(String gatewaySn) {
+        if (SDK_MAP.containsKey(gatewaySn)) {
+            return SDK_MAP.get(gatewaySn);
+        }
+        throw new CloudSDKException(CloudSDKErrorEnum.NOT_REGISTERED,
+                "The device has not been registered, please call the 'SDKManager.registerDevice()' method to register the device first.");
+    }
+
+    @Override
+    public Optional<GatewayManager> findDeviceSDK(String gatewaySn) {
+        if(SDK_MAP.containsKey(gatewaySn)){
+            return Optional.of(SDK_MAP.get(gatewaySn));
+        }else {
+            return Optional.empty();
+        }
+    }
+
+    @Override
+    public GatewayManager registerDevice(String gatewaySn, String droneSn, DeviceDomainEnum domain, DeviceTypeEnum type, DeviceSubTypeEnum subType, String gatewayThingVersion, String droneThingVersion) {
+        return registerDevice(gatewaySn, droneSn, GatewayTypeEnum.find(DeviceEnum.find(domain, type, subType)), gatewayThingVersion, droneThingVersion);
+    }
+
+    @Override
+    public GatewayManager registerDevice(String gatewaySn, String droneSn, GatewayTypeEnum type, String gatewayThingVersion, String droneThingVersion) {
+        return registerDevice(new GatewayManager(Objects.requireNonNull(gatewaySn), droneSn, type, gatewayThingVersion, droneThingVersion));
+    }
+
+    @Override
+    public GatewayManager registerDevice(GatewayManager gateway) {
+        SDK_MAP.put(gateway.getGatewaySn(), gateway);
+        return gateway;
+    }
+
+    @Override
+    public void logoutDevice(String gatewaySn) {
+        SDK_MAP.remove(gatewaySn);
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/PublishBarrier.java b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishBarrier.java
new file mode 100644
index 0000000..e5b0071
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishBarrier.java
@@ -0,0 +1,26 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月22日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.common;
+
+import com.dji.sdk.mqtt.CommonTopicRequest;
+import com.dji.sdk.mqtt.CommonTopicResponse;
+
+public interface PublishBarrier {
+
+    //构建栅栏标识方法
+    String generateIdentity(CommonTopicRequest requestData);
+    String generateIdentity(CommonTopicResponse receiveData);
+
+    void put(String identity, CommonTopicResponse receiveData);
+
+    void registerRequest(String identity, CommonTopicRequest requestData);
+
+    PublishBarrierResult await(String identity,long timeout);
+
+    boolean hasIdentity(String identity);
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/PublishBarrierResult.java b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishBarrierResult.java
new file mode 100644
index 0000000..38314fd
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishBarrierResult.java
@@ -0,0 +1,41 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月22日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.common;
+
+import com.dji.sdk.mqtt.CommonTopicResponse;
+
+public class PublishBarrierResult implements PublishResult {
+
+    public static PublishBarrierResult EMPTY = new PublishBarrierResult();
+
+    public static PublishBarrierResult ok(CommonTopicResponse data){
+        return new PublishBarrierResult().setData(data);
+    }
+
+
+    boolean timeout = true;
+
+    CommonTopicResponse data;
+
+    private PublishBarrierResult() {
+    }
+
+    private PublishBarrierResult setData(CommonTopicResponse data) {
+        this.data = data;
+        this.timeout = false;
+        return this;
+    }
+
+    public boolean isTimeout(){
+        return timeout;
+    }
+
+    public CommonTopicResponse getData(){
+        return data;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/PublishConfiguration.java b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishConfiguration.java
new file mode 100644
index 0000000..bfd008c
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishConfiguration.java
@@ -0,0 +1,88 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月22日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.common;
+
+import java.util.Objects;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+public class PublishConfiguration implements ReadonlyPublishConfiguration {
+
+    String bid;
+    String tid;
+
+    //默认超时
+    int timeout = 3;
+    //请求发送前调用
+    Consumer<PublishRequest> beforePublishHook = null;
+    //收到请求回信后调用
+    BiConsumer<PublishRequest, PublishBarrierResult> afterPublishHook = null;
+
+
+    public String getBid() {
+        return bid;
+    }
+
+    public String getTid() {
+        return tid;
+    }
+
+    public long getTimeout() {
+        return timeout * 1000;
+    }
+
+    public void setBizId(String bid) {
+        this.bid = bid;
+    }
+
+    public void setTransactionId(String tid) {
+        this.tid = tid;
+    }
+
+    public void setTimeout(int timeout) {
+        this.timeout = timeout;
+    }
+
+    public void setBeforePublishHook(Consumer<PublishRequest> callback) {
+        beforePublishHook = callback;
+    }
+
+    public void setAfterPublishReplyHook(BiConsumer<PublishRequest, PublishBarrierResult> callback) {
+        afterPublishHook = callback;
+    }
+
+    public void invokeBeforePublishHook(PublishRequest req){
+        if(Objects.nonNull(beforePublishHook)){
+            try {
+                beforePublishHook.accept(req);
+            }catch (Throwable ex){
+                //do nothing
+                //业务层的异常不理会
+            }
+        }
+    }
+
+    public void invokeAfterPublishReplyHook(PublishRequest req, PublishBarrierResult result){
+        if(Objects.nonNull(afterPublishHook)){
+            try{
+                afterPublishHook.accept(req,result);
+            }catch (Throwable ex){
+                //do nothing
+                //业务层的异常不理会
+            }
+        }
+    }
+
+    public boolean noneBeforePublishHook() {
+        return Objects.isNull(beforePublishHook);
+    }
+
+    public boolean noneAfterPublishHook() {
+        return Objects.isNull(afterPublishHook);
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/PublishOption.java b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishOption.java
new file mode 100644
index 0000000..5f33e49
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishOption.java
@@ -0,0 +1,57 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月22日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.common;
+
+import com.google.common.base.Strings;
+
+import java.util.Objects;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+public class PublishOption {
+
+    public static Consumer<PublishOption> DEFAULT = (cfg)->{};
+
+    final PublishConfiguration configuration;
+
+    public PublishOption(PublishConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public PublishOption withBizId(String bid){
+        if(!Strings.isNullOrEmpty(bid)){
+            configuration.setBizId(bid);
+        }
+        return this;
+    }
+
+    public PublishOption withTransactionId(String tid){
+        if(!Strings.isNullOrEmpty(tid)){
+            configuration.setTransactionId(tid);
+        }
+        return this;
+    }
+
+    public PublishOption timeout(int second){
+        configuration.setTimeout(second);
+        return this;
+    }
+
+    public PublishOption beforePublish(Consumer<PublishRequest> callback){
+        if(Objects.nonNull(callback)){
+            configuration.setBeforePublishHook(callback);
+        }
+        return this;
+    }
+    public PublishOption afterPublishReply(BiConsumer<PublishRequest, PublishBarrierResult> callback){
+        if(Objects.nonNull(callback)){
+            configuration.setAfterPublishReplyHook(callback);
+        }
+        return this;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/PublishRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishRequest.java
new file mode 100644
index 0000000..81c8674
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishRequest.java
@@ -0,0 +1,20 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月25日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.common;
+
+import com.dji.sdk.common.ReadonlyPublishConfiguration;
+import com.dji.sdk.mqtt.CommonTopicRequest;
+
+public interface PublishRequest {
+
+    String getTopic();
+
+    CommonTopicRequest getOriginRequest();
+
+    ReadonlyPublishConfiguration getConfiguration();
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/PublishResult.java b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishResult.java
new file mode 100644
index 0000000..8b23693
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/PublishResult.java
@@ -0,0 +1,17 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月25日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.common;
+
+import com.dji.sdk.mqtt.CommonTopicResponse;
+
+public interface PublishResult {
+
+    boolean isTimeout();
+
+    CommonTopicResponse getData();
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/ReadonlyPublishConfiguration.java b/cloud-sdk/src/main/java/com/dji/sdk/common/ReadonlyPublishConfiguration.java
new file mode 100644
index 0000000..ff4e880
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/ReadonlyPublishConfiguration.java
@@ -0,0 +1,17 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月25日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.common;
+
+public interface ReadonlyPublishConfiguration {
+
+    String getBid();
+
+    String getTid();
+
+    long getTimeout();
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/common/SDKManager.java b/cloud-sdk/src/main/java/com/dji/sdk/common/SDKManager.java
index 78f1549..fd148bc 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/common/SDKManager.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/common/SDKManager.java
@@ -10,15 +10,39 @@ import com.dji.sdk.exception.CloudSDKErrorEnum;
 import com.dji.sdk.exception.CloudSDKException;
 
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * @author sean
  * @version 1.7
  * @date 2023/5/19
+ *
+ * fix: 改接口,由客户决定Gateway管理策略 witcom@2023.09.25
  */
-public class SDKManager {
+public interface SDKManager {
 
+    default GatewayManager getDeviceSDK(String gatewaySn){
+        return findDeviceSDK(gatewaySn)
+                .orElseThrow(()-> new CloudSDKException(CloudSDKErrorEnum.NOT_REGISTERED,
+                        "The device has not been registered, please call the 'SDKManager.registerDevice()' method to register the device first."));
+    }
+
+    Optional<GatewayManager> findDeviceSDK(String gatewaySn);
+    default GatewayManager registerDevice(String gatewaySn, String droneSn,
+                                          DeviceDomainEnum domain, DeviceTypeEnum type, DeviceSubTypeEnum subType, String gatewayThingVersion, String droneThingVersion){
+        return registerDevice(gatewaySn, droneSn, GatewayTypeEnum.find(DeviceEnum.find(domain, type, subType)), gatewayThingVersion, droneThingVersion);
+    }
+
+    default GatewayManager registerDevice(String gatewaySn, String droneSn, GatewayTypeEnum type, String gatewayThingVersion, String droneThingVersion){
+        return registerDevice(new GatewayManager(Objects.requireNonNull(gatewaySn), droneSn, type, gatewayThingVersion, droneThingVersion));
+    }
+
+    GatewayManager registerDevice(GatewayManager gateway);
+
+    void logoutDevice(String gatewaySn);
+
+/*
     private SDKManager() {
     }
 
@@ -32,6 +56,14 @@ public class SDKManager {
                 "The device has not been registered, please call the 'SDKManager.registerDevice()' method to register the device first.");
     }
 
+    public static Optional<GatewayManager> findDeviceSDK(String gatewaySn) {
+        if(SDK_MAP.containsKey(gatewaySn)){
+            return Optional.of(SDK_MAP.get(gatewaySn));
+        }else {
+            return Optional.empty();
+        }
+    }
+
     public static GatewayManager registerDevice(String gatewaySn, String droneSn,
             DeviceDomainEnum domain, DeviceTypeEnum type, DeviceSubTypeEnum subType, String gatewayThingVersion, String droneThingVersion) {
         return registerDevice(gatewaySn, droneSn, GatewayTypeEnum.find(DeviceEnum.find(domain, type, subType)), gatewayThingVersion, droneThingVersion);
@@ -49,4 +81,6 @@ public class SDKManager {
     public static void logoutDevice(String gatewaySn) {
         SDK_MAP.remove(gatewaySn);
     }
+
+ */
 }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/config/DefaultBeanConfiguration.java b/cloud-sdk/src/main/java/com/dji/sdk/config/DefaultBeanConfiguration.java
new file mode 100644
index 0000000..9829b4a
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/config/DefaultBeanConfiguration.java
@@ -0,0 +1,80 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月22日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.config;
+
+import com.dji.sdk.common.*;
+import com.dji.sdk.mqtt.ChanBarrierAdapter;
+import com.dji.sdk.mqtt.GlobalPublishOption;
+import com.dji.sdk.common.PublishRequest;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.UUID;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+@Configuration
+public class DefaultBeanConfiguration {
+
+    /**
+     * 全局发送默认设置
+     * @return
+     */
+    @Bean
+    @ConditionalOnMissingBean(GlobalPublishOption.class)
+    public GlobalPublishOption defaultPublishOption(){
+        return new GlobalPublishOption() {
+            @Override
+            public Supplier<String> defaultTransactionId() {
+                return ()-> UUID.randomUUID().toString();
+            }
+
+            @Override
+            public Supplier<String> defaultBizId() {
+                return ()-> UUID.randomUUID().toString();
+            }
+
+            @Override
+            public Consumer<PublishRequest> defaultBeforePublishHook() {
+                return null;
+            }
+
+            @Override
+            public BiConsumer<PublishRequest, PublishBarrierResult> defaultAfterPublishHook() {
+                return null;
+            }
+        };
+    }
+
+    @Bean
+    @ConditionalOnMissingBean(SDKManager.class)
+    public SDKManager localCacheSDKManager(){
+        return new LocalCacheSDKManager();
+    }
+
+    /**
+     * 使用者可以自定义PublishBarrier的实现,默认采用Chan实现
+     */
+    @Bean
+    @ConditionalOnMissingBean(PublishBarrier.class)
+    public PublishBarrier chanBarrier(){
+        /** 原Chan实现 */
+        return new ChanBarrierAdapter();
+    }
+
+    /**
+     * PublishBarrier 另一个实现, 采用同步锁
+     */
+//    @Bean
+//    @ConditionalOnMissingBean(PublishBarrier.class)
+//    public PublishBarrier jdkBarrier(){
+//        return new JDKLockBarrierImpl();
+//    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/config/GetSnakeDataBinder.java b/cloud-sdk/src/main/java/com/dji/sdk/config/GetSnakeDataBinder.java
index 6f08395..663c007 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/config/GetSnakeDataBinder.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/config/GetSnakeDataBinder.java
@@ -8,7 +8,7 @@ import org.springframework.beans.MutablePropertyValues;
 import org.springframework.beans.PropertyValue;
 import org.springframework.web.servlet.mvc.method.annotation.ExtendedServletRequestDataBinder;
 
-import javax.servlet.ServletRequest;
+import jakarta.servlet.ServletRequest;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/ChanBarrierAdapter.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/ChanBarrierAdapter.java
new file mode 100644
index 0000000..368db35
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/ChanBarrierAdapter.java
@@ -0,0 +1,53 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月22日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.mqtt;
+
+import com.dji.sdk.common.PublishBarrier;
+import com.dji.sdk.common.PublishBarrierResult;
+
+import java.util.Objects;
+
+public class ChanBarrierAdapter implements PublishBarrier {
+    @Override
+    public String generateIdentity(CommonTopicRequest requestData) {
+        return requestData.getTid();
+    }
+
+    @Override
+    public String generateIdentity(CommonTopicResponse receiveData) {
+        return receiveData.getTid();
+    }
+
+    @Override
+    public void put(String identity, CommonTopicResponse receiveData) {
+        Chan instance = Chan.getInstance(identity, false);
+        if(Objects.nonNull(instance)){
+            instance.put(receiveData);
+        }
+    }
+
+    @Override
+    public void registerRequest(String identity, CommonTopicRequest requestData) {
+        Chan.getInstance(identity, true);
+    }
+
+    @Override
+    public PublishBarrierResult await(String identity,long timeout) {
+        Chan instance = Chan.getInstance(identity, false);
+
+        CommonTopicResponse response = instance.get(identity, timeout);
+
+        return Objects.nonNull(response) ? PublishBarrierResult.ok(response) : PublishBarrierResult.EMPTY;
+    }
+
+    @Override
+    public boolean hasIdentity(String identity) {
+        Chan instance = Chan.getInstance(identity, false);
+        return Objects.nonNull(instance);
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/ChannelName.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/ChannelName.java
index 876e1e3..e9b3726 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/ChannelName.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/ChannelName.java
@@ -158,6 +158,13 @@ public class ChannelName {
 
     public static final String INBOUND_EVENTS_CAMERA_PHOTO_TAKE_PROGRESS = "inboundEventsCameraPhotoTakeProgress";
 
+    //Add by witcom@2024.06.03
+    public static final String INBOUND_EVENTS_PSDK_UI_RESOURCE_UPLOAD_RESULT = "inboundEventsPsdkUIResourceUploadResult";
+    public static final String INBOUND_EVENTS_PSDK_FLOATING_WINDOW_TEXT = "inboundEventsFloatWindowText";
+
+    public static final String INBOUND_EVENTS_SPEAKER_AUDIO_PLAY_START_PROGRESS = "inboundEventsSpeakerAudioPlayStartProgress";
+    public static final String INBOUND_EVENTS_SPEAKER_TTS_PLAY_START_PROGRESS = "inboundEventsSpeakerTTSPlayStartProgress";
+
 
     // property
     public static final String INBOUND_PROPERTY_SET_REPLY = "inboundPropertySetReply";
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/FlowTransformWrapper.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/FlowTransformWrapper.java
new file mode 100644
index 0000000..b0c87a8
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/FlowTransformWrapper.java
@@ -0,0 +1,51 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年10月09日
+ * @version: 1.0.0
+ * @description:
+ **************************************************/
+package com.dji.sdk.mqtt;
+
+public class FlowTransformWrapper {
+
+    public final static String DEFAULT_ERROR_MSG = "null";
+
+    public static FlowTransformWrapper error(){
+        return new FlowTransformWrapper(DEFAULT_ERROR_MSG);
+    }
+
+    public static FlowTransformWrapper ok(CommonTopicRequest request){
+        return new FlowTransformWrapper(request);
+    }
+
+    CommonTopicRequest request;
+    boolean bError;
+    String errorMessage;
+
+    private FlowTransformWrapper(CommonTopicRequest request){
+        this.request = request;
+        this.bError = false;
+    }
+
+    private FlowTransformWrapper(String errorMessage){
+        this.bError = true;
+        this.errorMessage = errorMessage;
+    }
+
+    public CommonTopicRequest getRequest() {
+        return request;
+    }
+
+    public boolean hasError() {
+        return bError;
+    }
+
+    public boolean continuee(){
+        return !hasError();
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/GlobalPublishOption.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/GlobalPublishOption.java
new file mode 100644
index 0000000..50872ca
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/GlobalPublishOption.java
@@ -0,0 +1,24 @@
+/*************************************************
+ * @copyright 2017 Flision Corporation Inc.
+ * @author: Vincent Chan @ Canton
+ * @date: 2023年09月25日
+ * @version: 1.0.0
+ * @description: 全局发送默认配置
+ **************************************************/
+package com.dji.sdk.mqtt;
+
+import com.dji.sdk.common.PublishBarrierResult;
+import com.dji.sdk.common.PublishRequest;
+
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+public interface GlobalPublishOption {
+    Supplier<String> defaultTransactionId();
+    Supplier<String> defaultBizId();
+
+    Consumer<PublishRequest> defaultBeforePublishHook();
+    BiConsumer<PublishRequest, PublishBarrierResult> defaultAfterPublishHook();
+
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/InboundMessageRouter.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/InboundMessageRouter.java
index 4d2a417..aae6d98 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/InboundMessageRouter.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/InboundMessageRouter.java
@@ -37,7 +37,10 @@ public class InboundMessageRouter extends AbstractMessageRouter {
         String topic = headers.get(MqttHeaders.RECEIVED_TOPIC).toString();
         byte[] payload = (byte[])message.getPayload();
 
-        log.debug("received topic: {} \t payload =>{}", topic, new String(payload));
+        //fix: 修复未启动debug时仍然需要构造debug参数的问题 by witcom@2023.09.22
+        if(log.isDebugEnabled()) {
+            log.debug("received topic: {} \t payload =>{}", topic, new String(payload));
+        }
 
         CloudApiTopicEnum topicEnum = CloudApiTopicEnum.find(topic);
         MessageChannel bean = (MessageChannel) SpringBeanUtils.getBean(topicEnum.getBeanName());
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttConfiguration.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttConfiguration.java
index 5855113..352b1f9 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttConfiguration.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttConfiguration.java
@@ -15,7 +15,7 @@ import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.MessageChannel;
 import org.springframework.messaging.MessageHandler;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.util.UUID;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttGatewayPublish.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttGatewayPublish.java
index 272651c..3c7ffc6 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttGatewayPublish.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttGatewayPublish.java
@@ -1,10 +1,12 @@
 package com.dji.sdk.mqtt;
 
-import com.dji.sdk.common.Common;
+import com.dji.sdk.common.*;
 import com.dji.sdk.exception.CloudSDKErrorEnum;
 import com.dji.sdk.exception.CloudSDKException;
 import com.dji.sdk.websocket.api.WebSocketMessageSend;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.TypeMismatchException;
@@ -13,10 +15,12 @@ import org.springframework.messaging.MessageHeaders;
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.util.Objects;
 import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
 
 /**
  * @author sean.zhou
@@ -35,9 +39,17 @@ public class MqttGatewayPublish {
     @Resource
     private IMqttMessageGateway messageGateway;
 
+    @Resource
+    private PublishBarrier publishBarrier;
+
+    @Resource
+    private GlobalPublishOption globalOptions;
+
     public void publish(String topic, int qos, CommonTopicRequest request) {
         try {
-            log.debug("send topic: {}, payload: {}", topic, request.toString());
+            if(log.isDebugEnabled()) {
+                log.debug("send topic: {}, payload: {}", topic, request.toString());
+            }
             byte[] payload = Common.getObjectMapper().writeValueAsBytes(request);
             messageGateway.publish(topic, payload, qos);
         } catch (JsonProcessingException e) {
@@ -48,7 +60,9 @@ public class MqttGatewayPublish {
 
     public void publish(String topic, int qos, CommonTopicResponse response) {
         try {
-            log.debug("send topic: {}, payload: {}", topic, response.toString());
+            if(log.isDebugEnabled()) {
+                log.debug("send topic: {}, payload: {}", topic, response.toString());
+            }
             byte[] payload = Common.getObjectMapper().writeValueAsBytes(response);
             messageGateway.publish(topic, payload, qos);
         } catch (JsonProcessingException e) {
@@ -76,7 +90,9 @@ public class MqttGatewayPublish {
         AtomicInteger time = new AtomicInteger(0);
         boolean hasBid = StringUtils.hasText(request.getBid());
         request.setBid(hasBid ? request.getBid() : UUID.randomUUID().toString());
+
         // Retry
+        // Is Retry necessary? why not use Spring @Retryable instead?
         while (time.getAndIncrement() <= retryCount) {
             this.publish(topic, request);
 
@@ -100,5 +116,88 @@ public class MqttGatewayPublish {
         throw new CloudSDKException(CloudSDKErrorEnum.MQTT_PUBLISH_ABNORMAL, "No message reply received.");
     }
 
+    public <T> CompletableFuture<CommonTopicResponse<T>> publishWithReply(Class<T> clazz, String topic, CommonTopicRequest request, Consumer<PublishOption> options){
+        PublishConfiguration config = prepareConfiguration(options);
+        request.setBid(config.getBid());
+        request.setTid(config.getTid());
+
+        //use to log request data or the last chance to change some data
+        //CommonTopicRequest丢失了一些需要记录的内容,把这些内容封到PublishRequest交出去
+        PublishRequest wrapRequest = new CommonTopicRequestWrapper<T>(clazz,topic, request, config);
+        config.invokeBeforePublishHook(wrapRequest);
+
+        //注册barrier
+        String identity = publishBarrier.generateIdentity(request); //提供栅栏标识
+        publishBarrier.registerRequest(identity, request);
+
+        return CompletableFuture.supplyAsync(()->{
+           this.publish(topic, request);
+
+           if(log.isDebugEnabled()){ log.debug("等待{}指令返回",identity); };
+           PublishBarrierResult result = publishBarrier.await(identity,config.getTimeout());
+           config.invokeAfterPublishReplyHook(wrapRequest, result);
+
+           if(result.isTimeout()){
+               throw new CloudSDKException("Timeout"); //TODO: 换个更明确的异常更好
+           }
+
+           if(log.isDebugEnabled()){ log.debug("{}指令已返回",identity); }
+           return result.getData();
+        });
+    }
+
+    private PublishConfiguration prepareConfiguration(Consumer<PublishOption> options){
+        PublishConfiguration config = new PublishConfiguration();
+        PublishOption option = new PublishOption(config);
+        options.accept(option);
+
+        if(Strings.isNullOrEmpty(config.getBid())){
+            config.setBizId(globalOptions.defaultBizId().get());
+        }
+
+        if(Strings.isNullOrEmpty(config.getTid())){
+            config.setTransactionId(globalOptions.defaultTransactionId().get());
+        }
+
+        if(config.noneBeforePublishHook()){
+            config.setBeforePublishHook(globalOptions.defaultBeforePublishHook());
+        }
+
+        if(config.noneAfterPublishHook()){
+            config.setAfterPublishReplyHook(globalOptions.defaultAfterPublishHook());
+        }
+        return config;
+    }
+
+    static class CommonTopicRequestWrapper<T> implements PublishRequest{
+        final CommonTopicRequest request;
+        final String topic;
+        final Class<T> clazz;
+
+        final ReadonlyPublishConfiguration config;
+
+        public  CommonTopicRequestWrapper(Class<T> clazz, String topic,CommonTopicRequest request, PublishConfiguration config) {
+            this.clazz = clazz;
+            this.request = request;
+            this.topic = topic;
+            this.config = config;
+        }
+
+        @Override
+        public String getTopic() {
+            return topic;
+        }
+
+        @Override
+        public CommonTopicRequest getOriginRequest() {
+            return request;
+        }
 
+        @Override
+        public ReadonlyPublishConfiguration getConfiguration() {
+            return config;
+        }
+
+
+    }
 }
\ No newline at end of file
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttTopicServiceImpl.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttTopicServiceImpl.java
index 158fa60..4e02f8a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttTopicServiceImpl.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/MqttTopicServiceImpl.java
@@ -5,7 +5,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcDownPublish.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcDownPublish.java
index 25d643b..10e99de 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcDownPublish.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcDownPublish.java
@@ -4,7 +4,7 @@ import com.dji.sdk.mqtt.MqttGatewayPublish;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.util.Objects;
 
 /**
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcUpRouter.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcUpRouter.java
index 8648bf8..4987e1d 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcUpRouter.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcUpRouter.java
@@ -6,7 +6,6 @@ import com.dji.sdk.mqtt.ChannelName;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.integration.dsl.IntegrationFlow;
-import org.springframework.integration.dsl.IntegrationFlows;
 import org.springframework.messaging.Message;
 
 import java.io.IOException;
@@ -22,7 +21,7 @@ public class DrcUpRouter {
 
     @Bean
     public IntegrationFlow drcUpRouterFlow() {
-        return IntegrationFlows
+        return IntegrationFlow
                 .from(ChannelName.INBOUND_DRC_UP)
                 .transform(Message.class, source -> {
                     try {
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcUpSubscribe.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcUpSubscribe.java
index ef922f0..6dd16e1 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcUpSubscribe.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/drc/DrcUpSubscribe.java
@@ -5,7 +5,7 @@ import com.dji.sdk.mqtt.IMqttTopicService;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  *
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsMethodEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsMethodEnum.java
index 4ab564b..27d4910 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsMethodEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsMethodEnum.java
@@ -98,6 +98,13 @@ public enum EventsMethodEnum {
 
     CAMERA_PHOTO_TAKE_PROGRESS("camera_photo_take_progress", ChannelName.INBOUND_EVENTS_CAMERA_PHOTO_TAKE_PROGRESS, new TypeReference<EventsDataRequest<CameraPhotoTakeProgress>>() {}),
 
+    //Add by witcom@2024.06.03
+    PSDK_UI_RESOURCE_UPLOAD_RESULT("psdk_ui_resource_upload_result", ChannelName.INBOUND_EVENTS_PSDK_UI_RESOURCE_UPLOAD_RESULT, new TypeReference<PSDKUiResourceUploadResult>(){}),
+    PSDK_FLOAT_WINDOW_TEXT("psdk_floating_window_text",ChannelName.INBOUND_EVENTS_PSDK_FLOATING_WINDOW_TEXT,new TypeReference<PsdkFloatingWindowText>(){}),
+    SPEAKER_AUDIO_PLAY_START_PROGRESS("speaker_audio_play_start_progress",ChannelName.INBOUND_EVENTS_SPEAKER_AUDIO_PLAY_START_PROGRESS,new TypeReference<EventsDataRequest<SpeakerPlayStartProgress>>() {}),
+    SPEAKER_TTS_PLAY_START_PROGRESS("speaker_tts_play_start_progress",ChannelName.INBOUND_EVENTS_SPEAKER_TTS_PLAY_START_PROGRESS,new TypeReference<EventsDataRequest<SpeakerPlayStartProgress>>() {}),
+
+
     UNKNOWN("", ChannelName.DEFAULT, new TypeReference<>() {});
 
     private final String method;
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsRouter.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsRouter.java
index 0a6d50d..ee3db5e 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsRouter.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsRouter.java
@@ -12,7 +12,7 @@ import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Objects;
@@ -32,7 +32,7 @@ public class EventsRouter {
 
     @Bean
     public IntegrationFlow eventsMethodRouterFlow() {
-        return IntegrationFlows
+        return IntegrationFlow
                 .from(ChannelName.INBOUND_EVENTS)
                 .transform(Message.class, source -> {
                     try {
@@ -53,7 +53,7 @@ public class EventsRouter {
 
     @Bean
     public IntegrationFlow replySuccessEvents() {
-        return IntegrationFlows
+        return IntegrationFlow
                 .from(ChannelName.OUTBOUND_EVENTS)
                 .handle(this::publish)
                 .nullChannel();
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsSubscribe.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsSubscribe.java
index 464727e..f7ef16f 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsSubscribe.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/events/EventsSubscribe.java
@@ -5,7 +5,7 @@ import com.dji.sdk.mqtt.IMqttTopicService;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  *
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java
index f85c50c..3958bd6 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java
@@ -2,7 +2,6 @@ package com.dji.sdk.mqtt.osd;
 
 import com.dji.sdk.cloudapi.device.PayloadModelConst;
 import com.dji.sdk.common.Common;
-import com.dji.sdk.config.version.GatewayManager;
 import com.dji.sdk.common.SDKManager;
 import com.dji.sdk.exception.CloudSDKException;
 import com.dji.sdk.mqtt.ChannelName;
@@ -10,15 +9,11 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.integration.dsl.IntegrationFlow;
-import org.springframework.integration.dsl.IntegrationFlows;
 import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.Message;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import static com.dji.sdk.mqtt.TopicConst.*;
 
@@ -32,8 +27,8 @@ import static com.dji.sdk.mqtt.TopicConst.*;
 public class OsdRouter {
 
     @Bean
-    public IntegrationFlow osdRouterFlow() {
-        return IntegrationFlows
+    public IntegrationFlow osdRouterFlow(SDKManager sdkManager) {
+        return IntegrationFlow
                 .from(ChannelName.INBOUND_OSD)
                 .transform(Message.class, source -> {
                     try {
@@ -45,19 +40,28 @@ public class OsdRouter {
                     }
                 }, null)
                 .<TopicOsdRequest>handle((response, headers) -> {
-                    GatewayManager gateway = SDKManager.getDeviceSDK(response.getGateway());
-                    OsdDeviceTypeEnum typeEnum = OsdDeviceTypeEnum.find(gateway.getType(), response.getFrom().equals(response.getGateway()));
-                    Map<String, Object> data = (Map<String, Object>) response.getData();
-                    if (!typeEnum.isGateway()) {
-                        List payloadData = (List) data.getOrDefault(PayloadModelConst.PAYLOAD_KEY, new ArrayList<>());
-                        PayloadModelConst.getAllIndexWithPosition().stream().filter(data::containsKey)
-                                .map(data::get).forEach(payloadData::add);
-                        data.put(PayloadModelConst.PAYLOAD_KEY, payloadData);
-                    }
-                    return response.setData(Common.getObjectMapper().convertValue(data, typeEnum.getClassType()));
+
+                    // fix: getDeviceSDK抛出异常导致在设备未注册的情况下报osd时产生大量日志 witcom@2023.09.22
+                    //GatewayManager gateway = SDKManager.getDeviceSDK(response.getGateway());
+                    return sdkManager.findDeviceSDK(response.getGateway())
+                            .map(gateway-> {
+
+                                OsdDeviceTypeEnum typeEnum = OsdDeviceTypeEnum.find(gateway.getType(), response.getFrom().equals(response.getGateway()));
+                                Map<String, Object> data = (Map<String, Object>) response.getData();
+                                if (!typeEnum.isGateway()) {
+                                    List payloadData = (List) data.getOrDefault(PayloadModelConst.PAYLOAD_KEY, new ArrayList<>());
+                                    PayloadModelConst.getAllIndexWithPosition().stream().filter(data::containsKey)
+                                            .map(data::get).forEach(payloadData::add);
+                                    data.put(PayloadModelConst.PAYLOAD_KEY, payloadData);
+                                }
+                                return response.setData(Common.getObjectMapper().convertValue(data, typeEnum.getClassType()));
+                            })
+                            .orElse(null);
                 })
+                .<TopicOsdRequest>filter(Objects::nonNull)
                 .<TopicOsdRequest, OsdDeviceTypeEnum>route(response -> OsdDeviceTypeEnum.find(response.getData().getClass()),
-                        mapping -> Arrays.stream(OsdDeviceTypeEnum.values()).forEach(key -> mapping.channelMapping(key, key.getChannelName())))
+                        mapping -> Arrays.stream(OsdDeviceTypeEnum.values())
+                                .forEach(key -> mapping.channelMapping(key, key.getChannelName())))
                 .get();
     }
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java
index 2bb72a7..bc8fe51 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java
@@ -6,7 +6,7 @@ import com.dji.sdk.mqtt.IMqttTopicService;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  *
@@ -22,8 +22,11 @@ public class OsdSubscribe {
     @Resource
     private IMqttTopicService topicService;
 
+    @Resource
+    SDKManager sdkManager;
+
     public void subscribe(GatewayManager gateway, boolean unsubscribeSubDevice) {
-        SDKManager.registerDevice(gateway);
+        sdkManager.registerDevice(gateway);
         topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn()));
         if (unsubscribeSubDevice) {
             topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn()));
@@ -35,7 +38,7 @@ public class OsdSubscribe {
     }
 
     public void unsubscribe(GatewayManager gateway) {
-        SDKManager.logoutDevice(gateway.getGatewaySn());
+        sdkManager.logoutDevice(gateway.getGatewaySn());
         topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn()));
         if (null != gateway.getDroneSn()) {
             topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn()));
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetPublish.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetPublish.java
index 3426a85..cb926db 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetPublish.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetPublish.java
@@ -1,12 +1,17 @@
 package com.dji.sdk.mqtt.property;
 
+import com.dji.sdk.common.PublishOption;
+import com.dji.sdk.mqtt.CommonTopicRequest;
+import com.dji.sdk.mqtt.CommonTopicResponse;
 import com.dji.sdk.mqtt.MqttGatewayPublish;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.util.Objects;
 import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Consumer;
 
 /**
  * @author sean
@@ -29,12 +34,33 @@ public class PropertySetPublish {
 
     public PropertySetReplyResultEnum publish(String sn, Object data, int retryCount, long timeout) {
         String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + Objects.requireNonNull(sn) + TopicConst.PROPERTY_SUF + TopicConst.SET_SUF;
+
+        return gatewayPublish.publishWithReply(PropertySetReplyResultEnum.class,topic,
+                new CommonTopicRequest<>()
+                        .setTimestamp(System.currentTimeMillis())
+                        .setData(Objects.requireNonNull(data)),
+                ops->ops.timeout((int)(timeout/1000)))
+                .join()
+                .getData();
+
+//        return gatewayPublish.publishWithReply(
+//                PropertySetReplyResultEnum.class, topic, new TopicPropertySetRequest<>()
+//                        .setTid(UUID.randomUUID().toString())
+//                        .setBid(null)
+//                        .setTimestamp(System.currentTimeMillis())
+//                        .setData(Objects.requireNonNull(data)), retryCount, timeout).getData();
+    }
+
+    public CompletableFuture<CommonTopicResponse<PropertySetReplyResultEnum>>
+    publish(String sn, Object data, Consumer<PublishOption> options){
+        String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + Objects.requireNonNull(sn) + TopicConst.PROPERTY_SUF + TopicConst.SET_SUF;
         return gatewayPublish.publishWithReply(
-                PropertySetReplyResultEnum.class, topic, new TopicPropertySetRequest<>()
-                        .setTid(UUID.randomUUID().toString())
-                        .setBid(null)
+                PropertySetReplyResultEnum.class,
+                topic,
+                new CommonTopicRequest<>()
                         .setTimestamp(System.currentTimeMillis())
-                        .setData(Objects.requireNonNull(data)), retryCount, timeout).getData();
+                        .setData(Objects.requireNonNull(data)),
+                options);
     }
 
 }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetReplyHandler.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetReplyHandler.java
index 1723e22..da2b8f6 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetReplyHandler.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetReplyHandler.java
@@ -1,6 +1,7 @@
 package com.dji.sdk.mqtt.property;
 
 import com.dji.sdk.common.Common;
+import com.dji.sdk.common.PublishBarrier;
 import com.dji.sdk.mqtt.Chan;
 import com.dji.sdk.mqtt.ChannelName;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -9,6 +10,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.stereotype.Component;
 
+import jakarta.annotation.Resource;
 import java.io.IOException;
 import java.util.Objects;
 
@@ -20,6 +22,9 @@ import java.util.Objects;
 @Component
 public class PropertySetReplyHandler {
 
+    @Resource
+    PublishBarrier barrier;
+
     private static final String RESULT_KEY = "result";
 
     /**
@@ -32,13 +37,19 @@ public class PropertySetReplyHandler {
         byte[] payload = (byte[])message.getPayload();
 
         TopicPropertySetResponse receiver = Common.getObjectMapper().readValue(payload, new TypeReference<TopicPropertySetResponse>() {});
-        Chan chan = Chan.getInstance(receiver.getTid(), false);
-        if (Objects.isNull(chan)) {
+        //fix: use Barrier instead witcom@2023.09.22
+        //Chan chan = Chan.getInstance(receiver.getTid(), false);
+//        if (Objects.isNull(chan)) {
+//            return;
+//        }
+        String identity = barrier.generateIdentity(receiver);
+        if(!barrier.hasIdentity(identity)) {
             return;
         }
         receiver.setData(PropertySetReplyResultEnum.find(
                 Common.getObjectMapper().convertValue(receiver.getData(), JsonNode.class).findValue(RESULT_KEY).intValue()));
         // Put the message to the chan object.
-        chan.put(receiver);
+        //chan.put(receiver);
+        barrier.put(identity, receiver);
     }
 }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetSubscribe.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetSubscribe.java
index b17af53..88815d9 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetSubscribe.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/property/PropertySetSubscribe.java
@@ -5,7 +5,7 @@ import com.dji.sdk.mqtt.IMqttTopicService;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/requests/RequestsRouter.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/requests/RequestsRouter.java
index 045afcd..2232f1a 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/requests/RequestsRouter.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/requests/RequestsRouter.java
@@ -11,7 +11,7 @@ import org.springframework.integration.dsl.IntegrationFlow;
 import org.springframework.integration.dsl.IntegrationFlows;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Objects;
@@ -29,7 +29,7 @@ public class RequestsRouter {
 
     @Bean
     public IntegrationFlow requestsMethodRouterFlow() {
-        return IntegrationFlows
+        return IntegrationFlow
                 .from(ChannelName.INBOUND_REQUESTS)
                 .<byte[], TopicRequestsRequest>transform(payload -> {
                     try {
@@ -48,7 +48,7 @@ public class RequestsRouter {
 
     @Bean
     public IntegrationFlow replyRequestsMethod() {
-        return IntegrationFlows
+        return IntegrationFlow
                 .from(ChannelName.OUTBOUND_REQUESTS)
                 .handle(this::publish)
                 .nullChannel();
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/requests/RequestsSubscribe.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/requests/RequestsSubscribe.java
index b207c53..bf9a8a9 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/requests/RequestsSubscribe.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/requests/RequestsSubscribe.java
@@ -5,7 +5,7 @@ import com.dji.sdk.mqtt.IMqttTopicService;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesPublish.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesPublish.java
index a07ec02..f7da5b8 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesPublish.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesPublish.java
@@ -1,15 +1,19 @@
 package com.dji.sdk.mqtt.services;
 
 import com.dji.sdk.common.Common;
+import com.dji.sdk.common.PublishOption;
+import com.dji.sdk.mqtt.CommonTopicResponse;
 import com.dji.sdk.mqtt.MqttGatewayPublish;
 import com.dji.sdk.mqtt.TopicConst;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import java.util.Objects;
 import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Consumer;
 
 /**
  * @author sean
@@ -80,6 +84,8 @@ public class ServicesPublish {
 
     public <T> TopicServicesResponse<ServicesReplyData<T>> publish(
             TypeReference<T> clazz, String sn, String method, Object data, String bid, int retryCount, long timeout) {
+        return this.publish(clazz, sn, method,data,ops-> ops.withBizId(bid).timeout((int)(timeout / 1000))).join();
+        /*
         String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + Objects.requireNonNull(sn) + TopicConst.SERVICES_SUF;
         TopicServicesResponse response = (TopicServicesResponse) gatewayPublish.publishWithReply(
                 ServicesReplyReceiver.class, topic, new TopicServicesRequest<>()
@@ -104,6 +110,44 @@ public class ServicesPublish {
             reply.setOutput(mapper.convertValue(replyReceiver.getOutput(), clazz));
         }
         return response.setData(reply);
+
+         */
     }
 
+    /**
+     * Remark by witcom@2023.09.22
+     * TODO: 在贡献的版本到这里就不再往下修改了,需要修改所有AbstractXXXService和AOP,改动量很大
+     * 主要思想是
+     * 1.提供异步支持
+     * 2.Chan的实现可由用户自定义
+     * 3.提供发送选项参数
+     * 4.提供发送前,接收后钩子用于记录请求和返回接近最原始的记录
+     */
+
+    public <T> CompletableFuture<TopicServicesResponse<ServicesReplyData<T>>> publish(TypeReference<T> clazz, String sn, String method, Object data, Consumer<PublishOption> options){
+        String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + Objects.requireNonNull(sn) + TopicConst.SERVICES_SUF;
+        return gatewayPublish.publishWithReply(ServicesReplyReceiver.class, topic, new TopicServicesRequest<>()
+                .setTimestamp(System.currentTimeMillis())
+                .setMethod(method)
+                .setData(Objects.requireNonNullElse(data, "")), options)
+                .thenApply(response->(TopicServicesResponse)response)
+                .thenApply(response->{
+                    ServicesReplyReceiver replyReceiver = (ServicesReplyReceiver) response.getData();
+                    ServicesReplyData<T> reply = new ServicesReplyData<T>().setResult(replyReceiver.getResult());
+                    if (Objects.isNull(clazz)) {
+                        reply.setOutput((T) Objects.requireNonNullElse(
+                                replyReceiver.getOutput(), Objects.requireNonNullElse(replyReceiver.getInfo(), "")));
+                        return response.setData(reply);
+                    }
+                    // put together in "output"
+                    ObjectMapper mapper = Common.getObjectMapper();
+                    if (Objects.nonNull(replyReceiver.getInfo())) {
+                        reply.setOutput(mapper.convertValue(replyReceiver.getInfo(), clazz));
+                    }
+                    if (Objects.nonNull(replyReceiver.getOutput())) {
+                        reply.setOutput(mapper.convertValue(replyReceiver.getOutput(), clazz));
+                    }
+                    return response.setData(reply);
+                });
+    }
 }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesReplyHandler.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesReplyHandler.java
index 01ee174..9df904b 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesReplyHandler.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesReplyHandler.java
@@ -3,6 +3,7 @@ package com.dji.sdk.mqtt.services;
 import com.dji.sdk.cloudapi.log.FileUploadListResponse;
 import com.dji.sdk.cloudapi.log.LogMethodEnum;
 import com.dji.sdk.common.Common;
+import com.dji.sdk.common.PublishBarrier;
 import com.dji.sdk.mqtt.Chan;
 import com.dji.sdk.mqtt.ChannelName;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -10,6 +11,7 @@ import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.Message;
 import org.springframework.stereotype.Component;
 
+import jakarta.annotation.Resource;
 import java.io.IOException;
 import java.util.Objects;
 
@@ -21,6 +23,9 @@ import java.util.Objects;
 @Component
 public class ServicesReplyHandler {
 
+    @Resource
+    PublishBarrier barrier;
+
     /**
      * Handle the reply message from topic "/services_reply".
      * @param message   reply message
@@ -32,14 +37,20 @@ public class ServicesReplyHandler {
 
         TopicServicesResponse<ServicesReplyReceiver> receiver = Common.getObjectMapper()
                 .readValue(payload, new TypeReference<TopicServicesResponse<ServicesReplyReceiver>>() {});
-        Chan chan = Chan.getInstance(receiver.getTid(), false);
-        if (Objects.isNull(chan)) {
+        //fix: use Barrier instead witcom@2023.09.22
+//        Chan chan = Chan.getInstance(receiver.getTid(), false);
+//        if (Objects.isNull(chan)) {
+//            return;
+//        }
+        String identity = barrier.generateIdentity(receiver);
+        if(!barrier.hasIdentity(identity)){
             return;
         }
         if (LogMethodEnum.FILE_UPLOAD_LIST.getMethod().equals(receiver.getMethod())) {
             receiver.getData().setOutput(Common.getObjectMapper().convertValue(receiver.getData(),
                     new TypeReference<FileUploadListResponse>() {}));
         }
-        chan.put(receiver);
+        barrier.put(identity, receiver);
+        //chan.put(receiver);
     }
 }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesSubscribe.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesSubscribe.java
index 654ed4c..38a5717 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesSubscribe.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/services/ServicesSubscribe.java
@@ -5,7 +5,7 @@ import com.dji.sdk.mqtt.IMqttTopicService;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  * @author sean
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/DockStateDataKeyEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/DockStateDataKeyEnum.java
index 9a00e0b..6557584 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/DockStateDataKeyEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/DockStateDataKeyEnum.java
@@ -10,6 +10,7 @@ import com.dji.sdk.exception.CloudSDKException;
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -70,9 +71,10 @@ public enum DockStateDataKeyEnum {
         return keys;
     }
 
-    public static DockStateDataKeyEnum find(Set<String> keys) {
-        return Arrays.stream(values()).filter(keyEnum -> !Collections.disjoint(keys, keyEnum.keys)).findAny()
-                .orElseThrow(() -> new CloudSDKException(DockStateDataKeyEnum.class, keys));
+    public static Optional<DockStateDataKeyEnum> find(Set<String> keys) {
+        // com.dji.sdk.mqtt.state.DockStateDataKeyEnum has unknown data: [[mode_code_reason]]
+        return Arrays.stream(values()).filter(keyEnum -> !Collections.disjoint(keys, keyEnum.keys)).findAny();
+               // .orElseThrow(() -> new CloudSDKException(DockStateDataKeyEnum.class, keys));
     }
 
 }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/RcStateDataKeyEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/RcStateDataKeyEnum.java
index bd80c68..79ba830 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/RcStateDataKeyEnum.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/RcStateDataKeyEnum.java
@@ -6,6 +6,7 @@ import com.dji.sdk.exception.CloudSDKException;
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -45,9 +46,9 @@ public enum RcStateDataKeyEnum {
         return keys;
     }
 
-    public static RcStateDataKeyEnum find(Set<String> keys) {
-        return Arrays.stream(values()).filter(keyEnum -> !Collections.disjoint(keys, keyEnum.keys)).findAny()
-                .orElseThrow(() -> new CloudSDKException(RcStateDataKeyEnum.class, keys));
+    public static Optional<RcStateDataKeyEnum> find(Set<String> keys) {
+        return Arrays.stream(values()).filter(keyEnum -> !Collections.disjoint(keys, keyEnum.keys)).findAny();
+                //.orElseThrow(() -> new CloudSDKException(RcStateDataKeyEnum.class, keys));
     }
 
 }
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/StateRouter.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/StateRouter.java
index f431fe7..e8ec060 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/StateRouter.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/StateRouter.java
@@ -2,55 +2,75 @@ package com.dji.sdk.mqtt.state;
 
 import com.dji.sdk.common.Common;
 import com.dji.sdk.common.SDKManager;
+import com.dji.sdk.config.version.GatewayTypeEnum;
 import com.dji.sdk.exception.CloudSDKErrorEnum;
 import com.dji.sdk.exception.CloudSDKException;
 import com.dji.sdk.mqtt.ChannelName;
+import com.dji.sdk.mqtt.FlowTransformWrapper;
 import com.dji.sdk.mqtt.MqttGatewayPublish;
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.integration.dsl.IntegrationFlow;
-import org.springframework.integration.dsl.IntegrationFlows;
 import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 
-import javax.annotation.Resource;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 
 import static com.dji.sdk.mqtt.TopicConst.*;
 
 /**
- *
  * @author sean.zhou
- * @date 2021/11/17
  * @version 0.1
+ * @date 2021/11/17
  */
+@Slf4j
 @Configuration
 public class StateRouter {
 
     @Resource
+    SDKManager sdkManager;
     private MqttGatewayPublish gatewayPublish;
 
     @Bean
     public IntegrationFlow stateDataRouterFlow() {
-        return IntegrationFlows
+        ObjectMapper objectMapper = Common.getObjectMapper();
+        return IntegrationFlow
                 .from(ChannelName.INBOUND_STATE)
                 .transform(Message.class, source -> {
                     try {
-                        TopicStateRequest response = Common.getObjectMapper().readValue((byte[]) source.getPayload(), new TypeReference<TopicStateRequest>() {});
+                        TopicStateRequest response = objectMapper.readValue(
+                                (byte[]) source.getPayload(),
+                                new TypeReference<TopicStateRequest>() {});
                         String topic = String.valueOf(source.getHeaders().get(MqttHeaders.RECEIVED_TOPIC));
                         String from = topic.substring((THING_MODEL_PRE + PRODUCT).length(), topic.indexOf(STATE_SUF));
-                        return response.setFrom(from)
-                                .setData(Common.getObjectMapper().convertValue(response.getData(), getTypeReference(response.getGateway(), response.getData())));
-                    } catch (IOException e) {
-                        throw new CloudSDKException(e);
+
+                        return FlowTransformWrapper.ok(response.setFrom(from));
+                    } catch (Exception ex) {
+                        log.warn("[StateRouter]"+ex.getMessage());
+                        return FlowTransformWrapper.error();
                     }
                 }, null)
+                .filter(FlowTransformWrapper::continuee)
+                .<FlowTransformWrapper>handle((wrapper, headers) -> {
+
+                    TopicStateRequest response = (TopicStateRequest)wrapper.getRequest();
+
+                    //fix: 修复设备未注册前设备推送state导致产生大量日志的问题 witcom@2023.10.08
+                    try {
+                        return getTypeReference(response.getGateway(), response.getData())
+                                .map(clazz -> response.setData(objectMapper.convertValue(response.getData(), clazz)))
+                                .orElse(null);
+                    }catch (CloudSDKException ex){
+                        log.warn("[StateRouter]"+ex.getMessage());
+                        return null;
+                    }
+                })
+                .filter(Objects::nonNull)
                 .<TopicStateRequest, StateDataKeyEnum>route(response -> StateDataKeyEnum.find(response.getData().getClass()),
                         mapping -> Arrays.stream(StateDataKeyEnum.values()).forEach(key -> mapping.channelMapping(key, key.getChannelName())))
                 .get();
@@ -59,7 +79,7 @@ public class StateRouter {
 
     @Bean
     public IntegrationFlow replySuccessState() {
-        return IntegrationFlows
+        return IntegrationFlow
                 .from(ChannelName.OUTBOUND_STATE)
                 .handle(this::publish)
                 .nullChannel();
@@ -75,16 +95,22 @@ public class StateRouter {
     }
 
 
-    private Class getTypeReference(String gatewaySn, Object data) {
+    private Optional<Class> getTypeReference(String gatewaySn, Object data) {
         Set<String> keys = ((Map<String, Object>) data).keySet();
-        switch (SDKManager.getDeviceSDK(gatewaySn).getType()) {
-            case RC:
-                return RcStateDataKeyEnum.find(keys).getClassType();
-            case DOCK:
-            case DOCK2:
-                return DockStateDataKeyEnum.find(keys).getClassType();
-            default:
-                throw new CloudSDKException(CloudSDKErrorEnum.WRONG_DATA, "Unexpected value: " + SDKManager.getDeviceSDK(gatewaySn).getType());
-        }
+        //fix: 捕捉数据流发现在注册前设备可能会推送state主题导致产生大量日志 witcom@2023.10.08
+        //GatewayTypeEnum type = sdkManager.getDeviceSDK(gatewaySn).getType();
+        return sdkManager.findDeviceSDK(gatewaySn)
+                .flatMap(gw -> {
+                    GatewayTypeEnum type = gw.getType();
+                    switch (type) {
+                        case RC:
+                            return RcStateDataKeyEnum.find(keys).map(v->v.getClassType());
+                        case DOCK:
+                        case DOCK2:
+                            return DockStateDataKeyEnum.find(keys).map(v->v.getClassType()); 
+                        default:
+                            throw new CloudSDKException(CloudSDKErrorEnum.WRONG_DATA, "Unexpected value: " + type);
+                    }
+                });
     }
 }
\ No newline at end of file
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java
index cd71824..aa0d683 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java
@@ -6,7 +6,7 @@ import com.dji.sdk.mqtt.IMqttTopicService;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  *
@@ -20,10 +20,13 @@ public class StateSubscribe {
     @Resource
     private IMqttTopicService topicService;
 
+    @Resource
+    SDKManager sdkManager;
+
     public static final String TOPIC = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + "%s" + TopicConst.STATE_SUF;
 
     public void subscribe(GatewayManager gateway, boolean unsubscribeSubDevice) {
-        SDKManager.registerDevice(gateway);
+        sdkManager.registerDevice(gateway);
         topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn()));
         if (unsubscribeSubDevice) {
             topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn()));
@@ -35,7 +38,7 @@ public class StateSubscribe {
     }
 
     public void unsubscribe(GatewayManager gateway) {
-        SDKManager.logoutDevice(gateway.getGatewaySn());
+        sdkManager.logoutDevice(gateway.getGatewaySn());
         topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn()));
         if (null != gateway.getDroneSn()) {
             topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn()));
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/status/StatusRouter.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/status/StatusRouter.java
index 396bd2e..3750c2e 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/status/StatusRouter.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/status/StatusRouter.java
@@ -6,16 +6,15 @@ import com.dji.sdk.exception.CloudSDKException;
 import com.dji.sdk.mqtt.ChannelName;
 import com.dji.sdk.mqtt.MqttGatewayPublish;
 import com.fasterxml.jackson.core.type.TypeReference;
+import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.integration.dsl.IntegrationFlow;
-import org.springframework.integration.dsl.IntegrationFlows;
 import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHeaders;
 import org.springframework.util.CollectionUtils;
 
-import javax.annotation.Resource;
 import java.io.IOException;
 import java.util.Objects;
 import java.util.Optional;
@@ -36,7 +35,7 @@ public class StatusRouter {
 
     @Bean
     public IntegrationFlow statusRouterFlow() {
-        return IntegrationFlows
+        return IntegrationFlow
                 .from(ChannelName.INBOUND_STATUS)
                 .transform(Message.class, source -> {
                     try {
@@ -56,7 +55,7 @@ public class StatusRouter {
 
     @Bean
     public IntegrationFlow replySuccessStatus() {
-        return IntegrationFlows
+        return IntegrationFlow
                 .from(ChannelName.OUTBOUND_STATUS)
                 .handle(this::publish)
                 .nullChannel();
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java
index e48029e..3fdae6d 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java
@@ -6,7 +6,7 @@ import com.dji.sdk.mqtt.IMqttTopicService;
 import com.dji.sdk.mqtt.TopicConst;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 /**
  *
@@ -22,8 +22,11 @@ public class StatusSubscribe {
     @Resource
     private IMqttTopicService topicService;
 
+    @Resource
+    SDKManager sdkManager;
+
     public void subscribe(GatewayManager gateway) {
-        SDKManager.registerDevice(gateway);
+        sdkManager.registerDevice(gateway);
         topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn()));
     }
 
@@ -32,7 +35,7 @@ public class StatusSubscribe {
     }
 
     public void unsubscribe(GatewayManager gateway) {
-        SDKManager.logoutDevice(gateway.getGatewaySn());
+        sdkManager.logoutDevice(gateway.getGatewaySn());
         topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn()));
     }
 
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/websocket/WebSocketMessageResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/websocket/WebSocketMessageResponse.java
index 816d555..3521ff4 100644
--- a/cloud-sdk/src/main/java/com/dji/sdk/websocket/WebSocketMessageResponse.java
+++ b/cloud-sdk/src/main/java/com/dji/sdk/websocket/WebSocketMessageResponse.java
@@ -3,8 +3,8 @@ package com.dji.sdk.websocket;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.*;
+
 
 /**
  * The format of WebSocket messages that the pilot can receive.
diff --git a/pom.xml b/pom.xml
index 363dc0c..58425b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-starter-parent</artifactId>
-                <version>2.7.12</version>
+                <version>3.1.8</version>
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
@@ -37,6 +37,11 @@
     </dependencyManagement>
 
     <dependencies>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>31.1-jre</version>
+        </dependency>
         <dependency>
             <groupId>org.jetbrains</groupId>
             <artifactId>annotations</artifactId>
@@ -66,6 +71,12 @@
             <artifactId>jackson-datatype-jsr310</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/sample/pom.xml b/sample/pom.xml
index 575608d..bfa7381 100644
--- a/sample/pom.xml
+++ b/sample/pom.xml
@@ -38,9 +38,8 @@
         </dependency>
 
         <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-            <version>${mysql.version}</version>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
@@ -95,10 +94,10 @@
             <version>${aliyun-oss.version}</version>
         </dependency>
 
-        <dependency>
-            <groupId>javax.xml.bind</groupId>
-            <artifactId>jaxb-api</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>javax.xml.bind</groupId>-->
+<!--            <artifactId>jaxb-api</artifactId>-->
+<!--        </dependency>-->
 
         <!-- no more than 2.3.3-->
         <dependency>
diff --git a/sample/src/main/java/com/dji/sample/component/ApplicationBootInitial.java b/sample/src/main/java/com/dji/sample/component/ApplicationBootInitial.java
index 16a691c..37b345e 100644
--- a/sample/src/main/java/com/dji/sample/component/ApplicationBootInitial.java
+++ b/sample/src/main/java/com/dji/sample/component/ApplicationBootInitial.java
@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
+import jakarta.annotation.Resource;
 import java.util.Optional;
 
 /**
@@ -27,6 +28,9 @@ public class ApplicationBootInitial implements CommandLineRunner {
     @Autowired
     private IDeviceRedisService deviceRedisService;
 
+    @Resource
+    SDKManager sdkManager;
+
     /**
      * Subscribe to the devices that exist in the redis when the program starts,
      * to prevent the data from being different from the pilot side due to program interruptions.
@@ -44,7 +48,7 @@ public class ApplicationBootInitial implements CommandLineRunner {
                 .map(Optional::get)
                 .filter(device -> DeviceDomainEnum.DRONE != device.getDomain())
                 .forEach(device -> deviceService.subDeviceOnlineSubscribeTopic(
-                        SDKManager.registerDevice(device.getDeviceSn(), device.getChildDeviceSn(), device.getDomain(),
+                        sdkManager.registerDevice(device.getDeviceSn(), device.getChildDeviceSn(), device.getDomain(),
                                 device.getType(), device.getSubType(), device.getThingVersion(),
                                 deviceRedisService.getDeviceOnline(device.getChildDeviceSn()).map(DeviceDTO::getThingVersion).orElse(null))));
 
diff --git a/sample/src/main/java/com/dji/sample/component/AuthInterceptor.java b/sample/src/main/java/com/dji/sample/component/AuthInterceptor.java
index 9933466..4cd0f37 100644
--- a/sample/src/main/java/com/dji/sample/component/AuthInterceptor.java
+++ b/sample/src/main/java/com/dji/sample/component/AuthInterceptor.java
@@ -11,8 +11,8 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.util.Optional;
 
 @Slf4j
diff --git a/sample/src/main/java/com/dji/sample/component/CorsFilter.java b/sample/src/main/java/com/dji/sample/component/CorsFilter.java
index a4c245f..af3d826 100644
--- a/sample/src/main/java/com/dji/sample/component/CorsFilter.java
+++ b/sample/src/main/java/com/dji/sample/component/CorsFilter.java
@@ -2,9 +2,9 @@ package com.dji.sample.component;
 
 import org.springframework.stereotype.Component;
 
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.*;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 import static com.dji.sample.component.AuthInterceptor.PARAM_TOKEN;
diff --git a/sample/src/main/java/com/dji/sample/component/oss/service/impl/AliyunOssServiceImpl.java b/sample/src/main/java/com/dji/sample/component/oss/service/impl/AliyunOssServiceImpl.java
index 03d65a6..c66e67f 100644
--- a/sample/src/main/java/com/dji/sample/component/oss/service/impl/AliyunOssServiceImpl.java
+++ b/sample/src/main/java/com/dji/sample/component/oss/service/impl/AliyunOssServiceImpl.java
@@ -86,6 +86,7 @@ public class AliyunOssServiceImpl implements IOssService {
 
     @Override
     public InputStream getObject(String bucket, String objectKey) {
+        //bug: ossClient.getObject -> OSSObject need to close manually. otherwise will hang up main thread to wait available connection. by witcom @2023.12.08
         return ossClient.getObject(bucket, objectKey).getObjectContent();
     }
 
@@ -94,6 +95,7 @@ public class AliyunOssServiceImpl implements IOssService {
         if (ossClient.doesObjectExist(bucket, objectKey)) {
             throw new RuntimeException("The filename already exists.");
         }
+        //bug: PutObjectResult need to close manually. otherwise will hang up main thread to wait available connection. by witcom @2023.12.08
         PutObjectResult objectResult = ossClient.putObject(new PutObjectRequest(bucket, objectKey, input, new ObjectMetadata()));
         log.info("Upload FlighttaskCreateFile: {}", objectResult.getETag());
     }
diff --git a/sample/src/main/java/com/dji/sample/component/oss/service/impl/AmazonS3ServiceImpl.java b/sample/src/main/java/com/dji/sample/component/oss/service/impl/AmazonS3ServiceImpl.java
index dabc0bd..663819c 100644
--- a/sample/src/main/java/com/dji/sample/component/oss/service/impl/AmazonS3ServiceImpl.java
+++ b/sample/src/main/java/com/dji/sample/component/oss/service/impl/AmazonS3ServiceImpl.java
@@ -19,7 +19,7 @@ import com.dji.sdk.cloudapi.storage.OssTypeEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
 import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
diff --git a/sample/src/main/java/com/dji/sample/component/websocket/config/AuthPrincipalHandler.java b/sample/src/main/java/com/dji/sample/component/websocket/config/AuthPrincipalHandler.java
index 05fbd2d..7d04a1f 100644
--- a/sample/src/main/java/com/dji/sample/component/websocket/config/AuthPrincipalHandler.java
+++ b/sample/src/main/java/com/dji/sample/component/websocket/config/AuthPrincipalHandler.java
@@ -11,7 +11,7 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.socket.WebSocketHandler;
 import org.springframework.web.socket.server.support.DefaultHandshakeHandler;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.security.Principal;
 import java.util.Map;
 import java.util.Optional;
diff --git a/sample/src/main/java/com/dji/sample/control/controller/DockController.java b/sample/src/main/java/com/dji/sample/control/controller/DockController.java
index 3146d9d..2d91e44 100644
--- a/sample/src/main/java/com/dji/sample/control/controller/DockController.java
+++ b/sample/src/main/java/com/dji/sample/control/controller/DockController.java
@@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.validation.Valid;
+import jakarta.validation.Valid;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/control/controller/DrcController.java b/sample/src/main/java/com/dji/sample/control/controller/DrcController.java
index f40670c..cf7f563 100644
--- a/sample/src/main/java/com/dji/sample/control/controller/DrcController.java
+++ b/sample/src/main/java/com/dji/sample/control/controller/DrcController.java
@@ -11,8 +11,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
 
 import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
 
diff --git a/sample/src/main/java/com/dji/sample/control/model/param/DrcModeParam.java b/sample/src/main/java/com/dji/sample/control/model/param/DrcModeParam.java
index d483da1..ae31f58 100644
--- a/sample/src/main/java/com/dji/sample/control/model/param/DrcModeParam.java
+++ b/sample/src/main/java/com/dji/sample/control/model/param/DrcModeParam.java
@@ -7,8 +7,8 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.hibernate.validator.constraints.Range;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/control/model/param/DronePayloadParam.java b/sample/src/main/java/com/dji/sample/control/model/param/DronePayloadParam.java
index de9aa21..ae77c9c 100644
--- a/sample/src/main/java/com/dji/sample/control/model/param/DronePayloadParam.java
+++ b/sample/src/main/java/com/dji/sample/control/model/param/DronePayloadParam.java
@@ -6,8 +6,8 @@ import com.dji.sdk.cloudapi.device.CameraModeEnum;
 import lombok.Data;
 import org.hibernate.validator.constraints.Range;
 
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/control/model/param/FlyToPointParam.java b/sample/src/main/java/com/dji/sample/control/model/param/FlyToPointParam.java
index 4c96423..d6ad483 100644
--- a/sample/src/main/java/com/dji/sample/control/model/param/FlyToPointParam.java
+++ b/sample/src/main/java/com/dji/sample/control/model/param/FlyToPointParam.java
@@ -6,9 +6,9 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.hibernate.validator.constraints.Range;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.util.List;
 
 /**
diff --git a/sample/src/main/java/com/dji/sample/control/model/param/PayloadCommandsParam.java b/sample/src/main/java/com/dji/sample/control/model/param/PayloadCommandsParam.java
index f5c4a6e..9005a9d 100644
--- a/sample/src/main/java/com/dji/sample/control/model/param/PayloadCommandsParam.java
+++ b/sample/src/main/java/com/dji/sample/control/model/param/PayloadCommandsParam.java
@@ -3,8 +3,8 @@ package com.dji.sample.control.model.param;
 import com.dji.sample.control.model.enums.PayloadCommandsEnum;
 import lombok.Data;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/control/model/param/RemoteDebugParam.java b/sample/src/main/java/com/dji/sample/control/model/param/RemoteDebugParam.java
index 8678d3a..154f2f8 100644
--- a/sample/src/main/java/com/dji/sample/control/model/param/RemoteDebugParam.java
+++ b/sample/src/main/java/com/dji/sample/control/model/param/RemoteDebugParam.java
@@ -2,7 +2,7 @@ package com.dji.sample.control.model.param;
 
 import lombok.Data;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/control/model/param/TakeoffToPointParam.java b/sample/src/main/java/com/dji/sample/control/model/param/TakeoffToPointParam.java
index d2e79fc..056542f 100644
--- a/sample/src/main/java/com/dji/sample/control/model/param/TakeoffToPointParam.java
+++ b/sample/src/main/java/com/dji/sample/control/model/param/TakeoffToPointParam.java
@@ -8,9 +8,9 @@ import com.dji.sdk.cloudapi.wayline.RthModeEnum;
 import lombok.Data;
 import org.hibernate.validator.constraints.Range;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java b/sample/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
index 530729e..4bd5b0f 100644
--- a/sample/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
+++ b/sample/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
@@ -68,6 +68,9 @@ public class ControlServiceImpl implements IControlService {
     @Qualifier("SDKWaylineService")
     private AbstractWaylineService abstractWaylineService;
 
+    @Autowired
+    SDKManager SDKManager;
+
     private RemoteDebugHandler checkDebugCondition(String sn, RemoteDebugParam param, RemoteDebugMethodEnum controlMethodEnum) {
         RemoteDebugHandler handler = Objects.nonNull(controlMethodEnum.getClazz()) ?
                 mapper.convertValue(Objects.nonNull(param) ? param : new Object(), controlMethodEnum.getClazz())
diff --git a/sample/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java b/sample/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java
index 7aa86f3..29a61ec 100644
--- a/sample/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java
+++ b/sample/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java
@@ -84,6 +84,9 @@ public class DrcServiceImpl implements IDrcService {
     @Autowired
     private AbstractControlService abstractControlService;
 
+    @Autowired
+    SDKManager SDKManager;
+
     @Override
     public void setDrcModeInRedis(String dockSn, String clientId) {
         RedisOpsUtils.setWithExpire(RedisConst.DRC_PREFIX + dockSn, clientId, RedisConst.DRC_MODE_ALIVE_SECOND);
diff --git a/sample/src/main/java/com/dji/sample/manage/controller/DeviceFirmwareController.java b/sample/src/main/java/com/dji/sample/manage/controller/DeviceFirmwareController.java
index 6425bbb..1345028 100644
--- a/sample/src/main/java/com/dji/sample/manage/controller/DeviceFirmwareController.java
+++ b/sample/src/main/java/com/dji/sample/manage/controller/DeviceFirmwareController.java
@@ -15,9 +15,9 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
diff --git a/sample/src/main/java/com/dji/sample/manage/controller/DeviceLogsController.java b/sample/src/main/java/com/dji/sample/manage/controller/DeviceLogsController.java
index 3e08d53..18f3874 100644
--- a/sample/src/main/java/com/dji/sample/manage/controller/DeviceLogsController.java
+++ b/sample/src/main/java/com/dji/sample/manage/controller/DeviceLogsController.java
@@ -13,8 +13,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.net.URL;
 
 import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
diff --git a/sample/src/main/java/com/dji/sample/manage/controller/LiveStreamController.java b/sample/src/main/java/com/dji/sample/manage/controller/LiveStreamController.java
index 27f1a64..71ea56b 100644
--- a/sample/src/main/java/com/dji/sample/manage/controller/LiveStreamController.java
+++ b/sample/src/main/java/com/dji/sample/manage/controller/LiveStreamController.java
@@ -10,7 +10,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.List;
 
 import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
diff --git a/sample/src/main/java/com/dji/sample/manage/controller/LoginController.java b/sample/src/main/java/com/dji/sample/manage/controller/LoginController.java
index 9572dbb..e74acd4 100644
--- a/sample/src/main/java/com/dji/sample/manage/controller/LoginController.java
+++ b/sample/src/main/java/com/dji/sample/manage/controller/LoginController.java
@@ -12,8 +12,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.util.Optional;
 
 import static com.dji.sample.component.AuthInterceptor.PARAM_TOKEN;
diff --git a/sample/src/main/java/com/dji/sample/manage/controller/TopologyController.java b/sample/src/main/java/com/dji/sample/manage/controller/TopologyController.java
index 10908d2..15d2339 100644
--- a/sample/src/main/java/com/dji/sample/manage/controller/TopologyController.java
+++ b/sample/src/main/java/com/dji/sample/manage/controller/TopologyController.java
@@ -8,8 +8,8 @@ import com.dji.sdk.common.HttpResultResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
diff --git a/sample/src/main/java/com/dji/sample/manage/controller/UserController.java b/sample/src/main/java/com/dji/sample/manage/controller/UserController.java
index 5536948..2706f8f 100644
--- a/sample/src/main/java/com/dji/sample/manage/controller/UserController.java
+++ b/sample/src/main/java/com/dji/sample/manage/controller/UserController.java
@@ -8,7 +8,7 @@ import com.dji.sdk.common.PaginationData;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 
 import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
 
diff --git a/sample/src/main/java/com/dji/sample/manage/controller/WorkspaceController.java b/sample/src/main/java/com/dji/sample/manage/controller/WorkspaceController.java
index 80110ac..d1e2b5e 100644
--- a/sample/src/main/java/com/dji/sample/manage/controller/WorkspaceController.java
+++ b/sample/src/main/java/com/dji/sample/manage/controller/WorkspaceController.java
@@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.Optional;
 
 import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
diff --git a/sample/src/main/java/com/dji/sample/manage/model/common/HmsJsonUtil.java b/sample/src/main/java/com/dji/sample/manage/model/common/HmsJsonUtil.java
index fbfe916..83578f0 100644
--- a/sample/src/main/java/com/dji/sample/manage/model/common/HmsJsonUtil.java
+++ b/sample/src/main/java/com/dji/sample/manage/model/common/HmsJsonUtil.java
@@ -7,7 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
 import java.io.IOException;
 import java.io.InputStream;
 
diff --git a/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareQueryParam.java b/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareQueryParam.java
index ffcc8fb..0d0963f 100644
--- a/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareQueryParam.java
+++ b/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareQueryParam.java
@@ -6,7 +6,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareUpdateParam.java b/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareUpdateParam.java
index 45c357d..f105dd6 100644
--- a/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareUpdateParam.java
+++ b/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareUpdateParam.java
@@ -2,7 +2,7 @@ package com.dji.sample.manage.model.param;
 
 import lombok.Data;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareUploadParam.java b/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareUploadParam.java
index deeb67f..c8bb330 100644
--- a/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareUploadParam.java
+++ b/sample/src/main/java/com/dji/sample/manage/model/param/DeviceFirmwareUploadParam.java
@@ -3,7 +3,7 @@ package com.dji.sample.manage.model.param;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java b/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java
index 3f1593f..b0cc0bd 100644
--- a/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java
+++ b/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java
@@ -85,6 +85,9 @@ public class DeviceLogsServiceImpl extends AbstractLogService implements IDevice
     @Autowired
     private AbstractLogService abstractLogService;
 
+    @Autowired
+    SDKManager SDKManager;
+
     @Override
     public PaginationData<DeviceLogsDTO> getUploadedLogs(String deviceSn, DeviceLogsQueryParam param) {
         LambdaQueryWrapper<DeviceLogsEntity> queryWrapper = new LambdaQueryWrapper<DeviceLogsEntity>()
diff --git a/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java b/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
index 0ef0386..23bc57e 100644
--- a/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
+++ b/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
@@ -125,6 +125,9 @@ public class DeviceServiceImpl implements IDeviceService {
     @Autowired
     private AbstractFirmwareService abstractFirmwareService;
 
+    @Autowired
+    SDKManager SDKManager;
+
     @Override
     public void subDeviceOffline(String deviceSn) {
         // If no information about this device exists in the cache, the drone is considered to be offline.
diff --git a/sample/src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java b/sample/src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java
index 300c88a..09d2122 100644
--- a/sample/src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java
+++ b/sample/src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java
@@ -44,6 +44,9 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
     @Autowired
     private AbstractLivestreamService abstractLivestreamService;
 
+    @Autowired
+    SDKManager SDKManager;
+
     @Override
     public List<CapacityDeviceDTO> getLiveCapacity(String workspaceId) {
 
diff --git a/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java b/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java
index c449c9a..8643053 100644
--- a/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java
+++ b/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java
@@ -57,6 +57,9 @@ public class SDKDeviceService extends AbstractDeviceService {
     @Autowired
     private IDevicePayloadService devicePayloadService;
 
+    @Autowired
+    SDKManager SDKManager;
+
     @Override
     public TopicStatusResponse<MqttReply> updateTopoOnline(TopicStatusRequest<UpdateTopo> request, MessageHeaders headers) {
         UpdateTopoSubDevice updateTopoSubDevice = request.getData().getSubDevices().get(0);
diff --git a/sample/src/main/java/com/dji/sample/map/controller/FlightAreaController.java b/sample/src/main/java/com/dji/sample/map/controller/FlightAreaController.java
index 2bda1a7..154a6fb 100644
--- a/sample/src/main/java/com/dji/sample/map/controller/FlightAreaController.java
+++ b/sample/src/main/java/com/dji/sample/map/controller/FlightAreaController.java
@@ -10,8 +10,8 @@ import com.dji.sdk.common.HttpResultResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
 import java.util.List;
 
 import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
diff --git a/sample/src/main/java/com/dji/sample/map/controller/WorkspaceElementController.java b/sample/src/main/java/com/dji/sample/map/controller/WorkspaceElementController.java
index 4afc12d..f525f02 100644
--- a/sample/src/main/java/com/dji/sample/map/controller/WorkspaceElementController.java
+++ b/sample/src/main/java/com/dji/sample/map/controller/WorkspaceElementController.java
@@ -14,9 +14,9 @@ import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
 import java.util.List;
 
 import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
diff --git a/sample/src/main/java/com/dji/sample/map/model/dto/FlightAreaContent.java b/sample/src/main/java/com/dji/sample/map/model/dto/FlightAreaContent.java
index 6c93e5f..88f48dc 100644
--- a/sample/src/main/java/com/dji/sample/map/model/dto/FlightAreaContent.java
+++ b/sample/src/main/java/com/dji/sample/map/model/dto/FlightAreaContent.java
@@ -7,8 +7,8 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/map/model/param/PostFlightAreaParam.java b/sample/src/main/java/com/dji/sample/map/model/param/PostFlightAreaParam.java
index dbeae02..1e2b8ca 100644
--- a/sample/src/main/java/com/dji/sample/map/model/param/PostFlightAreaParam.java
+++ b/sample/src/main/java/com/dji/sample/map/model/param/PostFlightAreaParam.java
@@ -4,8 +4,8 @@ import com.dji.sample.map.model.dto.FlightAreaContent;
 import com.dji.sdk.cloudapi.flightarea.GeofenceTypeEnum;
 import lombok.Data;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/map/model/param/SyncFlightAreaParam.java b/sample/src/main/java/com/dji/sample/map/model/param/SyncFlightAreaParam.java
index c21b8fd..3428b95 100644
--- a/sample/src/main/java/com/dji/sample/map/model/param/SyncFlightAreaParam.java
+++ b/sample/src/main/java/com/dji/sample/map/model/param/SyncFlightAreaParam.java
@@ -3,7 +3,7 @@ package com.dji.sample.map.model.param;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/sample/src/main/java/com/dji/sample/map/service/impl/FlightAreaServiceImpl.java b/sample/src/main/java/com/dji/sample/map/service/impl/FlightAreaServiceImpl.java
index 8d210dd..04b3d5a 100644
--- a/sample/src/main/java/com/dji/sample/map/service/impl/FlightAreaServiceImpl.java
+++ b/sample/src/main/java/com/dji/sample/map/service/impl/FlightAreaServiceImpl.java
@@ -77,6 +77,9 @@ public class FlightAreaServiceImpl extends AbstractFlightAreaService implements
     @Autowired
     private ObjectMapper objectMapper;
 
+    @Autowired
+    SDKManager sdkManager;
+
     @Override
     public Optional<FlightAreaDTO> getFlightAreaByAreaId(String areaId) {
         List<FlightAreaPropertyDTO> properties = flightAreaPropertyServices.getPropertyByElementIds(List.of(areaId));
@@ -162,7 +165,7 @@ public class FlightAreaServiceImpl extends AbstractFlightAreaService implements
             if (deviceOpt.isEmpty() || !workspaceId.equals(deviceOpt.get().getWorkspaceId())) {
                 throw new RuntimeException(CommonErrorEnum.ILLEGAL_ARGUMENT.getMessage());
             }
-            TopicServicesResponse<ServicesReplyData> response = abstractFlightAreaService.flightAreasUpdate(SDKManager.getDeviceSDK(deviceSn));
+            TopicServicesResponse<ServicesReplyData> response = abstractFlightAreaService.flightAreasUpdate(sdkManager.getDeviceSDK(deviceSn));
             if (!response.getData().getResult().isSuccess()) {
                 throw new RuntimeException(response.getData().getResult().getMessage());
             }
diff --git a/sample/src/main/java/com/dji/sample/media/controller/FileController.java b/sample/src/main/java/com/dji/sample/media/controller/FileController.java
index 3934014..49e8f2d 100644
--- a/sample/src/main/java/com/dji/sample/media/controller/FileController.java
+++ b/sample/src/main/java/com/dji/sample/media/controller/FileController.java
@@ -7,7 +7,7 @@ import com.dji.sdk.common.PaginationData;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URL;
 
diff --git a/sample/src/main/java/com/dji/sample/media/controller/MediaController.java b/sample/src/main/java/com/dji/sample/media/controller/MediaController.java
index ec21a54..eb6d0c7 100644
--- a/sample/src/main/java/com/dji/sample/media/controller/MediaController.java
+++ b/sample/src/main/java/com/dji/sample/media/controller/MediaController.java
@@ -8,9 +8,9 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
 import java.util.List;
 
 /**
diff --git a/sample/src/main/java/com/dji/sample/storage/controller/StorageController.java b/sample/src/main/java/com/dji/sample/storage/controller/StorageController.java
index 1097cb1..7dfe3b5 100644
--- a/sample/src/main/java/com/dji/sample/storage/controller/StorageController.java
+++ b/sample/src/main/java/com/dji/sample/storage/controller/StorageController.java
@@ -7,8 +7,8 @@ import com.dji.sdk.common.HttpResultResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 /**
  * @author sean
diff --git a/sample/src/main/java/com/dji/sample/wayline/controller/WaylineFileController.java b/sample/src/main/java/com/dji/sample/wayline/controller/WaylineFileController.java
index 7b877f4..bfba143 100644
--- a/sample/src/main/java/com/dji/sample/wayline/controller/WaylineFileController.java
+++ b/sample/src/main/java/com/dji/sample/wayline/controller/WaylineFileController.java
@@ -15,11 +15,11 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import java.io.IOException;
 import java.net.URL;
 import java.sql.SQLException;
diff --git a/sample/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java b/sample/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
index 5d8c259..cdbcc08 100644
--- a/sample/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
+++ b/sample/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
@@ -11,8 +11,8 @@ import com.dji.sdk.common.PaginationData;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
 import java.sql.SQLException;
 import java.util.Set;
 
diff --git a/sample/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java b/sample/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java
index f1cdedd..c4e5433 100644
--- a/sample/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java
+++ b/sample/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java
@@ -6,8 +6,8 @@ import com.dji.sdk.cloudapi.wayline.WaylineTypeEnum;
 import lombok.Data;
 import org.hibernate.validator.constraints.Range;
 
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
 /**
diff --git a/sample/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java b/sample/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java
index 938cd80..a7589e6 100644
--- a/sample/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java
+++ b/sample/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java
@@ -62,6 +62,9 @@ public class FlightTaskServiceImpl extends AbstractWaylineService implements IFl
     @Autowired
     private ObjectMapper mapper;
 
+    @Autowired
+    SDKManager SDKManager;
+
     @Autowired
     private IWebSocketMessageService websocketMessageService;
 
diff --git a/src/main/java/com/dji/sdk/cloudapi/wayline/ExecutionStepEnum.java b/src/main/java/com/dji/sdk/cloudapi/wayline/ExecutionStepEnum.java
new file mode 100644
index 0000000..8a4e287
--- /dev/null
+++ b/src/main/java/com/dji/sdk/cloudapi/wayline/ExecutionStepEnum.java
@@ -0,0 +1,67 @@
+package com.dji.sdk.cloudapi.wayline;
+
+import com.dji.sdk.exception.CloudSDKException;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+import java.util.Arrays;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/6/6
+ */
+public enum ExecutionStepEnum {
+
+    STARTING(0, 4, "MissionCenter starting, checking and resuming"),
+
+    WAITING_STATE(5, 18, "Waiting state"),
+
+    EXECUTING(19, 20, "Task executing"),
+
+    RTH(21, 29, "Returning to home"),
+
+    PULLING_LOGS(30, 39, "Pulling logs"),
+
+    COMPLETE(40, 65534, "Interaction completed"),
+
+    UNKNOWN(65535, 65535, "Unknown");
+
+    private final int min;
+
+    private final int max;
+
+    private final String msg;
+
+    ExecutionStepEnum(int min, int max, String msg) {
+        this.min = min;
+        this.max = max;
+        this.msg = msg;
+    }
+
+    @JsonValue
+    public int getMin() {
+        return min;
+    }
+
+    public int getMax() {
+        return max;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    //witcom: 这个函数跑不进来,跑了下面的函数,导致FlightTaskProgress报不上来
+    @JsonCreator
+    public static ExecutionStepEnum find(int step) {
+        return Arrays.stream(values()).filter(stepEnum -> stepEnum.min <= step && stepEnum.max >= step).findAny()
+                .orElseThrow(() -> new CloudSDKException(ExecutionStepEnum.class, step));
+    }
+
+//    @JsonCreator
+//    public static ExecutionStepEnum find(String msg) {
+//        return Arrays.stream(values()).filter(stepEnum -> stepEnum.msg.equals(msg)).findAny()
+//                .orElseThrow(() -> new CloudSDKException(ExecutionStepEnum.class, msg));
+//    }
+}