elements) {
+ this.elements = elements;
+ return this;
+ }
+
+ public Boolean getLock() {
+ return lock;
+ }
+
+ public GetMapElementsResponse setLock(Boolean lock) {
+ this.lock = lock;
+ return this;
+ }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/GroupTypeEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/GroupTypeEnum.java
new file mode 100644
index 0000000..748db7a
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/GroupTypeEnum.java
@@ -0,0 +1,44 @@
+package com.dji.sdk.cloudapi.map;
+
+import com.dji.sdk.exception.CloudSDKException;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import java.util.Arrays;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/6/15
+ */
+@Schema(description = "0: custom element group
1: default element group
2: APP shared element group " +
+ "(type=2 is an APP element group, PILOT will add map elements to this element group by default, " +
+ "and there must be an APP shared element group. " +
+ "It is recommended that in the same workspace, there are And there is only one APP shared element group)
",
+ enumAsRef = true, type = "int", allowableValues = {"0", "1", "2"})
+public enum GroupTypeEnum {
+
+ CUSTOM(0),
+
+ DEFAULT(1),
+
+ SHARED(2);
+
+ private final int type;
+
+ GroupTypeEnum(int type) {
+ this.type = type;
+ }
+
+ @JsonValue
+ public int getType() {
+ return type;
+ }
+
+ @JsonCreator
+ public static GroupTypeEnum find(int type) {
+ return Arrays.stream(values()).filter(typeEnum -> typeEnum.type == type).findAny()
+ .orElseThrow(() -> new CloudSDKException(GroupTypeEnum.class, type));
+ }
+}
diff --git a/src/main/java/com/dji/sdk/cloudapi/map/MapElementCreateWsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementCreateWsResponse.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/map/MapElementCreateWsResponse.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementCreateWsResponse.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/map/MapElementDeleteWsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementDeleteWsResponse.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/map/MapElementDeleteWsResponse.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementDeleteWsResponse.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/map/MapElementUpdateWsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementUpdateWsResponse.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/map/MapElementUpdateWsResponse.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapElementUpdateWsResponse.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/map/MapGroupElement.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupElement.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/map/MapGroupElement.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupElement.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/map/MapGroupRefreshWsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupRefreshWsResponse.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/map/MapGroupRefreshWsResponse.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapGroupRefreshWsResponse.java
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapMethodEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapMethodEnum.java
new file mode 100644
index 0000000..14846ca
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/MapMethodEnum.java
@@ -0,0 +1,26 @@
+package com.dji.sdk.cloudapi.map;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/20
+ */
+public enum MapMethodEnum {
+
+ OFFLINE_MAP_UPDATE("offline_map_update"),
+
+ ;
+
+ private final String method;
+
+ MapMethodEnum(String method) {
+ this.method = method;
+ }
+
+ @JsonValue
+ public String getMethod() {
+ return method;
+ }
+}
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
new file mode 100644
index 0000000..db8b364
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapFile.java
@@ -0,0 +1,84 @@
+package com.dji.sdk.cloudapi.map;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/20
+ */
+public class OfflineMapFile {
+
+ /**
+ * The offline map file name will be used as a way to determine the version, and the format is: offline_map_{sync_method}_{version}.
+ * offline_map: is a fixed prefix, sync_method: data synchronization method - full (full), version: version number
+ */
+ @NotNull
+ @Pattern(regexp = "^offline_map_full_\\w+\\.rocksdb\\.zip$")
+ private String name;
+
+ @NotNull
+ private String url;
+
+ /**
+ * Calculated using SHA256, this value can be used to confirm whether the file is complete.
+ */
+ @NotNull
+ private String checksum;
+
+ /**
+ * The size of this file in bytes.
+ */
+ @NotNull
+ private Long size;
+
+ public OfflineMapFile() {
+ }
+
+ @Override
+ public String toString() {
+ return "OfflineMapFile{" +
+ "name='" + name + '\'' +
+ ", url='" + url + '\'' +
+ ", checksum='" + checksum + '\'' +
+ ", size=" + size +
+ '}';
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public OfflineMapFile setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public OfflineMapFile setUrl(String url) {
+ this.url = url;
+ return this;
+ }
+
+ public String getChecksum() {
+ return checksum;
+ }
+
+ public OfflineMapFile setChecksum(String checksum) {
+ this.checksum = checksum;
+ return this;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public OfflineMapFile setSize(Long size) {
+ this.size = size;
+ return this;
+ }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapGetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapGetRequest.java
new file mode 100644
index 0000000..0a29f0d
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapGetRequest.java
@@ -0,0 +1,9 @@
+package com.dji.sdk.cloudapi.map;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/20
+ */
+public class OfflineMapGetRequest {
+}
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
new file mode 100644
index 0000000..43ebc83
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapGetResponse.java
@@ -0,0 +1,56 @@
+package com.dji.sdk.cloudapi.map;
+
+import com.dji.sdk.common.BaseModel;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/20
+ */
+public class OfflineMapGetResponse extends BaseModel {
+
+ /**
+ * This parameter allows the dock to turn off the offline map capability of the aircraft.
+ */
+ @NotNull
+ private Boolean offlineMapEnable;
+
+ /**
+ * Offline map file object list.
+ */
+ @NotNull
+ private List<@Valid OfflineMapFile> files;
+
+ public OfflineMapGetResponse() {
+ }
+
+ @Override
+ public String toString() {
+ return "OfflineMapGetResponse{" +
+ "offlineMapEnable=" + offlineMapEnable +
+ ", files=" + files +
+ '}';
+ }
+
+ public Boolean getOfflineMapEnable() {
+ return offlineMapEnable;
+ }
+
+ public OfflineMapGetResponse setOfflineMapEnable(Boolean offlineMapEnable) {
+ this.offlineMapEnable = offlineMapEnable;
+ return this;
+ }
+
+ public List getFiles() {
+ return files;
+ }
+
+ public OfflineMapGetResponse setFiles(List files) {
+ this.files = files;
+ return this;
+ }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncFile.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncFile.java
new file mode 100644
index 0000000..85e1660
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncFile.java
@@ -0,0 +1,49 @@
+package com.dji.sdk.cloudapi.map;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/20
+ */
+public class OfflineMapSyncFile {
+
+ /**
+ * The offline map file name will be used as a way to determine the version, and the format is: offline_map_{sync_method}_{version}.
+ * offline_map: is a fixed prefix, sync_method: data synchronization method - full (full), version: version number
+ */
+ private String name;
+
+ /**
+ * Calculated using SHA256, this value can be used to confirm whether the file is complete.
+ */
+ private String checksum;
+
+ public OfflineMapSyncFile() {
+ }
+
+ @Override
+ public String toString() {
+ return "OfflineMapSyncFile{" +
+ "name='" + name + '\'' +
+ ", checksum='" + checksum + '\'' +
+ '}';
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public OfflineMapSyncFile setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public String getChecksum() {
+ return checksum;
+ }
+
+ public OfflineMapSyncFile setChecksum(String checksum) {
+ this.checksum = checksum;
+ return this;
+ }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncProgress.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncProgress.java
new file mode 100644
index 0000000..8ef5705
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncProgress.java
@@ -0,0 +1,63 @@
+package com.dji.sdk.cloudapi.map;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/20
+ */
+public class OfflineMapSyncProgress {
+
+ /**
+ * Sync status
+ */
+ private OfflineMapSyncStatusEnum status;
+
+ /**
+ * Result code
+ */
+ private OfflineMapSyncReasonEnum reason;
+
+ /**
+ * Offline map file information
+ */
+ private OfflineMapSyncFile file;
+
+ public OfflineMapSyncProgress() {
+ }
+
+ @Override
+ public String toString() {
+ return "OfflineMapSyncProgress{" +
+ "status=" + status +
+ ", reason=" + reason +
+ ", file=" + file +
+ '}';
+ }
+
+ public OfflineMapSyncStatusEnum getStatus() {
+ return status;
+ }
+
+ public OfflineMapSyncProgress setStatus(OfflineMapSyncStatusEnum status) {
+ this.status = status;
+ return this;
+ }
+
+ public OfflineMapSyncReasonEnum getReason() {
+ return reason;
+ }
+
+ public OfflineMapSyncProgress setReason(OfflineMapSyncReasonEnum reason) {
+ this.reason = reason;
+ return this;
+ }
+
+ public OfflineMapSyncFile getFile() {
+ return file;
+ }
+
+ public OfflineMapSyncProgress setFile(OfflineMapSyncFile file) {
+ this.file = file;
+ return this;
+ }
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncReasonEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncReasonEnum.java
new file mode 100644
index 0000000..9b1114f
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncReasonEnum.java
@@ -0,0 +1,62 @@
+package com.dji.sdk.cloudapi.map;
+
+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/10/20
+ */
+public enum OfflineMapSyncReasonEnum {
+
+ SUCCESS(0, "success"),
+
+ PARSE_FILE_FAILED(1, "Failed to parse the file information returned by the cloud."),
+
+ OBTAIN_DRONE_FILE_FAILED(2, "Failed to obtain aircraft file information."),
+
+ DOWNLOAD_FILE_FAILED(3, "Failed to download file from cloud."),
+
+ LINK_ROLLOVER_FAILED(4, "Failed to rollover the link."),
+
+ FILE_TRANSFER_FAILED(5, "Failed to transfer file."),
+
+ DISABLE_OFFLINE_MAP_FAILED(6, "Failed to disable offline map."),
+
+ DELETE_FILE_FAILED(7, "Failed to delete file."),
+
+ LOAD_FILE_FAILED(8, "Failed to load the file on the device side."),
+
+ ENABLE_OFFLINE_MAP_FAILED(9, "Failed to enable offline map."),
+
+ ;
+
+ private final int reason;
+
+ private final String msg;
+
+ OfflineMapSyncReasonEnum(int reason, String msg) {
+ this.reason = reason;
+ this.msg = msg;
+ }
+
+ @JsonValue
+ public int getReason() {
+ return reason;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ @JsonCreator
+ public static OfflineMapSyncReasonEnum find(int reason) {
+ return Arrays.stream(values()).filter(reasonEnum -> reasonEnum.reason == reason).findAny()
+ .orElseThrow(() -> new CloudSDKException(OfflineMapSyncReasonEnum.class, reason));
+ }
+
+}
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncStatusEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncStatusEnum.java
new file mode 100644
index 0000000..fae0dc3
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/OfflineMapSyncStatusEnum.java
@@ -0,0 +1,45 @@
+package com.dji.sdk.cloudapi.map;
+
+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/10/20
+ */
+public enum OfflineMapSyncStatusEnum {
+
+ WAIT_SYNC("wait_sync"),
+
+ SYNCHRONIZING("synchronizing"),
+
+ SYNCHRONIZED("synchronized"),
+
+ FAIL("fail"),
+
+ SWITCH_FAIL("switch_fail"),
+
+ ;
+
+
+ private final String status;
+
+ OfflineMapSyncStatusEnum(String status) {
+ this.status = status;
+ }
+
+ @JsonValue
+ public String getStatus() {
+ return status;
+ }
+
+ @JsonCreator
+ public static OfflineMapSyncStatusEnum find(String status) {
+ return Arrays.stream(values()).filter(statusEnum -> statusEnum.status.equals(status)).findAny()
+ .orElseThrow(() -> new CloudSDKException(OfflineMapSyncStatusEnum.class, status));
+ }
+}
diff --git a/src/main/java/com/dji/sdk/cloudapi/map/UpdateMapElementRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/UpdateMapElementRequest.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/map/UpdateMapElementRequest.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/UpdateMapElementRequest.java
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
new file mode 100644
index 0000000..af47a44
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/AbstractOfflineMapService.java
@@ -0,0 +1,87 @@
+package com.dji.sdk.cloudapi.map.api;
+
+import com.dji.sdk.annotations.CloudSDKVersion;
+import com.dji.sdk.cloudapi.map.MapMethodEnum;
+import com.dji.sdk.cloudapi.map.OfflineMapGetRequest;
+import com.dji.sdk.cloudapi.map.OfflineMapGetResponse;
+import com.dji.sdk.cloudapi.map.OfflineMapSyncProgress;
+import com.dji.sdk.cloudapi.property.DockDroneOfflineMapEnable;
+import com.dji.sdk.config.version.CloudSDKVersionEnum;
+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.requests.TopicRequestsRequest;
+import com.dji.sdk.mqtt.requests.TopicRequestsResponse;
+import com.dji.sdk.mqtt.services.ServicesPublish;
+import com.dji.sdk.mqtt.services.ServicesReplyData;
+import com.dji.sdk.mqtt.services.TopicServicesResponse;
+import com.dji.sdk.mqtt.state.TopicStateRequest;
+import com.dji.sdk.mqtt.state.TopicStateResponse;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.MessageHeaders;
+
+import javax.annotation.Resource;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/19
+ */
+public abstract class AbstractOfflineMapService {
+
+ @Resource
+ private ServicesPublish servicesPublish;
+
+ /**
+ * When the offline map is closed, offline map synchronization will no longer automatically synchronize.
+ * @param request data
+ * @param headers The headers for a {@link Message}.
+ */
+ @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_1, include = GatewayTypeEnum.DOCK2)
+ @ServiceActivator(inputChannel = ChannelName.INBOUND_STATE_DOCK_DRONE_OFFLINE_MAP_ENABLE, outputChannel = ChannelName.OUTBOUND_STATE)
+ public TopicStateResponse dockDroneOfflineMapEnable(TopicStateRequest request, MessageHeaders headers) {
+ throw new UnsupportedOperationException("dockDroneOfflineMapEnable not implemented");
+ }
+
+ /**
+ * Actively trigger offline map updates.
+ * After receiving the message, the airport will actively pull offline map information at the appropriate time and trigger the offline map synchronization mechanism.
+ * @param gateway gateway device
+ * @return services_reply
+ */
+ @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_1, include = GatewayTypeEnum.DOCK2)
+ public TopicServicesResponse offlineMapUpdate(GatewayManager gateway) {
+ return servicesPublish.publish(
+ gateway.getGatewaySn(),
+ MapMethodEnum.OFFLINE_MAP_UPDATE.getMethod());
+ }
+
+ /**
+ * Offline map file synchronization status
+ * @param request data
+ * @param headers The headers for a {@link Message}.
+ * @return events_reply
+ */
+ @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_OFFLINE_MAP_SYNC_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS)
+ @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_1, include = GatewayTypeEnum.DOCK2)
+ public TopicRequestsResponse offlineMapSyncProgress(TopicRequestsRequest request, MessageHeaders headers) {
+ throw new UnsupportedOperationException("offlineMapSyncProgress not implemented");
+ }
+
+ /**
+ * The dock will actively pull the latest offline map file information.
+ * From this information, it will check whether the aircraft's offline map file name or checksum has changed.
+ * Once a change is found, offline map synchronization will be triggered.
+ * Otherwise, synchronization will not be triggered.
+ * @param request data
+ * @param headers The headers for a {@link Message}.
+ * @return events_reply
+ */
+ @ServiceActivator(inputChannel = ChannelName.INBOUND_REQUESTS_OFFLINE_MAP_GET, outputChannel = ChannelName.OUTBOUND_REQUESTS)
+ @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_1, include = GatewayTypeEnum.DOCK2)
+ public TopicRequestsResponse> offlineMapGet(TopicRequestsRequest request, MessageHeaders headers) {
+ throw new UnsupportedOperationException("offlineMapGet not implemented");
+ }
+}
diff --git a/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
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/map/api/IHttpMapService.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/api/IHttpMapService.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/FastUploadExtension.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FastUploadExtension.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/FastUploadExtension.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FastUploadExtension.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/FileUploadCallback.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FileUploadCallback.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/FileUploadCallback.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FileUploadCallback.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/FileUploadCallbackFile.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FileUploadCallbackFile.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/FileUploadCallbackFile.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FileUploadCallbackFile.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/FolderUploadCallbackRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FolderUploadCallbackRequest.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/FolderUploadCallbackRequest.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/FolderUploadCallbackRequest.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintRequest.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintRequest.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintRequest.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintResponse.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintResponse.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/GetFileFingerprintResponse.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/HighestPriorityUploadFlightTaskMedia.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/HighestPriorityUploadFlightTaskMedia.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/HighestPriorityUploadFlightTaskMedia.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/HighestPriorityUploadFlightTaskMedia.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/MediaFastUploadRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFastUploadRequest.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/MediaFastUploadRequest.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFastUploadRequest.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/MediaFileExtension.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileExtension.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/MediaFileExtension.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileExtension.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaFileMetadata.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/MediaMethodEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaMethodEnum.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/MediaMethodEnum.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaMethodEnum.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/MediaSubFileTypeEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaSubFileTypeEnum.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/MediaSubFileTypeEnum.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaSubFileTypeEnum.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/MediaUploadCallbackRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaUploadCallbackRequest.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/MediaUploadCallbackRequest.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/MediaUploadCallbackRequest.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/Position.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/Position.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/Position.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/Position.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGet.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGetModuleEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGetModuleEnum.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGetModuleEnum.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/StorageConfigGetModuleEnum.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/UploadCallbackFileExtension.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/UploadCallbackFileExtension.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/UploadCallbackFileExtension.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/UploadCallbackFileExtension.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/media/UploadCallbackFileMetadata.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/UploadCallbackFileMetadata.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/UploadCallbackFileMetadata.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/UploadCallbackFileMetadata.java
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
new file mode 100644
index 0000000..b93fad3
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/UploadFlighttaskMediaPrioritize.java
@@ -0,0 +1,37 @@
+package com.dji.sdk.cloudapi.media;
+
+import com.dji.sdk.common.BaseModel;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/6/27
+ */
+public class UploadFlighttaskMediaPrioritize extends BaseModel {
+
+ @NotNull
+ @Pattern(regexp = "^[^<>:\"/|?*._\\\\]+$")
+ private String flightId;
+
+ public UploadFlighttaskMediaPrioritize() {
+ }
+
+ @Override
+ public String toString() {
+ return "UploadFlighttaskMediaPrioritize{" +
+ "flightId='" + flightId + '\'' +
+ '}';
+ }
+
+ public String getFlightId() {
+ return flightId;
+ }
+
+ public UploadFlighttaskMediaPrioritize setFlightId(String flightId) {
+ this.flightId = flightId;
+ return this;
+ }
+}
diff --git a/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
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/api/AbstractMediaService.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/AbstractMediaService.java
diff --git a/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
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/media/api/IHttpMediaService.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/media/api/IHttpMediaService.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/organization/AirportBindStatusRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportBindStatusRequest.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/organization/AirportBindStatusRequest.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportBindStatusRequest.java
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
new file mode 100644
index 0000000..2bff608
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportBindStatusResponse.java
@@ -0,0 +1,39 @@
+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 java.util.List;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/6/30
+ */
+public class AirportBindStatusResponse extends BaseModel {
+
+ @NotNull
+ @Size(min = 1, max = 2)
+ private List<@Valid BindStatusRequestDevice> bindStatus;
+
+ public AirportBindStatusResponse() {
+ }
+
+ @Override
+ public String toString() {
+ return "AirportBindStatusResponse{" +
+ "bindStatus=" + bindStatus +
+ '}';
+ }
+
+ public List getBindStatus() {
+ return bindStatus;
+ }
+
+ public AirportBindStatusResponse setBindStatus(List bindStatus) {
+ this.bindStatus = bindStatus;
+ return this;
+ }
+}
diff --git a/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationBindRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationBindRequest.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationBindRequest.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationBindRequest.java
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
new file mode 100644
index 0000000..296fcb6
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationBindResponse.java
@@ -0,0 +1,39 @@
+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 java.util.List;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/6/30
+ */
+public class AirportOrganizationBindResponse extends BaseModel {
+
+ @NotNull
+ @Size(min = 1, max = 2)
+ private List<@Valid OrganizationBindInfo> errInfos;
+
+ public AirportOrganizationBindResponse() {
+ }
+
+ @Override
+ public String toString() {
+ return "AirportOrganizationBindResponse{" +
+ "errInfos=" + errInfos +
+ '}';
+ }
+
+ public List getErrInfos() {
+ return errInfos;
+ }
+
+ public AirportOrganizationBindResponse setErrInfos(List errInfos) {
+ this.errInfos = errInfos;
+ return this;
+ }
+}
diff --git a/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetRequest.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetRequest.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetRequest.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetRequest.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetResponse.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetResponse.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/AirportOrganizationGetResponse.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusRequestDevice.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusRequestDevice.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/organization/BindStatusRequestDevice.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusRequestDevice.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusResponseDevice.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusResponseDevice.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/organization/BindStatusResponseDevice.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/BindStatusResponseDevice.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindDevice.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindDevice.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindDevice.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindDevice.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindInfo.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindInfo.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindInfo.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/OrganizationBindInfo.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/organization/api/AbstractOrganizationService.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/api/AbstractOrganizationService.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/organization/api/AbstractOrganizationService.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/organization/api/AbstractOrganizationService.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusData.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusData.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusData.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusData.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DistanceLimitStatusSet.java
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
new file mode 100644
index 0000000..5178d1c
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderFlightHeight.java
@@ -0,0 +1,41 @@
+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;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/20
+ */
+public class DockDroneCommanderFlightHeight extends BaseModel {
+
+ @JsonProperty("commander_flight_height")
+ @NotNull
+ @Min(2)
+ @Max(3000)
+ private Float commanderFlightHeight;
+
+ public DockDroneCommanderFlightHeight() {
+ }
+
+ @Override
+ public String toString() {
+ return "DockDroneCommanderFlightHeight{" +
+ "commanderFlightHeight=" + commanderFlightHeight +
+ '}';
+ }
+
+ public Float getCommanderFlightHeight() {
+ return commanderFlightHeight;
+ }
+
+ public DockDroneCommanderFlightHeight setCommanderFlightHeight(Float commanderFlightHeight) {
+ this.commanderFlightHeight = commanderFlightHeight;
+ return this;
+ }
+}
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
new file mode 100644
index 0000000..014a4b6
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneCommanderModeLostAction.java
@@ -0,0 +1,38 @@
+package com.dji.sdk.cloudapi.property;
+
+import com.dji.sdk.cloudapi.control.CommanderModeLostActionEnum;
+import com.dji.sdk.common.BaseModel;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/19
+ */
+public class DockDroneCommanderModeLostAction extends BaseModel {
+
+ @JsonProperty("commander_mode_lost_action")
+ @NotNull
+ private CommanderModeLostActionEnum commanderModeLostAction;
+
+ public DockDroneCommanderModeLostAction() {
+ }
+
+ @Override
+ public String toString() {
+ return "DockDroneCommanderModeLostAction{" +
+ "commanderModeLostAction=" + commanderModeLostAction +
+ '}';
+ }
+
+ public CommanderModeLostActionEnum getCommanderModeLostAction() {
+ return commanderModeLostAction;
+ }
+
+ public DockDroneCommanderModeLostAction setCommanderModeLostAction(CommanderModeLostActionEnum commanderModeLostAction) {
+ this.commanderModeLostAction = commanderModeLostAction;
+ return this;
+ }
+}
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
new file mode 100644
index 0000000..c329212
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneOfflineMapEnable.java
@@ -0,0 +1,37 @@
+package com.dji.sdk.cloudapi.property;
+
+import com.dji.sdk.common.BaseModel;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/20
+ */
+public class DockDroneOfflineMapEnable extends BaseModel {
+
+ @JsonProperty("offline_map_enable")
+ @NotNull
+ private Boolean offlineMapEnable;
+
+ public DockDroneOfflineMapEnable() {
+ }
+
+ @Override
+ public String toString() {
+ return "DockDroneOfflineMapEnable{" +
+ "offlineMapEnable=" + offlineMapEnable +
+ '}';
+ }
+
+ public Boolean getOfflineMapEnable() {
+ return offlineMapEnable;
+ }
+
+ public DockDroneOfflineMapEnable setOfflineMapEnable(Boolean offlineMapEnable) {
+ this.offlineMapEnable = offlineMapEnable;
+ return this;
+ }
+}
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
new file mode 100644
index 0000000..f900076
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/DockDroneRthMode.java
@@ -0,0 +1,38 @@
+package com.dji.sdk.cloudapi.property;
+
+import com.dji.sdk.cloudapi.wayline.RthModeEnum;
+import com.dji.sdk.common.BaseModel;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/11
+ */
+public class DockDroneRthMode extends BaseModel {
+
+ @JsonProperty("rth_mode")
+ @NotNull
+ private RthModeEnum rthMode;
+
+ public DockDroneRthMode() {
+ }
+
+ @Override
+ public String toString() {
+ return "DockDroneRthMode{" +
+ "rthMode=" + rthMode +
+ '}';
+ }
+
+ public RthModeEnum getRthMode() {
+ return rthMode;
+ }
+
+ public DockDroneRthMode setRthMode(RthModeEnum rthMode) {
+ this.rthMode = rthMode;
+ return this;
+ }
+}
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/ExitWaylineWhenRcLostSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ExitWaylineWhenRcLostSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/ExitWaylineWhenRcLostSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ExitWaylineWhenRcLostSet.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/HeightLimitSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/HeightLimitSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/HeightLimitSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/HeightLimitSet.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/NightLightsStateSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/NightLightsStateSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/NightLightsStateSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/NightLightsStateSet.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/ObstacleAvoidanceSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ObstacleAvoidanceSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/ObstacleAvoidanceSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ObstacleAvoidanceSet.java
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/PropertySetEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/PropertySetEnum.java
new file mode 100644
index 0000000..9679e95
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/PropertySetEnum.java
@@ -0,0 +1,106 @@
+package com.dji.sdk.cloudapi.property;
+
+import com.dji.sdk.cloudapi.device.DockSilentMode;
+import com.dji.sdk.common.BaseModel;
+import com.dji.sdk.config.version.CloudSDKVersionEnum;
+import com.dji.sdk.config.version.GatewayTypeEnum;
+import com.dji.sdk.exception.CloudSDKException;
+
+import java.util.Arrays;
+import java.util.Set;
+
+/**
+ * @author sean
+ * @version 1.3
+ * @date 2022/10/27
+ */
+public enum PropertySetEnum {
+
+ NIGHT_LIGHTS_STATE("night_lights_state", NightLightsStateSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ HEIGHT_LIMIT("height_limit", HeightLimitSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ DISTANCE_LIMIT_STATUS("distance_limit_status", DistanceLimitStatusSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ OBSTACLE_AVOIDANCE("obstacle_avoidance", ObstacleAvoidanceSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ RTH_ALTITUDE("rth_altitude", RthAltitudeSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ OUT_OF_CONTROL_ACTION("rc_lost_action", RcLostActionSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ EXIT_WAYLINE_WHEN_RC_LOST("exit_wayline_when_rc_lost", ExitWaylineWhenRcLostSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2), true),
+
+ THERMAL_CURRENT_PALETTE_STYLE("thermal_current_palette_style", ThermalCurrentPaletteStyleSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ THERMAL_GAIN_MODE("thermal_gain_mode", ThermalGainModeSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ THERMAL_ISOTHERM_STATE("thermal_isotherm_state", ThermalIsothermStateSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ THERMAL_ISOTHERM_UPPER_LIMIT("thermal_isotherm_upper_limit", ThermalIsothermUpperLimitSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ THERMAL_ISOTHERM_LOWER_LIMIT("thermal_isotherm_lower_limit", ThermalIsothermLowerLimitSet.class, CloudSDKVersionEnum.V0_0_1, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ RTH_MODE("rth_mode", DockDroneRthMode.class, CloudSDKVersionEnum.V1_0_0, Set.of(GatewayTypeEnum.DOCK2)),
+
+ USER_EXPERIENCE_IMPROVEMENT("user_experience_improvement", UserExperienceImprovementSet.class, CloudSDKVersionEnum.V1_0_0, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ COMMANDER_MODE_LOST_ACTION("commander_mode_lost_action", DockDroneCommanderModeLostAction.class, CloudSDKVersionEnum.V1_0_0, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ COMMANDER_FLIGHT_HEIGHT("commander_flight_height", DockDroneCommanderFlightHeight.class, CloudSDKVersionEnum.V1_0_0, Set.of(GatewayTypeEnum.DOCK, GatewayTypeEnum.DOCK2)),
+
+ OFFLINE_MAP_ENABLE("offline_map_enable", DockDroneOfflineMapEnable.class, CloudSDKVersionEnum.V1_0_1, Set.of(GatewayTypeEnum.DOCK2)),
+
+ SILENT_MODE("silent_mode", DockSilentMode.class, CloudSDKVersionEnum.V1_0_2, Set.of(GatewayTypeEnum.DOCK)),
+
+ ;
+
+ private final String property;
+
+ private final Class extends BaseModel> clazz;
+
+ private final CloudSDKVersionEnum since;
+
+ private final Set supportedDevices;
+
+ private boolean deprecated;
+
+ PropertySetEnum(String property, Class extends BaseModel> clazz, CloudSDKVersionEnum since, Set supportedDevices) {
+ this.property = property;
+ this.clazz = clazz;
+ this.since = since;
+ this.supportedDevices = supportedDevices;
+ }
+
+ PropertySetEnum(String property, Class extends BaseModel> clazz, CloudSDKVersionEnum since, Set supportedDevices, boolean deprecated) {
+ this.property = property;
+ this.clazz = clazz;
+ this.since = since;
+ this.supportedDevices = supportedDevices;
+ this.deprecated = deprecated;
+ }
+
+ public String getProperty() {
+ return property;
+ }
+
+ public Class extends BaseModel> getClazz() {
+ return clazz;
+ }
+
+ public CloudSDKVersionEnum getSince() {
+ return since;
+ }
+
+ public Set getSupportedDevices() {
+ return supportedDevices;
+ }
+
+ public boolean isDeprecated() {
+ return deprecated;
+ }
+
+ public static PropertySetEnum find(String property) {
+ return Arrays.stream(values()).filter(propertyEnum -> propertyEnum.property.equals(property)).findAny()
+ .orElseThrow(() -> new CloudSDKException(PropertySetEnum.class, property));
+ }
+}
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/RcLostActionSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RcLostActionSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/RcLostActionSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RcLostActionSet.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/RthAltitudeSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RthAltitudeSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/RthAltitudeSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/RthAltitudeSet.java
diff --git a/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/SilentModeEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/SilentModeEnum.java
new file mode 100644
index 0000000..369b6e0
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/SilentModeEnum.java
@@ -0,0 +1,39 @@
+package com.dji.sdk.cloudapi.property;
+
+import com.dji.sdk.exception.CloudSDKException;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+import java.util.Arrays;
+
+/**
+ * @author sean
+ * @date 2023/12/12
+ * @version 1.9
+ */
+public enum SilentModeEnum {
+
+ RING(0),
+
+ SILENT(1),
+
+ ;
+
+ private final int mode;
+
+ SilentModeEnum(int mode) {
+ this.mode = mode;
+ }
+
+ @JsonValue
+ public int getMode() {
+ return mode;
+ }
+
+ @JsonCreator
+ public static SilentModeEnum find(int mode) {
+ return Arrays.stream(values()).filter(modeEnum -> modeEnum.mode == mode).findAny()
+ .orElseThrow(() -> new CloudSDKException(SilentModeEnum.class, mode));
+ }
+
+}
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/ThermalCurrentPaletteStyleSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalCurrentPaletteStyleSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/ThermalCurrentPaletteStyleSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalCurrentPaletteStyleSet.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/ThermalGainModeSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalGainModeSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/ThermalGainModeSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalGainModeSet.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermLowerLimitSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermLowerLimitSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermLowerLimitSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermLowerLimitSet.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermStateSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermStateSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermStateSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermStateSet.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermUpperLimitSet.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermUpperLimitSet.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermUpperLimitSet.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/ThermalIsothermUpperLimitSet.java
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
new file mode 100644
index 0000000..eda802d
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/UserExperienceImprovementSet.java
@@ -0,0 +1,38 @@
+package com.dji.sdk.cloudapi.property;
+
+import com.dji.sdk.cloudapi.device.UserExperienceImprovementEnum;
+import com.dji.sdk.common.BaseModel;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/10/13
+ */
+public class UserExperienceImprovementSet extends BaseModel {
+
+ @NotNull
+ @JsonProperty("user_experience_improvement")
+ private UserExperienceImprovementEnum userExperienceImprovement;
+
+ public UserExperienceImprovementSet() {
+ }
+
+ @Override
+ public String toString() {
+ return "UserExperienceImprovementSet{" +
+ "userExperienceImprovement=" + userExperienceImprovement +
+ '}';
+ }
+
+ public UserExperienceImprovementEnum getUserExperienceImprovement() {
+ return userExperienceImprovement;
+ }
+
+ public UserExperienceImprovementSet setUserExperienceImprovement(UserExperienceImprovementEnum userExperienceImprovement) {
+ this.userExperienceImprovement = userExperienceImprovement;
+ return this;
+ }
+}
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
new file mode 100644
index 0000000..56a9ab7
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/property/api/AbstractPropertyService.java
@@ -0,0 +1,89 @@
+package com.dji.sdk.cloudapi.property.api;
+
+import com.dji.sdk.annotations.CloudSDKVersion;
+import com.dji.sdk.cloudapi.property.PropertySetEnum;
+import com.dji.sdk.common.BaseModel;
+import com.dji.sdk.common.Common;
+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 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 java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * @author sean
+ * @version 1.7
+ * @date 2023/6/30
+ */
+public abstract class AbstractPropertyService {
+
+ @Resource
+ private PropertySetPublish propertySetPublish;
+
+ /**
+ * Device property set
+ * @param gateway
+ * @param propertyEnum
+ * @param request
+ * @return services_reply
+ */
+ @CloudSDKVersion(exclude = GatewayTypeEnum.RC)
+ public PropertySetReplyResultEnum propertySet(GatewayManager gateway, PropertySetEnum propertyEnum, BaseModel request) {
+ checkCondition(gateway, propertyEnum, request);
+
+ Common.validateModel(request);
+ Field[] fields = request.getClass().getDeclaredFields();
+ if (fields.length > 1 || null == fields[0].getDeclaredAnnotation(Valid.class)) {
+ return propertySetPublish.publish(gateway.getGatewaySn(), request);
+ }
+
+ try {
+ Map map = new HashMap<>();
+ fields[0].setAccessible(true);
+ Object child = fields[0].get(request);
+ for (Field field : ((Class) fields[0].getGenericType()).getDeclaredFields()) {
+ field.setAccessible(true);
+ Object value = field.get(child);
+ if (Objects.isNull(value)) {
+ continue;
+ }
+ map.put(Optional.ofNullable(field.getDeclaredAnnotation(JsonProperty.class))
+ .map(JsonProperty::value).orElse(field.getName()), value);
+ field.setAccessible(false);
+ PropertySetReplyResultEnum result = propertySetPublish.publish(
+ gateway.getGatewaySn(), Map.of(propertyEnum.getProperty(), map));
+ if (PropertySetReplyResultEnum.SUCCESS != result) {
+ return result;
+ }
+ map.clear();
+ }
+ fields[0].setAccessible(false);
+
+ } catch (IllegalAccessException e) {
+ throw new CloudSDKException(e);
+ }
+ return PropertySetReplyResultEnum.SUCCESS;
+ }
+
+ private void checkCondition(GatewayManager gateway, PropertySetEnum propertyEnum, BaseModel request) {
+ if (Objects.isNull(request) || propertyEnum.getClazz() != request.getClass()) {
+ throw new CloudSDKException(CloudSDKErrorEnum.INVALID_PARAMETER);
+ }
+ if (!propertyEnum.getSupportedDevices().contains(gateway.getType())) {
+ throw new CloudSDKException(CloudSDKErrorEnum.DEVICE_TYPE_NOT_SUPPORT);
+ }
+ if (propertyEnum.isDeprecated() || !gateway.getSdkVersion().isSupported(propertyEnum.getSince())) {
+ throw new CloudSDKException(CloudSDKErrorEnum.DEVICE_VERSION_NOT_SUPPORT);
+ }
+ }
+}
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
new file mode 100644
index 0000000..c8ffc0e
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/CredentialsToken.java
@@ -0,0 +1,95 @@
+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;
+
+
+/**
+ * @author sean
+ * @version 0.2
+ * @date 2021/12/7
+ */
+@Schema(description = "The token data of the temporary credential")
+public class CredentialsToken {
+
+ private static final int DELAY = 300;
+
+ @NotNull
+ @Schema(description = "access key id", example = "3POX6W77L1EF4C86L2RE")
+ @JsonProperty("access_key_id")
+ private String accessKeyId;
+
+ @NotNull
+ @Schema(description = "access key secret", example = "9NG2P2yJaUrck576CkdRoRbchKssJiZygi5D93CBsduY")
+ @JsonProperty("access_key_secret")
+ private String accessKeySecret;
+
+ @NotNull
+ @Min(1)
+ @Schema(description = "The valid time of the token, in seconds.", example = "3600")
+ private Long expire;
+
+ @NotNull
+ @JsonProperty("security_token")
+ @Schema(description = "security token", example = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiIzUE9YNlc3N0wxRUY0Qzg2TDJSRSIsImV4cCI6MTY4NjgxOTgyOSwicGFyZW50IjoibWluaW8ifQ.cWJXI90UidrBOTD0gWxKt8PT5Qp_6dEK5wNfJuE6lR9dH6Us7jtSB8vcttRDwPhpCNrAGsv91ydw6NLMyjqAOw")
+ private String securityToken;
+
+ public CredentialsToken(@NotNull String accessKeyId, @NotNull String accessKeySecret, @NotNull String securityToken, @NotNull @Min(1) Long expire) {
+ this.accessKeyId = accessKeyId;
+ this.accessKeySecret = accessKeySecret;
+ this.securityToken = securityToken;
+ this.expire = expire - DELAY;
+ }
+
+ public CredentialsToken() {
+ }
+
+ @Override
+ public String toString() {
+ return "CredentialsToken{" +
+ "accessKeyId='" + accessKeyId + '\'' +
+ ", accessKeySecret='" + accessKeySecret + '\'' +
+ ", expire=" + expire +
+ ", securityToken='" + securityToken + '\'' +
+ '}';
+ }
+
+ public String getAccessKeyId() {
+ return accessKeyId;
+ }
+
+ public CredentialsToken setAccessKeyId(String accessKeyId) {
+ this.accessKeyId = accessKeyId;
+ return this;
+ }
+
+ public String getAccessKeySecret() {
+ return accessKeySecret;
+ }
+
+ public CredentialsToken setAccessKeySecret(String accessKeySecret) {
+ this.accessKeySecret = accessKeySecret;
+ return this;
+ }
+
+ public Long getExpire() {
+ return expire;
+ }
+
+ public CredentialsToken setExpire(Long expire) {
+ this.expire = expire;
+ return this;
+ }
+
+ public String getSecurityToken() {
+ return securityToken;
+ }
+
+ public CredentialsToken setSecurityToken(String securityToken) {
+ this.securityToken = securityToken;
+ return this;
+ }
+}
diff --git a/src/main/java/com/dji/sdk/cloudapi/storage/OssTypeEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/OssTypeEnum.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/storage/OssTypeEnum.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/OssTypeEnum.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/storage/StsCredentialsResponse.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/StsCredentialsResponse.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/storage/StsCredentialsResponse.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/StsCredentialsResponse.java
diff --git a/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
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/storage/api/IHttpStorageService.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/storage/api/IHttpStorageService.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceIconUrl.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceIconUrl.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/tsa/DeviceIconUrl.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceIconUrl.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceTopology.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceTopology.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/tsa/DeviceTopology.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/DeviceTopology.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/tsa/IconUrlEnum.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/IconUrlEnum.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/tsa/IconUrlEnum.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/IconUrlEnum.java
diff --git a/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyDeviceModel.java b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyDeviceModel.java
similarity index 100%
rename from src/main/java/com/dji/sdk/cloudapi/tsa/TopologyDeviceModel.java
rename to cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyDeviceModel.java
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
new file mode 100644
index 0000000..acdf7b2
--- /dev/null
+++ b/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/tsa/TopologyList.java
@@ -0,0 +1,53 @@
+package com.dji.sdk.cloudapi.tsa;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author sean
+ * @version 0.2
+ * @date 2021/12/8
+ */
+@Schema(description = "device topology list")
+public class TopologyList {
+
+ @Schema(description = "drone device topology collection")
+ @NotNull
+ private List<@Valid DeviceTopology> hosts;
+
+ @Schema(description = "gateway device topology collection")
+ @NotNull
+ private List<@Valid DeviceTopology> parents;
+
+ public TopologyList() {
+ }
+
+ @Override
+ public String toString() {
+ return "TopologyList{" +
+ "hosts=" + hosts +
+ ", parents=" + parents +
+ '}';
+ }
+
+ public List getHosts() {
+ return hosts;
+ }
+
+ public TopologyList setHosts(List hosts) {
+ this.hosts = hosts;
+ return this;
+ }
+
+ public List