java吧 关注:1,238,359贴子:12,708,458

大疆无人机对接分享。

只看楼主收藏回复

之前分享的小组件的贴子里有人问了,这里分享一波大疆无人机对接的代码。
基于大疆M350型号,DOCK2 机场对接。
这里先根据大疆无人机的情况,介绍一下物联网的一些概念。
大疆无人机会与机场对频,服务器会与机场进行通信。机场中嵌入网关,而相关的设备会与网关连接,比如,无人机的控制器,无人机的GPS传感器、风力,温度传感器,以及本身机场携带的一系列传感器。
这些传感器都是通过网关作为媒介与服务器进行通信。


IP属地:安徽1楼2024-12-12 09:34回复
    ok,然后我们讲解一下无人机对接的模块的代码:
    1、协议部分的抽象之-协议选择器,
    协议选择器的作用是根据配置的ServerProtocolRouterFunction(服务端协议路由) 去判断数据包(bytebuf)应该是哪种协议。然后添加相应的编解码器。
    协议选择器除了协议的支持,还支持端口与协议的映射支持。
    比如我8080的端口只开放了http协议,而8090的端口支持mqtt协议,那么就不可以通过http协议去访问8090的端口了。



    IP属地:安徽2楼2024-12-12 09:43
    回复
      2、设备端。
      在设备端中抽象了一层DeviceExchange用来接收设备消息/发送指令。
      目前大疆无人机使用的是Mqtt协议,所以只给出了mqtt协议的实现。

      而处理大疆的编解码的主要的部分如下:
      1、DJDeviceUpMessageToDeviceMessageDecoderContainer 大疆的解码器容器。后续会说为什么需要这个容器。
      2、DJMqttPublishMessageInboundHandler 把大疆Mqtt协议发来的Publish消息包进行解码。
      3、MqttMessageToDeviceMessageChannelInboundHandler 对发来的mqtt的消息包进行处理。
      比如,MqttConnectMessage需要判断设备是否合法。即平台是否配置了该设备。
      比如在Connection之后,判断设备类型,从而添加其他的编解码器。
      比如:无人机A跟无人机B用的都是Mqtt协议连接到服务器,在connect的时候,判断无人机A需要通过A解码器解码。同时发送给A设备的消息包是AResponse类型。那就需要为A适配相应的编解码器了。B也是一样的道理。


      IP属地:安徽3楼2024-12-12 09:56
      收起回复
        3、我们对大疆的消息包做了什么?
        跟大疆无人机操控对接的部分其实就是服务器与设备相互的发送publish消息包。。。(PS:不清楚为什么大疆不利用mqtt其他的消息包类型。)
        然后大疆对消息包分为了这几个部分(通过mqttpublish的topic进行区分):
        1、state 属性
        2、status 状态
        3、requests 请求。
        4、property_set 属性被修改。
        5、service 指令
        6、service_reply 指令响应结果。
        7、events 事件
        这里举个例子分别解释一下:
        比如无人机用的是M30 Camera 摄像头,那么在属性中就会获取到该摄像头的信息。
        比如无人机开关机(上下线)就会从status里获取到上下线的状态。
        比如摄像头拍照之后,需要上传到服务器。机场就会发送一个requests去获取上传的oss服务器地址以及临时凭证。
        比如通过遥控器修改了无人机的一些信息。那么机场就会发送一个property_set给服务器,用于状态同步。
        比如服务器需要给机场发送指令去控制无人机,那么就会通过service去发送指令,并且从service_reply中获取到指令执行的结果。
        比如无人机上天之后,无人机就会上报一些避障信息。这些都是发生在无人机周围的事件,通过events上报。
        根据上面的描述,我们可以了解,如果要做个无人机操作平台的话,基本上state,status是需要定时转发给前端,前端发送的指令通过service 主题去下发。service_reply返回给前端,events事件是实时转发给前端的。
        而requests,property_set等前端是可以忽略的。
        这里发一下部分代码:
        ==== 添加相应设备的编解码器 ====

        ==== 通过发送的publish消息包确认消息类型 =====


        IP属地:安徽5楼2024-12-12 10:18
        回复
          单机贴吧?


          IP属地:安徽6楼2024-12-12 10:23
          回复
            那么,哪里能下载代码呢


            IP属地:广东来自Android客户端7楼2024-12-12 12:41
            收起回复
              没有保密协议吗


              IP属地:广东来自Android客户端9楼2024-12-12 14:12
              收起回复
                看不懂


                IP属地:浙江来自Android客户端10楼2024-12-12 15:31
                收起回复
                  蛮好的,分享技术,支持支持。代码全部自己手写实现吗?有没有可调用的jar包


                  IP属地:四川来自iPhone客户端11楼2024-12-12 15:40
                  收起回复
                    大致客户端与设备端的通信逻辑。其实硬件对接没那么麻烦,还是协议,数据包那种。


                    IP属地:安徽12楼2024-12-12 16:01
                    回复
                      知道它要什么数据,要发什么类型请求,端口、其中有没有什么校验、加密流程就差不多可以了,说起来简单,做起来难


                      IP属地:广东来自Android客户端13楼2024-12-12 18:24
                      收起回复
                        挺硬核,先收藏了


                        IP属地:广东来自iPhone客户端14楼2024-12-13 08:09
                        回复
                          你直接搭一个mqtt服务啊,为什么要自己用netty写服务?


                          IP属地:云南来自Android客户端15楼2024-12-13 08:37
                          收起回复
                            确定是m350?能放的进机场二?


                            IP属地:浙江来自Android客户端16楼2024-12-13 13:02
                            收起回复
                              开源吗?


                              IP属地:河北来自Android客户端18楼2024-12-13 23:55
                              收起回复