diff --git a/api/Cloud API Demo.postman_collection.json b/api/Cloud API Demo.postman_collection.json
index 9c96972..445ea40 100644
--- a/api/Cloud API Demo.postman_collection.json
+++ b/api/Cloud API Demo.postman_collection.json
@@ -226,6 +226,34 @@
},
"response": []
},
+ {
+ "name": "Switch Lens",
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{\r\n \"video_id\": \"1581F5BMD228Q00A82XX/39-0-7/zoom-0\",\r\n \"video_type\": \"zoom\"\r\n}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{base_url}}{{manage_version}}/live/streams/switch",
+ "host": [
+ "{{base_url}}{{manage_version}}"
+ ],
+ "path": [
+ "live",
+ "streams",
+ "switch"
+ ]
+ }
+ },
+ "response": []
+ },
{
"name": "Get All Users Info",
"request": {
@@ -703,6 +731,36 @@
}
},
"response": []
+ },
+ {
+ "name": "Set Property",
+ "request": {
+ "method": "PUT",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{\r\n \"night_lights_state\": 0\r\n}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{base_url}}{{manage_version}}/devices/{{workspace_id}}/devices/{{device_sn}}/property",
+ "host": [
+ "{{base_url}}{{manage_version}}"
+ ],
+ "path": [
+ "devices",
+ "{{workspace_id}}",
+ "devices",
+ "{{device_sn}}",
+ "property"
+ ]
+ }
+ },
+ "response": []
}
],
"auth": {
@@ -710,7 +768,7 @@
"apikey": [
{
"key": "value",
- "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE2NjM1NTkxMTAsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiJhMTU1OWU3Yy04ZGQ4LTQ3ODAtYjk1Mi0xMDBjYzQ3OTdkYTIiLCJleHAiOjE2NjM2NDU1MTAsImlhdCI6MTY2MzU1OTExMCwidXNlcm5hbWUiOiJhZG1pblBDIn0.LG1JXZkuTdMaqnXn5WMJvnysNkHHbc4HLe_qZPWz_nM",
+ "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE2Njc0NzcwNTUsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiJhMTU1OWU3Yy04ZGQ4LTQ3ODAtYjk1Mi0xMDBjYzQ3OTdkYTIiLCJleHAiOjE2Njc1NjM0NTUsImlhdCI6MTY2NzQ3NzA1NSwidXNlcm5hbWUiOiJhZG1pblBDIn0.VMJ0ZKn895uvkMDjg2fw3p4trVCUx9ltVFKeP7QmYpo",
"type": "string"
},
{
@@ -1322,6 +1380,37 @@
}
},
"response": []
+ },
+ {
+ "name": "Import KMZ File",
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "formdata",
+ "formdata": [
+ {
+ "key": "file",
+ "type": "file",
+ "src": []
+ }
+ ]
+ },
+ "url": {
+ "raw": "{{base_url}}{{wayline_version}}/workspaces/{{workspace_id}}/waylines/file/upload",
+ "host": [
+ "{{base_url}}{{wayline_version}}"
+ ],
+ "path": [
+ "workspaces",
+ "{{workspace_id}}",
+ "waylines",
+ "file",
+ "upload"
+ ]
+ }
+ },
+ "response": []
}
],
"auth": {
@@ -1329,7 +1418,7 @@
"apikey": [
{
"key": "value",
- "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE2NTU0NDk2MDIsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiJhMTU1OWU3Yy04ZGQ4LTQ3ODAtYjk1Mi0xMDBjYzQ3OTdkYTIiLCJleHAiOjE2NTU1MzYwMDIsImlhdCI6MTY1NTQ0OTYwMiwidXNlcm5hbWUiOiJhZG1pblBDIn0.YZWHJ65Pl_DT2Ampxk0WC01KD_fNTm_rYVUBIHAZD-4",
+ "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE2Njg2NTk4MjYsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiJhMTU1OWU3Yy04ZGQ4LTQ3ODAtYjk1Mi0xMDBjYzQ3OTdkYTIiLCJleHAiOjE2Njg3NDYyMjYsImlhdCI6MTY2ODY1OTgyNiwidXNlcm5hbWUiOiJhZG1pblBDIn0.ykCpfJcReeb3etUzmNMQk1n0vaoDT6dl47J_aHRoTbU",
"type": "string"
},
{
@@ -1370,7 +1459,7 @@
"header": [],
"body": {
"mode": "raw",
- "raw": "{\r\n \"name\": \"\",\r\n \"file_id\": \"\",\r\n \"dock_sn\": \"\",\r\n \"type\": \"\",\r\n \"immediate\": false\r\n}",
+ "raw": "{\r\n \"name\": \"\",\r\n \"file_id\": \"\",\r\n \"dock_sn\": \"\",\r\n \"wayline_type\": 0,\r\n \"task_type\": 0,\r\n \"execute_time\": 123456789123,\r\n \"rth_altitude\": 20,\r\n \"out_of_control_action\": 1\r\n}",
"options": {
"raw": {
"language": "json"
@@ -1421,20 +1510,31 @@
"response": []
},
{
- "name": "Execute Job",
+ "name": "Cancel the jobs",
"request": {
- "method": "POST",
+ "method": "DELETE",
"header": [],
"url": {
- "raw": "{{base_url}}{{wayline_version}}/workspaces/{{workspace_id}}/jobs/{{plan_id}}",
+ "raw": "{{base_url}}{{wayline_version}}/workspaces/{{workspace_id}}/jobs",
"host": [
"{{base_url}}{{wayline_version}}"
],
"path": [
"workspaces",
"{{workspace_id}}",
- "jobs",
- "{{plan_id}}"
+ "jobs"
+ ],
+ "query": [
+ {
+ "key": "job_id",
+ "value": null,
+ "disabled": true
+ },
+ {
+ "key": "job_id",
+ "value": null,
+ "disabled": true
+ }
]
}
},
@@ -1446,7 +1546,7 @@
"apikey": [
{
"key": "value",
- "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE2NTU4OTA5NTQsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiJhMTU1OWU3Yy04ZGQ4LTQ3ODAtYjk1Mi0xMDBjYzQ3OTdkYTIiLCJleHAiOjE2NTU5NzczNTQsImlhdCI6MTY1NTg5MDk1NCwidXNlcm5hbWUiOiJhZG1pblBDIn0.fd0iIzCd71LDUE6ixexUJvo-YqtnSCqRx-790snCyBI",
+ "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE2Njg2NTk4MjYsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiJhMTU1OWU3Yy04ZGQ4LTQ3ODAtYjk1Mi0xMDBjYzQ3OTdkYTIiLCJleHAiOjE2Njg3NDYyMjYsImlhdCI6MTY2ODY1OTgyNiwidXNlcm5hbWUiOiJhZG1pblBDIn0.ykCpfJcReeb3etUzmNMQk1n0vaoDT6dl47J_aHRoTbU",
"type": "string"
},
{
@@ -1506,7 +1606,7 @@
"apikey": [
{
"key": "value",
- "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE2NjE5NTQwMTQsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiJhMTU1OWU3Yy04ZGQ4LTQ3ODAtYjk1Mi0xMDBjYzQ3OTdkYTIiLCJleHAiOjE2NjIwNDA0MTQsImlhdCI6MTY2MTk1NDAxNCwidXNlcm5hbWUiOiJhZG1pblBDIn0.GgCh575h2-HvYvdGZIKBW50r0F6CPACQn4ceAVzJfCU",
+ "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE2Njg0MzE5MzQsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiJhMTU1OWU3Yy04ZGQ4LTQ3ODAtYjk1Mi0xMDBjYzQ3OTdkYTIiLCJleHAiOjE2Njg1MTgzMzQsImlhdCI6MTY2ODQzMTkzNCwidXNlcm5hbWUiOiJhZG1pblBDIn0.QU9xHBeQPHJ2V1vXQcGGWRQ-gYEOWDpaTTXIQga85BU",
"type": "string"
},
{
diff --git a/pom.xml b/pom.xml
index e71dc5f..dd1207c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
com.dji
cloud-api-sample
- 1.1.0
+ 1.3.0
cloud-api-sample
@@ -156,6 +156,30 @@
org.springframework.boot
spring-boot-starter-aop
+
+
+ org.dom4j
+ dom4j
+ 2.1.3
+
+
+
+ jaxen
+ jaxen
+
+
+
+ org.bouncycastle
+ bcpkix-jdk15on
+ 1.69
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
diff --git a/sql/cloud_sample.sql b/sql/cloud_sample.sql
index 993aabd..47d2656 100644
--- a/sql/cloud_sample.sql
+++ b/sql/cloud_sample.sql
@@ -127,7 +127,12 @@ VALUES
(15,1,90742,0,'L1',NULL),
(16,2,56,0,'DJI Smart Controller','Remote control for M300'),
(17,2,119,0,'DJI RC Plus','Remote control for M30'),
- (18,3,1,0,'DJI Dock','');
+ (18,3,1,0,'DJI Dock',''),
+ (19,0,77,0,'Mavic 3E',NULL),
+ (20,0,77,1,'Mavic 3T',NULL),
+ (21,1,66,0,'Mavic 3E Camera',NULL),
+ (22,1,67,0,'Mavic 3T Camera',NULL),
+ (23,2,144,0,'DJI RC Pro','Remote control for Mavic 3E/T');
/*!40000 ALTER TABLE `manage_device_dictionary` ENABLE KEYS */;
UNLOCK TABLES;
@@ -431,9 +436,16 @@ CREATE TABLE `wayline_job` (
`file_id` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'The wayline file used for this job.',
`dock_sn` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'Which dock executes the job.',
`workspace_id` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'Which workspace the current job belongs to.',
- `bid` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'The bid used to execute the job, and the subsequent progress of the job is reported using this bid.',
- `type` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'The type of the job. Available: wayline.',
+ `task_type` int NOT NULL,
+ `wayline_type` int NOT NULL COMMENT 'The template type of the wayline.',
+ `execute_time` bigint NOT NULL,
`username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'The name of the creator.',
+ `end_time` bigint DEFAULT NULL COMMENT 'end time of the job.',
+ `error_code` int DEFAULT NULL,
+ `status` int NOT NULL COMMENT '1: pending; 2: in progress; 3: success; 4: cancel; 5: failed',
+ `rth_altitude` int NOT NULL COMMENT 'return to home altitude. min: 20m; max: 500m',
+ `out_of_control` int NOT NULL COMMENT 'out of control action. 0: go home; 1: hover; 2: landing;',
+ `media_count` int NOT NULL DEFAULT '0',
`create_time` bigint NOT NULL,
`update_time` bigint NOT NULL,
PRIMARY KEY (`id`),
@@ -441,7 +453,6 @@ CREATE TABLE `wayline_job` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='Wayline mission information of the dock.';
-
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
diff --git a/src/main/java/com/dji/sample/common/error/LiveErrorEnum.java b/src/main/java/com/dji/sample/common/error/LiveErrorEnum.java
index 0a65eed..6ba3f95 100644
--- a/src/main/java/com/dji/sample/common/error/LiveErrorEnum.java
+++ b/src/main/java/com/dji/sample/common/error/LiveErrorEnum.java
@@ -67,9 +67,9 @@ public enum LiveErrorEnum implements IErrorInfo {
* @return enumeration object
*/
public static LiveErrorEnum find(int code) {
-
+ final int MOD = 100_000;
for (LiveErrorEnum errorEnum : LiveErrorEnum.class.getEnumConstants()) {
- if (errorEnum.code == code) {
+ if (errorEnum.code % MOD == code % MOD) {
return errorEnum;
}
}
diff --git a/src/main/java/com/dji/sample/common/util/JwtUtil.java b/src/main/java/com/dji/sample/common/util/JwtUtil.java
index 629cea1..918f1d7 100644
--- a/src/main/java/com/dji/sample/common/util/JwtUtil.java
+++ b/src/main/java/com/dji/sample/common/util/JwtUtil.java
@@ -2,7 +2,6 @@ package com.dji.sample.common.util;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
-import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
@@ -85,14 +84,7 @@ public class JwtUtil {
* @throws TokenExpiredException
*/
public static DecodedJWT verifyToken(String token) {
- try {
- JWTVerifier verifier = JWT.require(algorithm).build();
- return verifier.verify(token);
- } catch (Exception e) {
- log.error(e.getMessage());
- e.printStackTrace();
- return null;
- }
+ return JWT.require(algorithm).build().verify(token);
}
/**
@@ -101,7 +93,13 @@ public class JwtUtil {
* @return custom claim
*/
public static Optional parseToken(String token) {
- DecodedJWT jwt = verifyToken(token);
- return jwt == null ? Optional.empty() : Optional.of(new CustomClaim(jwt.getClaims()));
+ DecodedJWT jwt;
+ try {
+ jwt = verifyToken(token);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return Optional.empty();
+ }
+ return Optional.of(new CustomClaim(jwt.getClaims()));
}
}
diff --git a/src/main/java/com/dji/sample/common/util/SpringBeanUtils.java b/src/main/java/com/dji/sample/common/util/SpringBeanUtils.java
new file mode 100644
index 0000000..23e8966
--- /dev/null
+++ b/src/main/java/com/dji/sample/common/util/SpringBeanUtils.java
@@ -0,0 +1,30 @@
+package com.dji.sample.common.util;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author sean
+ * @version 1.3
+ * @date 2022/11/10
+ */
+@Component
+public class SpringBeanUtils implements ApplicationContextAware {
+
+ private static ApplicationContext applicationContext;
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ SpringBeanUtils.applicationContext = applicationContext;
+ }
+
+ public static T getBean(Class clazz) {
+ return applicationContext.getBean(clazz);
+ }
+
+ public static Object getBean(String beanName) {
+ return applicationContext.getBean(beanName);
+ }
+}
diff --git a/src/main/java/com/dji/sample/component/GlobalExceptionHandler.java b/src/main/java/com/dji/sample/component/GlobalExceptionHandler.java
index 1d5eb14..b0a9fbf 100644
--- a/src/main/java/com/dji/sample/component/GlobalExceptionHandler.java
+++ b/src/main/java/com/dji/sample/component/GlobalExceptionHandler.java
@@ -1,6 +1,7 @@
package com.dji.sample.component;
import com.dji.sample.common.model.ResponseResult;
+import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@@ -30,4 +31,10 @@ public class GlobalExceptionHandler {
e.printStackTrace();
return ResponseResult.error("A null object appeared.");
}
+
+ @ExceptionHandler(MethodArgumentNotValidException.class)
+ public ResponseResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
+ return ResponseResult.error(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
+ }
+
}
diff --git a/src/main/java/com/dji/sample/component/mqtt/config/MqttMessageChannel.java b/src/main/java/com/dji/sample/component/mqtt/config/MqttMessageChannel.java
index 4b278a0..51b138d 100644
--- a/src/main/java/com/dji/sample/component/mqtt/config/MqttMessageChannel.java
+++ b/src/main/java/com/dji/sample/component/mqtt/config/MqttMessageChannel.java
@@ -152,4 +152,19 @@ public class MqttMessageChannel {
return new DirectChannel();
}
+ @Bean(name = ChannelName.INBOUND_REQUESTS_FLIGHT_TASK_RESOURCE_GET)
+ public MessageChannel requestsFlightTaskResourceGet() {
+ return new DirectChannel();
+ }
+
+ @Bean(name = ChannelName.INBOUND_PROPERTY_SET_REPLY)
+ public MessageChannel propertySetReply() {
+ return new DirectChannel();
+ }
+
+ @Bean(name = ChannelName.INBOUND_REQUESTS_CONFIG)
+ public MessageChannel requestsConfig() {
+ return new DirectChannel();
+ }
+
}
diff --git a/src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java b/src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java
index 3047ea5..8aa9112 100644
--- a/src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java
+++ b/src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java
@@ -1,6 +1,8 @@
package com.dji.sample.component.mqtt.handler;
+import com.dji.sample.common.util.SpringBeanUtils;
import com.dji.sample.component.mqtt.model.ChannelName;
+import com.dji.sample.component.mqtt.model.DeviceTopicEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.integration.annotation.Router;
import org.springframework.integration.mqtt.support.MqttHeaders;
@@ -10,12 +12,8 @@ import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
import java.util.Collection;
import java.util.Collections;
-import java.util.regex.Pattern;
-
-import static com.dji.sample.component.mqtt.model.TopicConst.*;
/**
*
@@ -27,48 +25,6 @@ import static com.dji.sample.component.mqtt.model.TopicConst.*;
@Slf4j
public class InboundMessageRouter extends AbstractMessageRouter {
- @Resource(name = ChannelName.INBOUND)
- private MessageChannel inboundChannel;
-
- @Resource(name = ChannelName.INBOUND_STATUS)
- private MessageChannel statusChannel;
-
- @Resource(name = ChannelName.INBOUND_STATE)
- private MessageChannel stateChannel;
-
- @Resource(name = ChannelName.DEFAULT)
- private MessageChannel defaultChannel;
-
- @Resource(name = ChannelName.INBOUND_SERVICE_REPLY)
- private MessageChannel serviceReplyChannel;
-
- @Resource(name = ChannelName.INBOUND_OSD)
- private MessageChannel osdChannel;
-
- @Resource(name = ChannelName.INBOUND_REQUESTS)
- private MessageChannel requestsChannel;
-
- @Resource(name = ChannelName.INBOUND_EVENTS)
- private MessageChannel eventsChannel;
-
- private static final Pattern PATTERN_TOPIC_STATUS =
- Pattern.compile("^" + BASIC_PRE + PRODUCT + REGEX_SN + STATUS_SUF + "$");
-
- private static final Pattern PATTERN_TOPIC_STATE =
- Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + STATE_SUF + "$");
-
- private static final Pattern PATTERN_TOPIC_SERVICE_REPLY =
- Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + SERVICES_SUF + _REPLY_SUF + "$");
-
- private static final Pattern PATTERN_TOPIC_OSD =
- Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + OSD_SUF + "$");
-
- private static final Pattern PATTERN_TOPIC_REQUESTS =
- Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + REQUESTS_SUF + "$");
-
- private static final Pattern PATTERN_TOPIC_EVENTS =
- Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + EVENTS_SUF + "$");
-
/**
* All mqtt broker messages will arrive here before distributing them to different channels.
* @param message message from mqtt broker
@@ -81,38 +37,11 @@ public class InboundMessageRouter extends AbstractMessageRouter {
String topic = headers.get(MqttHeaders.RECEIVED_TOPIC).toString();
byte[] payload = (byte[])message.getPayload();
- // osd
- if (PATTERN_TOPIC_OSD.matcher(topic).matches()) {
- return Collections.singleton(osdChannel);
- }
-
log.debug("received topic :{} \t payload :{}", topic, new String(payload));
- // status
- if (PATTERN_TOPIC_STATUS.matcher(topic).matches()) {
- return Collections.singleton(statusChannel);
- }
-
- // state
- if (PATTERN_TOPIC_STATE.matcher(topic).matches()) {
- return Collections.singleton(stateChannel);
- }
-
- // services_reply
- if (PATTERN_TOPIC_SERVICE_REPLY.matcher(topic).matches()) {
- return Collections.singleton(serviceReplyChannel);
- }
-
- // requests
- if (PATTERN_TOPIC_REQUESTS.matcher(topic).matches()) {
- return Collections.singleton(requestsChannel);
- }
-
- // events
- if (PATTERN_TOPIC_EVENTS.matcher(topic).matches()) {
- return Collections.singleton(eventsChannel);
- }
+ DeviceTopicEnum topicEnum = DeviceTopicEnum.find(topic);
+ MessageChannel bean = (MessageChannel) SpringBeanUtils.getBean(topicEnum.getBeanName());
- return Collections.singleton(defaultChannel);
+ return Collections.singleton(bean);
}
}
diff --git a/src/main/java/com/dji/sample/component/mqtt/handler/PropertySetReplyHandler.java b/src/main/java/com/dji/sample/component/mqtt/handler/PropertySetReplyHandler.java
new file mode 100644
index 0000000..9b503eb
--- /dev/null
+++ b/src/main/java/com/dji/sample/component/mqtt/handler/PropertySetReplyHandler.java
@@ -0,0 +1,40 @@
+package com.dji.sample.component.mqtt.handler;
+
+import com.dji.sample.component.mqtt.model.Chan;
+import com.dji.sample.component.mqtt.model.ChannelName;
+import com.dji.sample.component.mqtt.model.CommonTopicReceiver;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.messaging.Message;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * @author sean
+ * @version 1.2
+ * @date 2022/9/9
+ */
+@Component
+public class PropertySetReplyHandler {
+
+ @Autowired
+ private ObjectMapper mapper;
+
+ /**
+ * Handle the reply message from the pilot side to the on-demand video.
+ * @param message reply message
+ * @throws IOException
+ */
+ @ServiceActivator(inputChannel = ChannelName.INBOUND_PROPERTY_SET_REPLY)
+ public void serviceReply(Message> message) throws IOException {
+ byte[] payload = (byte[])message.getPayload();
+
+ CommonTopicReceiver receiver = mapper.readValue(payload, new TypeReference() {});
+ Chan> chan = Chan.getInstance();
+ // Put the message to the chan object.
+ chan.put(receiver);
+ }
+}
diff --git a/src/main/java/com/dji/sample/component/mqtt/handler/RequestsRouter.java b/src/main/java/com/dji/sample/component/mqtt/handler/RequestsRouter.java
index 753bad2..95e0f7d 100644
--- a/src/main/java/com/dji/sample/component/mqtt/handler/RequestsRouter.java
+++ b/src/main/java/com/dji/sample/component/mqtt/handler/RequestsRouter.java
@@ -11,6 +11,7 @@ import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import java.io.IOException;
+import java.util.Arrays;
/**
* @author sean
@@ -37,13 +38,8 @@ public class RequestsRouter {
})
.route(
receiver -> RequestsMethodEnum.find(receiver.getMethod()),
- mapping -> {
- mapping.channelMapping(RequestsMethodEnum.STORAGE_CONFIG_GET, ChannelName.INBOUND_REQUESTS_STORAGE_CONFIG_GET);
- mapping.channelMapping(RequestsMethodEnum.AIRPORT_BIND_STATUS, ChannelName.INBOUND_REQUESTS_AIRPORT_BIND_STATUS);
- mapping.channelMapping(RequestsMethodEnum.AIRPORT_ORGANIZATION_GET, ChannelName.INBOUND_REQUESTS_AIRPORT_ORGANIZATION_GET);
- mapping.channelMapping(RequestsMethodEnum.AIRPORT_ORGANIZATION_BIND, ChannelName.INBOUND_REQUESTS_AIRPORT_ORGANIZATION_BIND);
- mapping.channelMapping(RequestsMethodEnum.UNKNOWN, ChannelName.DEFAULT);
- })
+ mapping -> Arrays.stream(RequestsMethodEnum.values()).forEach(
+ methodEnum -> mapping.channelMapping(methodEnum, methodEnum.getChannelName())))
.get();
}
}
diff --git a/src/main/java/com/dji/sample/component/mqtt/handler/ServicesReplyHandler.java b/src/main/java/com/dji/sample/component/mqtt/handler/ServicesReplyHandler.java
index 1851fd9..c0115ab 100644
--- a/src/main/java/com/dji/sample/component/mqtt/handler/ServicesReplyHandler.java
+++ b/src/main/java/com/dji/sample/component/mqtt/handler/ServicesReplyHandler.java
@@ -1,6 +1,10 @@
package com.dji.sample.component.mqtt.handler;
-import com.dji.sample.component.mqtt.model.*;
+import com.dji.sample.component.mqtt.model.Chan;
+import com.dji.sample.component.mqtt.model.ChannelName;
+import com.dji.sample.component.mqtt.model.CommonTopicReceiver;
+import com.dji.sample.component.mqtt.model.ServiceReply;
+import com.dji.sample.manage.model.enums.LogsFileMethodEnum;
import com.dji.sample.manage.model.receiver.LogsFileUploadList;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -32,7 +36,7 @@ public class ServicesReplyHandler {
byte[] payload = (byte[])message.getPayload();
CommonTopicReceiver receiver = mapper.readValue(payload, new TypeReference() {});
- if (ServicesMethodEnum.FILE_UPLOAD_LIST.getMethod().equals(receiver.getMethod())) {
+ if (LogsFileMethodEnum.FILE_UPLOAD_LIST.getMethod().equals(receiver.getMethod())) {
LogsFileUploadList list = mapper.convertValue(receiver.getData(), new TypeReference() {});
receiver.setData(list);
} else {
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java b/src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java
index 83913c4..cb5a0f0 100644
--- a/src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java
+++ b/src/main/java/com/dji/sample/component/mqtt/model/ChannelName.java
@@ -68,4 +68,10 @@ public class ChannelName {
public static final String INBOUND_EVENTS_OTA_PROGRESS = "inboundEventsOtaProgress";
public static final String INBOUND_EVENTS_FILE_UPLOAD_PROGRESS = "inboundEventsFileUploadProgress";
+
+ public static final String INBOUND_REQUESTS_FLIGHT_TASK_RESOURCE_GET = "inboundEventsFlightTaskResourceGet";
+
+ public static final String INBOUND_PROPERTY_SET_REPLY = "inboundPropertySetReply";
+
+ public static final String INBOUND_REQUESTS_CONFIG = "inboundRequestsConfig";
}
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/CommonTopicReceiver.java b/src/main/java/com/dji/sample/component/mqtt/model/CommonTopicReceiver.java
index 8770bfc..6090338 100644
--- a/src/main/java/com/dji/sample/component/mqtt/model/CommonTopicReceiver.java
+++ b/src/main/java/com/dji/sample/component/mqtt/model/CommonTopicReceiver.java
@@ -31,5 +31,4 @@ public class CommonTopicReceiver {
private Integer needReply;
- private String from;
}
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/ConfigScopeEnum.java b/src/main/java/com/dji/sample/component/mqtt/model/ConfigScopeEnum.java
new file mode 100644
index 0000000..7cd4479
--- /dev/null
+++ b/src/main/java/com/dji/sample/component/mqtt/model/ConfigScopeEnum.java
@@ -0,0 +1,32 @@
+package com.dji.sample.component.mqtt.model;
+
+import com.dji.sample.manage.service.IRequestsConfigService;
+import com.dji.sample.manage.service.impl.ConfigProductServiceImpl;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * @author sean
+ * @version 1.3
+ * @date 2022/11/10
+ */
+@Getter
+public enum ConfigScopeEnum {
+
+ PRODUCT("product", ConfigProductServiceImpl.class);
+
+ String scope;
+
+ Class extends IRequestsConfigService> clazz;
+
+ ConfigScopeEnum(String scope, Class extends IRequestsConfigService> clazz) {
+ this.scope = scope;
+ this.clazz = clazz;
+ }
+
+ public static Optional find(String scope) {
+ return Arrays.stream(ConfigScopeEnum.values()).filter(scopeEnum -> scopeEnum.scope.equals(scope)).findAny();
+ }
+}
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/DeviceTopicEnum.java b/src/main/java/com/dji/sample/component/mqtt/model/DeviceTopicEnum.java
new file mode 100644
index 0000000..00ab2a7
--- /dev/null
+++ b/src/main/java/com/dji/sample/component/mqtt/model/DeviceTopicEnum.java
@@ -0,0 +1,46 @@
+package com.dji.sample.component.mqtt.model;
+
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.regex.Pattern;
+
+import static com.dji.sample.component.mqtt.model.TopicConst.*;
+
+/**
+ * @author sean
+ * @version 1.3
+ * @date 2022/10/28
+ */
+@Getter
+public enum DeviceTopicEnum {
+
+ STATUS(Pattern.compile("^" + BASIC_PRE + PRODUCT + REGEX_SN + STATUS_SUF + "$"), ChannelName.INBOUND_STATUS),
+
+ STATE(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + STATE_SUF + "$"), ChannelName.INBOUND_STATE),
+
+ SERVICE_REPLY(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + SERVICES_SUF + _REPLY_SUF + "$"), ChannelName.INBOUND_SERVICE_REPLY),
+
+ OSD(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + OSD_SUF + "$"), ChannelName.INBOUND_OSD),
+
+ REQUESTS(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + REQUESTS_SUF + "$"), ChannelName.INBOUND_REQUESTS),
+
+ EVENTS(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + EVENTS_SUF + "$"), ChannelName.INBOUND_EVENTS),
+
+ PROPERTY_SET_REPLY(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + PROPERTY_SUF + SET_SUF + _REPLY_SUF + "$"), ChannelName.INBOUND_PROPERTY_SET_REPLY),
+
+ UNKNOWN(null, ChannelName.DEFAULT);
+
+ Pattern pattern;
+
+ String beanName;
+
+ DeviceTopicEnum(Pattern pattern, String beanName) {
+ this.pattern = pattern;
+ this.beanName = beanName;
+ }
+
+ public static DeviceTopicEnum find(String topic) {
+ return Arrays.stream(DeviceTopicEnum.values()).filter(topicEnum -> topicEnum.pattern.matcher(topic).matches()).findAny().orElse(UNKNOWN);
+ }
+}
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/EventsReceiver.java b/src/main/java/com/dji/sample/component/mqtt/model/EventsReceiver.java
index c4d26aa..1597e21 100644
--- a/src/main/java/com/dji/sample/component/mqtt/model/EventsReceiver.java
+++ b/src/main/java/com/dji/sample/component/mqtt/model/EventsReceiver.java
@@ -1,7 +1,10 @@
package com.dji.sample.component.mqtt.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* @author sean
@@ -10,6 +13,9 @@ import lombok.Data;
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class EventsReceiver {
private Integer result;
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/EventsResultStatusEnum.java b/src/main/java/com/dji/sample/component/mqtt/model/EventsResultStatusEnum.java
index 321e2f8..dd37ac6 100644
--- a/src/main/java/com/dji/sample/component/mqtt/model/EventsResultStatusEnum.java
+++ b/src/main/java/com/dji/sample/component/mqtt/model/EventsResultStatusEnum.java
@@ -28,6 +28,8 @@ public enum EventsResultStatusEnum {
TIMEOUT("timeout", true),
+ PARTIALLY_DONE("partially_done", true),
+
UNKNOWN("unknown", false);
String desc;
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/MapKeyConst.java b/src/main/java/com/dji/sample/component/mqtt/model/MapKeyConst.java
index f13ec92..242fd3d 100644
--- a/src/main/java/com/dji/sample/component/mqtt/model/MapKeyConst.java
+++ b/src/main/java/com/dji/sample/component/mqtt/model/MapKeyConst.java
@@ -28,4 +28,9 @@ public final class MapKeyConst {
public static final String LIST = "list";
public static final String MODULE_LIST = "module_list";
+
+ public static final String FLIGHT_ID = "flight_id";
+
+ public static final String FLIGHT_IDS = "flight_ids";
+
}
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java b/src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java
index ddfa599..8d04ceb 100644
--- a/src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java
+++ b/src/main/java/com/dji/sample/component/mqtt/model/RequestsMethodEnum.java
@@ -1,5 +1,7 @@
package com.dji.sample.component.mqtt.model;
+import lombok.Getter;
+
import java.util.Arrays;
/**
@@ -7,26 +9,30 @@ import java.util.Arrays;
* @version 1.0
* @date 2022/5/25
*/
+@Getter
public enum RequestsMethodEnum {
- STORAGE_CONFIG_GET("storage_config_get"),
+ STORAGE_CONFIG_GET("storage_config_get", ChannelName.INBOUND_REQUESTS_STORAGE_CONFIG_GET),
+
+ AIRPORT_BIND_STATUS("airport_bind_status", ChannelName.INBOUND_REQUESTS_AIRPORT_BIND_STATUS),
+
+ AIRPORT_ORGANIZATION_BIND("airport_organization_bind", ChannelName.INBOUND_REQUESTS_AIRPORT_ORGANIZATION_BIND),
- AIRPORT_BIND_STATUS("airport_bind_status"),
+ AIRPORT_ORGANIZATION_GET("airport_organization_get", ChannelName.INBOUND_REQUESTS_AIRPORT_ORGANIZATION_GET),
- AIRPORT_ORGANIZATION_BIND("airport_organization_bind"),
+ FLIGHT_TASK_RESOURCE_GET("flighttask_resource_get", ChannelName.INBOUND_REQUESTS_FLIGHT_TASK_RESOURCE_GET),
- AIRPORT_ORGANIZATION_GET("airport_organization_get"),
+ CONFIG("config", ChannelName.INBOUND_REQUESTS_CONFIG),
- UNKNOWN("Unknown");
+ UNKNOWN("Unknown", ChannelName.DEFAULT);
private String method;
- RequestsMethodEnum(String method) {
- this.method = method;
- }
+ private String channelName;
- public String getMethod() {
- return method;
+ RequestsMethodEnum(String method, String channelName) {
+ this.method = method;
+ this.channelName = channelName;
}
public static RequestsMethodEnum find(String method) {
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/ServicesMethodEnum.java b/src/main/java/com/dji/sample/component/mqtt/model/ServicesMethodEnum.java
deleted file mode 100644
index 40ca0fc..0000000
--- a/src/main/java/com/dji/sample/component/mqtt/model/ServicesMethodEnum.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.dji.sample.component.mqtt.model;
-
-import java.util.Arrays;
-
-/**
- * @author sean.zhou
- * @date 2021/11/22
- * @version 0.1
- */
-public enum ServicesMethodEnum {
-
- LIVE_START_PUSH("live_start_push", false),
-
- LIVE_STOP_PUSH("live_stop_push", false),
-
- LIVE_SET_QUALITY("live_set_quality", false),
-
- FLIGHTTASK_CREATE("flighttask_create", false),
-
- DEBUG_MODE_OPEN("debug_mode_open", false),
-
- DEBUG_MODE_CLOSE("debug_mode_close", false),
-
- SUPPLEMENT_LIGHT_OPEN("supplement_light_open", false),
-
- SUPPLEMENT_LIGHT_CLOSE("supplement_light_close", false),
-
- RETURN_HOME("return_home", false),
-
- SDR_WORKMODE_SWITCH("sdr_workmode_switch", false),
-
- DEVICE_REBOOT("device_reboot", true),
-
- DRONE_OPEN("drone_open", true),
-
- DRONE_CLOSE("drone_close", true),
-
- DEVICE_CHECK("device_check", true),
-
- DRONE_FORMAT("drone_format", true),
-
- DEVICE_FORMAT("device_format", true),
-
- COVER_OPEN("cover_open", true),
-
- COVER_CLOSE("cover_close", true),
-
- PUTTER_OPEN("putter_open", true),
-
- PUTTER_CLOSE("putter_close", true),
-
- CHARGE_OPEN("charge_open", true),
-
- CHARGE_CLOSE("charge_close", true),
-
- OTA_CREATE("ota_create", true),
-
- FILE_UPLOAD_LIST("fileupload_list", false),
-
- FILE_UPLOAD_START("fileupload_start", true),
-
- FILE_UPLOAD_UPDATE("fileupload_update", false),
-
- UNKNOWN("unknown", false);
-
- private String method;
-
- private Boolean progress;
-
- ServicesMethodEnum(String method, Boolean progress) {
- this.method = method;
- this.progress = progress;
- }
-
- public static ServicesMethodEnum find(String method) {
- return Arrays.stream(ServicesMethodEnum.values())
- .filter(methodEnum -> methodEnum.method.equals(method))
- .findAny()
- .orElse(UNKNOWN);
- }
-
- public String getMethod() {
- return method;
- }
-
- public Boolean getProgress() {
- return progress;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/SetReply.java b/src/main/java/com/dji/sample/component/mqtt/model/SetReply.java
new file mode 100644
index 0000000..2c7f453
--- /dev/null
+++ b/src/main/java/com/dji/sample/component/mqtt/model/SetReply.java
@@ -0,0 +1,14 @@
+package com.dji.sample.component.mqtt.model;
+
+import lombok.Data;
+
+/**
+ * @author sean
+ * @version 1.3
+ * @date 2022/10/28
+ */
+@Data
+public class SetReply {
+
+ private Integer result;
+}
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/SetReplyStatusResultEnum.java b/src/main/java/com/dji/sample/component/mqtt/model/SetReplyStatusResultEnum.java
new file mode 100644
index 0000000..5a127e4
--- /dev/null
+++ b/src/main/java/com/dji/sample/component/mqtt/model/SetReplyStatusResultEnum.java
@@ -0,0 +1,30 @@
+package com.dji.sample.component.mqtt.model;
+
+import lombok.Getter;
+
+/**
+ * @author sean
+ * @version 1.3
+ * @date 2022/10/28
+ */
+@Getter
+public enum SetReplyStatusResultEnum {
+
+ SUCCESS(0, "success"),
+
+ FAILED(1, "failed"),
+
+ TIMEOUT(2, "timeout"),
+
+ UNKNOWN(-1, "unknown");
+
+ int val;
+
+ String desc;
+
+ SetReplyStatusResultEnum(int val, String desc) {
+ this.val = val;
+ this.desc = desc;
+ }
+
+}
diff --git a/src/main/java/com/dji/sample/component/mqtt/model/TopicConst.java b/src/main/java/com/dji/sample/component/mqtt/model/TopicConst.java
index dc9df7c..215995a 100644
--- a/src/main/java/com/dji/sample/component/mqtt/model/TopicConst.java
+++ b/src/main/java/com/dji/sample/component/mqtt/model/TopicConst.java
@@ -28,6 +28,10 @@ public class TopicConst {
public static final String EVENTS_SUF = "/events";
+ public static final String PROPERTY_SUF = "/property";
+
+ public static final String SET_SUF = "/set";
+
public static final String REGEX_SN = "[A-Za-z0-9]+";
}
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/component/mqtt/service/IMessageSenderService.java b/src/main/java/com/dji/sample/component/mqtt/service/IMessageSenderService.java
index 15079a6..40f7f18 100644
--- a/src/main/java/com/dji/sample/component/mqtt/service/IMessageSenderService.java
+++ b/src/main/java/com/dji/sample/component/mqtt/service/IMessageSenderService.java
@@ -3,8 +3,6 @@ package com.dji.sample.component.mqtt.service;
import com.dji.sample.component.mqtt.model.CommonTopicResponse;
import com.dji.sample.component.mqtt.model.ServiceReply;
-import java.util.Optional;
-
/**
* @author sean.zhou
* @version 0.1
@@ -33,7 +31,7 @@ public interface IMessageSenderService {
* @param response notification of whether the start is successful.
* @return
*/
- Optional publishWithReply(String topic, CommonTopicResponse response);
+ ServiceReply publishWithReply(String topic, CommonTopicResponse response);
/**
* Send live streaming start message and receive a response at the same time.
@@ -44,5 +42,5 @@ public interface IMessageSenderService {
* @param
* @return
*/
- Optional publishWithReply(Class clazz, String topic, CommonTopicResponse response, int retryTime);
+ T publishWithReply(Class clazz, String topic, CommonTopicResponse response, int retryTime);
}
diff --git a/src/main/java/com/dji/sample/component/mqtt/service/impl/MessageSenderServiceImpl.java b/src/main/java/com/dji/sample/component/mqtt/service/impl/MessageSenderServiceImpl.java
index 10bb7e2..89e5093 100644
--- a/src/main/java/com/dji/sample/component/mqtt/service/impl/MessageSenderServiceImpl.java
+++ b/src/main/java/com/dji/sample/component/mqtt/service/impl/MessageSenderServiceImpl.java
@@ -12,7 +12,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -49,28 +48,28 @@ public class MessageSenderServiceImpl implements IMessageSenderService {
}
}
- public Optional publishWithReply(String topic, CommonTopicResponse response) {
+ public ServiceReply publishWithReply(String topic, CommonTopicResponse response) {
return this.publishWithReply(ServiceReply.class, topic, response, 2);
}
- public Optional publishWithReply(Class clazz, String topic, CommonTopicResponse response, int retryTime) {
+ public T publishWithReply(Class clazz, String topic, CommonTopicResponse response, int retryTime) {
AtomicInteger time = new AtomicInteger(0);
// Retry three times
- while (time.getAndIncrement() < retryTime) {
+ while (time.getAndIncrement() <= retryTime) {
this.publish(topic, response);
Chan> chan = Chan.getInstance();
// If the message is not received in 0.5 seconds then resend it again.
- CommonTopicReceiver receiver = chan.get(response.getMethod());
+ CommonTopicReceiver receiver = chan.get(response.getTid());
if (receiver == null) {
continue;
}
// Need to match tid and bid.
if (receiver.getTid().equals(response.getTid()) &&
receiver.getBid().equals(response.getBid())) {
- return Optional.ofNullable(receiver.getData());
+ return receiver.getData();
}
}
- return Optional.empty();
+ throw new RuntimeException("No message reply received.");
}
}
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/component/oss/service/IOssService.java b/src/main/java/com/dji/sample/component/oss/service/IOssService.java
index 53746ef..f8441dd 100644
--- a/src/main/java/com/dji/sample/component/oss/service/IOssService.java
+++ b/src/main/java/com/dji/sample/component/oss/service/IOssService.java
@@ -2,6 +2,7 @@ package com.dji.sample.component.oss.service;
import com.dji.sample.media.model.CredentialsDTO;
+import java.io.InputStream;
import java.net.URL;
/**
@@ -41,5 +42,7 @@ public interface IOssService {
* @param objectKey
* @return
*/
- byte[] getObject(String bucket, String objectKey);
+ InputStream getObject(String bucket, String objectKey);
+
+ void putObject(String bucket, String objectKey, InputStream input);
}
diff --git a/src/main/java/com/dji/sample/component/oss/service/impl/AliyunOssServiceImpl.java b/src/main/java/com/dji/sample/component/oss/service/impl/AliyunOssServiceImpl.java
index d709b07..d855261 100644
--- a/src/main/java/com/dji/sample/component/oss/service/impl/AliyunOssServiceImpl.java
+++ b/src/main/java/com/dji/sample/component/oss/service/impl/AliyunOssServiceImpl.java
@@ -4,6 +4,9 @@ import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.ObjectMetadata;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.aliyun.oss.model.PutObjectResult;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
@@ -93,18 +96,30 @@ public class AliyunOssServiceImpl implements IOssService {
}
@Override
- public byte[] getObject(String bucket, String objectKey) {
+ public InputStream getObject(String bucket, String objectKey) {
OSS ossClient = this.createClient();
OSSObject object = ossClient.getObject(bucket, objectKey);
- try (InputStream stream = object.getObjectContent()) {
- return stream.readAllBytes();
+ try (InputStream input = object.getObjectContent()) {
+ return input;
} catch (IOException e) {
e.printStackTrace();
} finally {
ossClient.shutdown();
}
- return new byte[0];
+ return InputStream.nullInputStream();
+ }
+
+ @Override
+ public void putObject(String bucket, String objectKey, InputStream input) {
+ OSS ossClient = this.createClient();
+ if (ossClient.doesObjectExist(bucket, objectKey)) {
+ ossClient.shutdown();
+ throw new RuntimeException("The filename already exists.");
+ }
+ PutObjectResult objectResult = ossClient.putObject(new PutObjectRequest(bucket, objectKey, input, new ObjectMetadata()));
+ ossClient.shutdown();
+ log.info("Upload File: {}", objectResult.getETag());
}
private OSS createClient() {
diff --git a/src/main/java/com/dji/sample/component/oss/service/impl/AmazonS3ServiceImpl.java b/src/main/java/com/dji/sample/component/oss/service/impl/AmazonS3ServiceImpl.java
index f2bcdc5..b9cdfd3 100644
--- a/src/main/java/com/dji/sample/component/oss/service/impl/AmazonS3ServiceImpl.java
+++ b/src/main/java/com/dji/sample/component/oss/service/impl/AmazonS3ServiceImpl.java
@@ -5,9 +5,7 @@ import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
-import com.amazonaws.services.s3.model.BucketCrossOriginConfiguration;
-import com.amazonaws.services.s3.model.CORSRule;
-import com.amazonaws.services.s3.model.S3Object;
+import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.securitytoken.AWSSecurityTokenService;
import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder;
import com.amazonaws.services.securitytoken.model.AssumeRoleRequest;
@@ -18,6 +16,7 @@ import com.dji.sample.component.oss.model.OssConfiguration;
import com.dji.sample.component.oss.model.enums.OssTypeEnum;
import com.dji.sample.component.oss.service.IOssService;
import com.dji.sample.media.model.CredentialsDTO;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -34,6 +33,7 @@ import java.util.List;
* @version 1.0
* @date 2022/4/27
*/
+@Slf4j
@Service
public class AmazonS3ServiceImpl implements IOssService {
@@ -83,18 +83,29 @@ public class AmazonS3ServiceImpl implements IOssService {
return true;
}
- public byte[] getObject(String bucket, String objectKey) {
+ public InputStream getObject(String bucket, String objectKey) {
AmazonS3 client = this.createClient();
S3Object object = client.getObject(bucket, objectKey);
-
- try (InputStream stream = object.getObjectContent().getDelegateStream()) {
- return stream.readAllBytes();
+ try (InputStream input = object.getObjectContent().getDelegateStream()) {
+ return input;
} catch (IOException e) {
e.printStackTrace();
} finally {
client.shutdown();
}
- return new byte[0];
+ return InputStream.nullInputStream();
+ }
+
+ @Override
+ public void putObject(String bucket, String objectKey, InputStream input) {
+ AmazonS3 client = this.createClient();
+ if (client.doesObjectExist(bucket, objectKey)) {
+ client.shutdown();
+ throw new RuntimeException("The filename already exists.");
+ }
+ PutObjectResult objectResult = client.putObject(new PutObjectRequest(bucket, objectKey, input, new ObjectMetadata()));
+ client.shutdown();
+ log.info("Upload File: {}", objectResult.toString());
}
private AmazonS3 createClient() {
diff --git a/src/main/java/com/dji/sample/component/oss/service/impl/MinIOServiceImpl.java b/src/main/java/com/dji/sample/component/oss/service/impl/MinIOServiceImpl.java
index 009a1fb..b162751 100644
--- a/src/main/java/com/dji/sample/component/oss/service/impl/MinIOServiceImpl.java
+++ b/src/main/java/com/dji/sample/component/oss/service/impl/MinIOServiceImpl.java
@@ -4,10 +4,7 @@ import com.dji.sample.component.oss.model.OssConfiguration;
import com.dji.sample.component.oss.model.enums.OssTypeEnum;
import com.dji.sample.component.oss.service.IOssService;
import com.dji.sample.media.model.CredentialsDTO;
-import io.minio.GetObjectArgs;
-import io.minio.GetPresignedObjectUrlArgs;
-import io.minio.MinioClient;
-import io.minio.RemoveObjectArgs;
+import io.minio.*;
import io.minio.credentials.AssumeRoleProvider;
import io.minio.errors.*;
import io.minio.http.Method;
@@ -15,11 +12,13 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
+import java.util.Objects;
/**
* @author sean
@@ -30,6 +29,8 @@ import java.security.NoSuchAlgorithmException;
@Slf4j
public class MinIOServiceImpl implements IOssService {
+ private MinioClient client;
+
@Autowired
private OssConfiguration configuration;
@@ -87,21 +88,44 @@ public class MinIOServiceImpl implements IOssService {
}
@Override
- public byte[] getObject(String bucket, String objectKey) {
- MinioClient client = this.createClient();
- try (InputStream objectResponse = client.getObject(GetObjectArgs.builder().bucket(bucket).object(objectKey).build())) {
- return objectResponse.readAllBytes();
- } catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException e) {
+ public InputStream getObject(String bucket, String objectKey) {
+ try {
+ GetObjectResponse object = this.createClient().getObject(GetObjectArgs.builder().bucket(bucket).object(objectKey).build());
+ return new ByteArrayInputStream(object.readAllBytes());
+ } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) {
e.printStackTrace();
}
- return new byte[0];
+ return InputStream.nullInputStream();
+ }
+
+ @Override
+ public void putObject(String bucket, String objectKey, InputStream input) {
+ try {
+ MinioClient client = this.createClient();
+ client.statObject(StatObjectArgs.builder().bucket(bucket).object(objectKey).build());
+ throw new RuntimeException("The filename already exists.");
+ } catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException e) {
+ log.info("The file does not exist, start uploading.");
+ try {
+ ObjectWriteResponse response = client.putObject(
+ PutObjectArgs.builder().bucket(bucket).object(objectKey).stream(input, input.available(), 0).build());
+ log.info("Upload File: {}", response.etag());
+ } catch (MinioException | IOException | InvalidKeyException | NoSuchAlgorithmException ex) {
+ log.error("Failed to upload File {}.", objectKey);
+ ex.printStackTrace();
+ }
+ }
}
private MinioClient createClient() {
- return MinioClient.builder()
+ if (Objects.nonNull(this.client)) {
+ return this.client;
+ }
+ this.client = MinioClient.builder()
.endpoint(configuration.getEndpoint())
.credentials(configuration.getAccessKey(), configuration.getSecretKey())
.region(configuration.getRegion())
.build();
+ return this.client;
}
}
diff --git a/src/main/java/com/dji/sample/component/oss/service/impl/OssServiceContext.java b/src/main/java/com/dji/sample/component/oss/service/impl/OssServiceContext.java
index 9ac8059..e131889 100644
--- a/src/main/java/com/dji/sample/component/oss/service/impl/OssServiceContext.java
+++ b/src/main/java/com/dji/sample/component/oss/service/impl/OssServiceContext.java
@@ -7,6 +7,7 @@ import com.dji.sample.media.model.CredentialsDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
@@ -52,7 +53,11 @@ public class OssServiceContext {
return this.ossService.deleteObject(bucket, objectKey);
}
- public byte[] getObject(String bucket, String objectKey) {
+ public InputStream getObject(String bucket, String objectKey) {
return this.ossService.getObject(bucket, objectKey);
}
+
+ public void putObject(String bucket, String objectKey, InputStream stream) {
+ this.ossService.putObject(bucket, objectKey, stream);
+ }
}
diff --git a/src/main/java/com/dji/sample/component/redis/RedisConst.java b/src/main/java/com/dji/sample/component/redis/RedisConst.java
index 718ebee..1fce89d 100644
--- a/src/main/java/com/dji/sample/component/redis/RedisConst.java
+++ b/src/main/java/com/dji/sample/component/redis/RedisConst.java
@@ -34,4 +34,8 @@ public final class RedisConst {
public static final String STATE_PAYLOAD_PREFIX = "payload" + DELIMITER;
public static final String LOGS_FILE_PREFIX = "logs_file" + DELIMITER;
+
+ public static final String WAYLINE_JOB = "wayline_job";
+
+ public static final String OSD_PREFIX = "osd" + DELIMITER;
}
diff --git a/src/main/java/com/dji/sample/component/redis/RedisOpsUtils.java b/src/main/java/com/dji/sample/component/redis/RedisOpsUtils.java
index f5b1066..5e329c9 100644
--- a/src/main/java/com/dji/sample/component/redis/RedisOpsUtils.java
+++ b/src/main/java/com/dji/sample/component/redis/RedisOpsUtils.java
@@ -3,6 +3,7 @@ package com.dji.sample.component.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Set;
@@ -184,4 +185,57 @@ public class RedisOpsUtils {
public Long listLen(String key) {
return redisTemplate.opsForList().size(key);
}
+
+ /**
+ * ZADD
+ * @param key
+ * @param value
+ * @param score
+ */
+ public Boolean zAdd(String key, Object value, double score) {
+ return redisTemplate.opsForZSet().add(key, value, score);
+ }
+
+ /**
+ * ZREM
+ * @param key
+ * @param value
+ */
+ public Boolean zRemove(String key, Object... value) {
+ return redisTemplate.opsForZSet().remove(key, value) > 0;
+ }
+ /**
+ * ZRANGE
+ * @param key
+ * @param start
+ * @param end
+ * @return
+ */
+ public Set