大疆上云API-1.10.0版本-设备位置数据上报处理源码解析

机场与无人机OSD数据上报处理源码解析

这一章节主要是解析机场和无人机的OSD位置数据上报处理流程,废话不多说,上源码!!!!有了上一章节的准备,本地环境请自行搭建。

源码解析(设备上报OSD位置数据处理)

1、OSD数据路由点

处理逻辑如下:

/**
 *
 * @author sean.zhou
 * @date 2021/11/17
 * @version 0.1
 */
@Configuration
public class OsdRouter {
   
   

    /**
     * 配置OSD路由器流程,该流程从指定的输入通道接收消息,进行处理,并根据处理结果将消息路由到不同的通道。
     *
     * @return 配置好的IntegrationFlow实例。
     */
    @Bean
    public IntegrationFlow osdRouterFlow() {
   
   
        return IntegrationFlows
                // 从名为INBOUND_OSD的通道接收消息
                .from(ChannelName.INBOUND_OSD)
                // 对接收到的消息进行转换,提取并修改其负载
                .transform(Message.class, source -> {
   
   
                    try {
   
   
                        // 使用Jackson的ObjectMapper将字节数组负载反序列化为TopicOsdRequest对象
                        TopicOsdRequest response = Common.getObjectMapper().readValue((byte[]) source.getPayload(), new TypeReference<TopicOsdRequest>() {
   
   });
                        // 从消息头中获取MQTT接收到的主题,并解析出特定的部分作为新的来源信息
                        String topic = String.valueOf(source.getHeaders().get(MqttHeaders.RECEIVED_TOPIC));
                        // 修改来源信息,基于预定义的前缀和后缀截取主题中的特定部分
                        return response.setFrom(topic.substring((THING_MODEL_PRE + PRODUCT).length(), topic.indexOf(OSD_SUF)));
                    } catch (IOException e) {
   
   
                        // 如果反序列化失败,则抛出自定义的异常
                        throw new CloudSDKException(e);
                    }
                }, null)
                // 对转换后的TopicOsdRequest对象进行处理
                .<TopicOsdRequest>handle((response, headers) -> {
   
   
                    // 根据响应中的网关ID获取对应的网关管理器
                    GatewayManager gateway = SDKManager.getDeviceSDK(response.getGateway());
                    // 根据网关类型和是否为网关本身确定设备类型枚举
                    OsdDeviceTypeEnum typeEnum = OsdDeviceTypeEnum.find(gateway.getType(), response.getFrom().equals(response.getGateway()));
                    // 处理响应中的数据
                    Map<String, Object> data = (Map<String, Object>) response.getData();
                    // 如果不是网关类型,则处理负载数据,添加额外的索引位置信息
                    if (!typeEnum.isGateway()) {
   
   
                        List payloadData = (List) data.getOrDefault(PayloadModelConst.PAYLOAD_KEY, new ArrayList<>());
                        // 遍历所有索引位置,如果数据中包含这些键,则将其值添加到payloadData中
                        PayloadModelConst.getAllIndexWithPosition().stream().filter(data::containsKey)
                                .map(data::get).forEach(payloadData::add);
                        data.put(PayloadModelConst.PAYLOAD_KEY, payloadData);
                    }
                    // 使用ObjectMapper将处理后的数据转换回相应的类型,并更新响应对象
                    return response.setData(Common.getObjectMapper().convertValue(data, typeEnum.getClassType()));
                })
                // 根据处理后的响应数据类型将消息路由到不同的通道
                .<TopicOsdRequest, OsdDeviceTypeEnum>route(response -> OsdDeviceTypeEnum.find(response.getData().getClass()),
                        mapping -> Arrays.stream(OsdDeviceTypeEnum.values()).forEach(key -> mapping.channelMapping(key, key.getChannelName())))
                .get(); // 完成并返回配置好的IntegrationFlow实例
    }

}

2、数据处理业务逻辑入口

/**
 * @author sean
 * @version 1.7
 * @date 2023/6/30
 */
public class AbstractDeviceService {
   
   

    /**
     * 机场osd数据入口
     * @param request  data
     * @param headers   The headers for a {@link Message}.
     * @return status_reply
     */
    @ServiceActivator</
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值