Browse Source

fix: 修复设备未注册前设备推送state导致产生大量日志的问题

pull/41/head
Vincent 1 year ago
parent
commit
9627b13c6f
  1. 38
      src/main/java/com/dji/sdk/mqtt/state/StateRouter.java

38
src/main/java/com/dji/sdk/mqtt/state/StateRouter.java

@ -7,6 +7,8 @@ import com.dji.sdk.exception.CloudSDKErrorEnum;
import com.dji.sdk.exception.CloudSDKException; import com.dji.sdk.exception.CloudSDKException;
import com.dji.sdk.mqtt.ChannelName; import com.dji.sdk.mqtt.ChannelName;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.integration.dsl.IntegrationFlow; import org.springframework.integration.dsl.IntegrationFlow;
@ -16,18 +18,16 @@ import org.springframework.messaging.Message;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.*;
import java.util.Map;
import java.util.Set;
import static com.dji.sdk.mqtt.TopicConst.*; import static com.dji.sdk.mqtt.TopicConst.*;
/** /**
*
* @author sean.zhou * @author sean.zhou
* @date 2021/11/17
* @version 0.1 * @version 0.1
* @date 2021/11/17
*/ */
@Slf4j
@Configuration @Configuration
public class StateRouter { public class StateRouter {
@ -39,24 +39,39 @@ public class StateRouter {
return IntegrationFlows return IntegrationFlows
.from(ChannelName.INBOUND_STATE) .from(ChannelName.INBOUND_STATE)
.transform(Message.class, source -> { .transform(Message.class, source -> {
ObjectMapper objectMapper = Common.getObjectMapper();
try { try {
TopicStateRequest response = Common.getObjectMapper().readValue((byte[]) source.getPayload(), new TypeReference<TopicStateRequest>() {}); TopicStateRequest response = objectMapper.readValue((byte[]) source.getPayload(), new TypeReference<TopicStateRequest>() {
});
String topic = String.valueOf(source.getHeaders().get(MqttHeaders.RECEIVED_TOPIC)); String topic = String.valueOf(source.getHeaders().get(MqttHeaders.RECEIVED_TOPIC));
String from = topic.substring((THING_MODEL_PRE + PRODUCT).length(), topic.indexOf(STATE_SUF)); String from = topic.substring((THING_MODEL_PRE + PRODUCT).length(), topic.indexOf(STATE_SUF));
return response.setFrom(from) //fix: 修复设备未注册前设备推送state导致产生大量日志的问题 witcom@2023.10.08
.setData(Common.getObjectMapper().convertValue(response.getData(), getTypeReference(response.getGateway(), response.getData()))); return getTypeReference(response.getGateway(), response.getData())
} catch (IOException e) { .map(clazz -> response.setFrom(from).setData(objectMapper.convertValue(response.getData(), clazz)))
.orElse(null);
// return response.setFrom(from)
// .setData(objectMapper.convertValue(response.getData(), typeReference));
} /*catch (IOException e) {
//witcom: Which part will throw IOException???
throw new CloudSDKException(e); throw new CloudSDKException(e);
}*/ catch (Exception ex) {
log.warn("[StateRouter]"+ex.getMessage());
return null;
} }
}, null) }, null)
.filter(Objects::nonNull)
.<TopicStateRequest, StateDataKeyEnum>route(response -> StateDataKeyEnum.find(response.getData().getClass()), .<TopicStateRequest, StateDataKeyEnum>route(response -> StateDataKeyEnum.find(response.getData().getClass()),
mapping -> Arrays.stream(StateDataKeyEnum.values()).forEach(key -> mapping.channelMapping(key, key.getChannelName()))) mapping -> Arrays.stream(StateDataKeyEnum.values()).forEach(key -> mapping.channelMapping(key, key.getChannelName())))
.get(); .get();
} }
private Class getTypeReference(String gatewaySn, Object data) { private Optional<Class> getTypeReference(String gatewaySn, Object data) {
Set<String> keys = ((Map<String, Object>) data).keySet(); Set<String> keys = ((Map<String, Object>) data).keySet();
GatewayTypeEnum type = sdkManager.getDeviceSDK(gatewaySn).getType(); //fix: 捕捉数据流发现在注册前设备可能会推送state主题导致产生大量日志 witcom@2023.10.08
//GatewayTypeEnum type = sdkManager.getDeviceSDK(gatewaySn).getType();
return sdkManager.findDeviceSDK(gatewaySn)
.map(gw -> {
GatewayTypeEnum type = gw.getType();
switch (type) { switch (type) {
case RC: case RC:
return RcStateDataKeyEnum.find(keys).getClassType(); return RcStateDataKeyEnum.find(keys).getClassType();
@ -65,5 +80,6 @@ public class StateRouter {
default: default:
throw new CloudSDKException(CloudSDKErrorEnum.WRONG_DATA, "Unexpected value: " + type); throw new CloudSDKException(CloudSDKErrorEnum.WRONG_DATA, "Unexpected value: " + type);
} }
});
} }
} }
Loading…
Cancel
Save