这一章节主要是解析机场和无人机的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</
机场与无人机OSD数据上报处理源码解析

最低0.47元/天 解锁文章
7万+

被折叠的 条评论
为什么被折叠?



