概述
飞控参数通过osd的topic进行传递,针对 topic:thing/product/{device_sn}/osd 这个主题,pilot2 会定期向主题中推送消息,dji-simple后端程序接收并处理消息。
dji-simple 中集成了SpringIntegration 框架,解耦了消息的处理。需要关注两个 messageChannel :ChannelName.INBOUND 和 ChannelName.INBOUND_OSD。INBOUND首先接收飞控数据,接收到了之后会分发给INBOUND_OSD。
整体处理过程
- 首先mqtt-client会订阅该主题并将消息输出到 INBOUND 频道进行处理。
- InboundMessageRouter 路由在INBOUND频道中有消息的时候将开始工作,工作的内容是将 INBOUND 中的消息转发到 INBOUND_OSD 频道进行处理。
- OsdRouter 路由在 INBOUND_OSD 频道中有消息的时候将开始工作。
- OsdRouter 路由的工作有很多,其中包括:
1:转换二进制消息为java bean
2:过滤器做业务逻辑处理
3:进一步转发到其它的多个频道
核心代码
mqtt-client会订阅该主题并将消息输出到 INBOUND 频道:
InboundMessageRouter 路由将消息转发到INBOUND_OSD 频道
OsdRouter 路由解析消息内容:
总结
大疆上云api通过mqtt-client 接收飞控参数,而后通过Spring框架的 Integration 进行分发。
如果需要自定义处理飞控参数,最简单做法可以在 OsdRouter 中开展,如果为了不破坏原有设计,可以新增一个 BizOsdRouter 来监听ChannelName.INBOUND_OSD。