package com.dji.sdk.mqtt.services; import com.dji.sdk.common.Common; import com.dji.sdk.mqtt.MqttGatewayPublish; import com.dji.sdk.mqtt.TopicConst; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.Objects; import java.util.UUID; /** * @author sean * @version 1.7 * @date 2023/5/24 */ @Component public class ServicesPublish { @Resource private MqttGatewayPublish gatewayPublish; public TopicServicesResponse> publish(TypeReference clazz, String sn, String method) { return this.publish(clazz, sn, method, null); } public TopicServicesResponse> publish(TypeReference clazz, String sn, String method, Object data) { return this.publish(clazz, sn, method, data, MqttGatewayPublish.DEFAULT_RETRY_COUNT); } public TopicServicesResponse> publish(TypeReference clazz, String sn, String method, Object data, int retryCount) { return this.publish(clazz, sn, method, data, retryCount, MqttGatewayPublish.DEFAULT_RETRY_TIMEOUT); } public TopicServicesResponse> publish(TypeReference clazz, String sn, String method, Object data, long timeout) { return this.publish(clazz, sn, method, data, MqttGatewayPublish.DEFAULT_RETRY_COUNT, timeout); } public TopicServicesResponse> publish(TypeReference clazz, String sn, String method, Object data, int retryCount, long timeout) { return this.publish(clazz, sn, method, data, null, retryCount, timeout); } public TopicServicesResponse publish(String sn, String method) { return this.publish(sn, method, null, null); } public TopicServicesResponse publish(String sn, String method, Object data) { return this.publish(sn, method, data, null); } public TopicServicesResponse publish(String sn, String method, Object data, int retryCount) { return this.publish(sn, method, data, null, retryCount); } public TopicServicesResponse publish(String sn, String method, Object data, long timeout) { return this.publish(sn, method, data, null, timeout); } public TopicServicesResponse publish(String sn, String method, Object data, int retryCount, long timeout) { return this.publish(sn, method, data, null, retryCount, timeout); } public TopicServicesResponse publish(String sn, String method, Object data, String bid) { return this.publish(sn, method, data, bid, MqttGatewayPublish.DEFAULT_RETRY_COUNT); } public TopicServicesResponse publish(String sn, String method, Object data, String bid, int retryCount) { return this.publish(sn, method, data, bid, retryCount, MqttGatewayPublish.DEFAULT_RETRY_TIMEOUT); } public TopicServicesResponse publish(String sn, String method, Object data, String bid, long timeout) { return this.publish(sn, method, data, bid, MqttGatewayPublish.DEFAULT_RETRY_COUNT, timeout); } public TopicServicesResponse publish(String sn, String method, Object data, String bid, int retryCount, long timeout) { return (TopicServicesResponse) this.publish(null, sn, method, data, bid, retryCount, timeout); } public TopicServicesResponse> publish( TypeReference clazz, String sn, String method, Object data, String bid, int retryCount, long timeout) { String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + Objects.requireNonNull(sn) + TopicConst.SERVICES_SUF; TopicServicesResponse response = (TopicServicesResponse) gatewayPublish.publishWithReply( ServicesReplyReceiver.class, topic, new TopicServicesRequest<>() .setTid(UUID.randomUUID().toString()) .setBid(bid) .setTimestamp(System.currentTimeMillis()) .setMethod(method) .setData(Objects.requireNonNullElse(data, "")), retryCount, timeout); ServicesReplyReceiver replyReceiver = (ServicesReplyReceiver) response.getData(); ServicesReplyData reply = new ServicesReplyData().setResult(replyReceiver.getResult()); if (Objects.isNull(clazz)) { reply.setOutput((T) Objects.requireNonNullElse( replyReceiver.getOutput(), Objects.requireNonNullElse(replyReceiver.getInfo(), ""))); return response.setData(reply); } // put together in "output" ObjectMapper mapper = Common.getObjectMapper(); if (Objects.nonNull(replyReceiver.getInfo())) { reply.setOutput(mapper.convertValue(replyReceiver.getInfo(), clazz)); } if (Objects.nonNull(replyReceiver.getOutput())) { reply.setOutput(mapper.convertValue(replyReceiver.getOutput(), clazz)); } return response.setData(reply); } }