[toc]
阅读指引
对接方案概述
- 设备对接
- CloudAPI对接,本文仅讨论此对接方式
- 对接飞控平台,如司空2、新空安
对接方案的选择需要根据现场无人机型号和相关负载来确定,例如,若现场无人机不支持Pilot2或者Dock,则无法使用CloudAPI的方式对接。
设备对接
使用MSDK对接,实际就是在遥控器上面安装一个app
上云API(CloudAPI)对接遥控器/机场
简介
低门槛接入自建云平台,无需重复开发APP(安装在遥控器中),让无人机通过DJIPilot2或者大疆机场通过http、mqtt快速接入自建系统中
- DJIPilot2一个软件应用,安装在遥控器上面
- 大疆机场DOCK一个硬件产品,形状是一个盒子,打开后可以将无人机存放在里面。
优势
专注业务
目前对于 DJI 无人机接入第三方云平台,主要是基于 MSDK 开发定制 App,然后自己定义私有上云通信协议连接到云平台中。这样对于核心业务是开发云平台,无人机只是其中一个接入硬件设备的开发者来说,重新基于 MSDK 开发 App 工作量大、成本高,同时还需要花很多精力在无人机功能接口适配上,从而导致整体的方案开发进度较为缓慢。
上云 API 的推出主要期望解决开发者重新造轮子的苦恼。对于没有 App 深度定制需求的开发者,直接可以采用 DJI Pilot 2 来和云平台通信,使开发商可以更加专注于上云业务接口的开发与实现。
物模型
DJI 上云 API 主要是采用业界通用的 MQTT、HTTPS 和 WebSocket 协议,把飞机的能力抽象成物联网设备的物模型,开发者可以很方便的基于这个物模型进行业务开发,同时不用去关心飞机本身复杂的飞行控制问题。
此外,上云 API 内置到 DJI Pilot 2 和大疆机场中,开发者无需重新开发 App,即可把无人机接入云平台。
DJI Pilot 2 中通过内嵌 webview 引擎,开发者可以根据自身业务进行 web 页面定制开发,在相同的 DJI Pilot 2 上允许有业务差异化,从而兼容了多种不同业务的云平台。
从云平台的角度来说,每种 DJI 行业设备都有一份标准的物模型文件,相同的功能接口协议在各个机型上都是一样的,这样对于开发者来说只需实现适配一次就行了,无需随着每次新品机型的发布还要重新适配,间接减少开发者研发工作量,缩短上线的周期。
产品架构
从架构分层上可以看出,上云API是基于大疆行业版无人机的基础上对外提供的接口,整体思路采用与物联网类似的端边云架构分层。此处要特别注意,无人机并不能直接接入第三方云平台,它需要先连接网关设备(遥控器、机场),然后通过遥控器中的DJI Pilot 2或者机场间接上云,DJI Pilot 2、大疆机场在注册登录第三方云平台时,会同时把飞机和负载的能力一起上报。
网关设备与第三方云平台之间的通信链路均采用业界通用的MQTT、HTTPS、Websocket协议,并在这个协议的基础上,抽象出的各个硬件设备的物模型以及业务应用所需的功能集。
第三方云平台泛指网关设备可以直接访问的各个服务端,对于上云API来说,只要通信链路能够访问到第三方云平台服务,即可进行通信,这样对于第三方云平台的环境部署就没有做限制,无论是私有化部署还是公有云部署,只要能访问均可工作。
第三方云平台需要先部署MQTT网关、HTTPS服务、Websocket服务、对象存储等基础服务,打通与网关设备的通信链路,即可进行功能集开发实现,上云API提供的功能集主要分2部分:
一部分是基于DJI Pilot 2的,有飞手操作的场景,该场景下提供的功能集有:地图元素、态势感知、直播、媒体库、航线库、设备管理。
另一部分是主要面向大疆机场的场景,功能集有:固件远程升级、设备异常告警、机场远程控制等等。
当然,有些功能集是两种场景均有重叠的,例如视频直播。
第三方云平台在打通与无人机的业务之后,即可通过自身私有协议,搭建前端web页面、APP应用、小程序等,深入业务场景例如安防、能源、环保、海事等,构建一个完整的场景业务工作流。
产品支持
面向大疆行业无人机,具体支持的机型参见:https://developer.dji.com/doc/cloud-api-tutorial/cn/overview/product-support.html
注意:上云 API 暂不支持 M200 V2 系列、M200 系列、M2E、P4R、M2EA 等老机型
机型支持
设备支持
- 通过 domain、type、sub_type 可以唯一地确定一款设备(可以为飞行器、负载、遥控器等)。
- 通过 type、sub_type、gimbalindex 可以唯一地确定一款负载,它挂载于哪款飞行器的哪个云台口。其中 gimbalindex:
- 0,对于 M300 RTK 机型为视线随机头朝前,机身下方左云台。对于其他机型,对应主云台。
- 1,对于 M300 RTK 机型为视线随机头朝前,机身下方右云台。
- 2,对于 M300 RTK 机型为机身上方云台。
- 7,指 FPV 相机。
- 其他数值为预留枚举值,不必关注。
- domain 表示一个领域,作为一个命名空间,暂时分为: 0,飞机类 1,负载类 2,遥控器类 3,机场类
- name 为云平台、SDK 共用名称。
node_type:节点类型,uav=负载;camera=相机;rc=遥控器;dock=机场
对接飞控平台
对接已有的飞行控制平台,例如大疆官方的司空2平台。
上云API(CloudApi)对接说明
环境准备
代码运行环境
整个上云 API Demo 例程采用前后端分离的设计,前端采用的是 TS+Vue3 框架,后端采用的是 JAVA 语言(必须11及以上的版本,否则后端代码无法编译),Spring Boot 框架。
前端
- TypeScript、HTML、CSS 编程语言。
- Vue3.x 框架、Node.js npm 包管理。
- Ant Design Vue V2 组件库。
- HTTP/Websocket 通信。
- Linux 环境通过 Nginx 部署前端应用服务。
- 高德地图开放 API 使用。
后端
- Java
- Spring Boot
- MQTT
- MySQL
- WebSocket
- Redis
版本要求
- Linux 云服务器,Ubuntu16.04 系统
- Java 版本:openJDK 必须11及以上
- MySQL 版本:8.0.26
- EMQX 版本:4.4.0
- Redis 版本:6.2
- Nginx 版本:1.20.2
- Vue 版本:3.0.5
- Node.js 版本:17.8
Demo示例代码下载
- 前端:https://github.com/dji-sdk/Cloud-API-Demo-Web
- 后端:https://github.com/dji-sdk/DJI-Cloud-API-Demo
- docker:https://developer.dji.com/doc/cloud-api-tutorial/cn/quick-start/environment-prepare-list.html
申请APPKey
在使用上云API的接口之前,需要在大疆开发者网站中先注册成为开发者,注册完成后,即可创建“上云API”应用,以及可以拿到API交互所需的APP ID、APP 秘钥、APP License,后续在JSBridge交互中,需要先校验这三个参数,如果DJI Pilot 2校验License错误,则无法完成DJI Pilot 2上云的后续动作。Pilot 上云前需要完成License证书校验,API JSBridge:platformVerifyLicense。
大疆开发者网站:https://developer.dji.com/cn/
对接流程
简单来说,CloudApi对接分如下几个部分:
- 无人机:需要使用CloudApi产品支持的无人机
- 网关:网关目前可选的是Pilot2App或者大疆机场dock,网关是虚拟的概念,实际作用是:
- 向下给无人机发送云平台的指令和数据等
- 向上给云平台发送无人机的飞行数据,设备数据,实时画面等
- Pilot2:是安装在无人机遥控器中的一个app,即飞手的手持设备中用来控制无人机的软件应用。
- JSBridge:JSBridge的作用是实现Native端和Web端的双向通信。DJI Pilot 2中会内嵌一个Webview控件,为开发者提供一个网页环境,同时通过JSBridge与DJI Pilot 2通信,而Pilot2又可以直接和遥控器硬件和无人机交互。
- 前端:使用web技术开发的一个网页,嵌入到Pilot2中,具体来说Pilot2提供一个webview控件用来渲染网页。遥控器通过这个H5作为载体,完成和云平台的认证、功能的支持和数据的传输
- 后端:使用java技术搭建的一个后端服务,即云平台的核心部件。提供H5的登录认证和提供业务功能服务。扮演的角色包含:身份认证服务、流媒体服务、消息队列生产者/消费者、websocket服务端等
- MQTT:消息队列,用来解耦Pilot2和后端服务
参考视频:https://developer.dji.com/doc/cloud-api-tutorial/cn/quick-start/function-display-video.html
pilot上云
所谓Pilot上云,就是在遥控器中打开Pilot2App,配置云平台访问地址,完成Pilot和云平台的打通。此功能是所有后续业务功能的基础。
配置访问链接
在DJI Pilot 2的主页面云服务栏目中有“开放平台”入口,然后在开放平台页面中输入访问的URL链接即可发起连接。由于首次请求H5页面,并没有Token信息,所以需要服务器端开发一个H5登录页面,DJI Pilot 2在每次配置完访问链接,都先去拉取该页面,然后后续的获取Token动作均由该H5页面完成。
交互时序图
上云
检验Pilot本地存储的Token是否过期,我们划分出以下三种场景:
- 若无Token,将返回H5登陆界面首页。
- 若有Token且Token有效,将返回登录后的主页面。
- 若有Token但Token过期,需要按照如下流程完成。
下云
主动下线,一般为无人机与遥控断连
被动下线,Pilot2App进程关闭,或者点击了”退出平台“
接口说明
License校验
通过使用JSBridge调用 window.djiBridge.platformVerifyLicense(String appId,String appKey,String license) 方法完成,参数说明如下:
- appId: 开发者网站上申请的上云API appId
- appKey: 开发者网站上申请的上云API appKey
- license:开发者网站上申请的上云API license
特别注意:需要先通过认证,JSBridge相关的接口才能被调用
加载上云模块
加载上云模块的过程会发起MQTT登录请求,所以需要服务端预先进行MQTT网关的登录账号密码配置并取消MQTT匿名方式登录。当然,如果对于安全性没有要求的,也可以直接采用默认的匿名登录,从而减少MQTT账号密码的配置。DJI Pilot 2默认是没有加载上云模块的,需要Webview向服务端申请拿到上云模块所需的MQTT相关登录信息,并通过JSBridge加载Pilot2的上云模块和赋值参数。Pilot2的上云模块组件加载之后,会根据获取的MQTT参数,向服务端发起MQTT连接请求,待请求登录成功后,DJI Pilot 2也会通过JSBridge把状态通过回调告知Webview
接口为:window.djiBridge.platformLoadComponent(String name, String param)
platformLoadComponent接口参数说明:
- name: 功能模块
- param: 参数,为json字符
详细的功能模块有:● 设备上云模块● 直播模块● API模块● WS模块● 地图元素模块● 态势感知模块● 媒体模块● 航线模块
不同模块,param格式不同,以上云模块为例,platformLoadComponent 接口参数举例:
name:load上云Component
param:{
host: url, //mqtt地址,示例: tcp://xx.xx.xx.xx:xxx
connectCallback: js_callback, //连接状态回调js接口
username:xxxxx,
password:xxxx
}
注意:由于mqtt连接有基于tcp或者websocket的区别,所以DJI Pilot 2中 mqtt url地址需要使用tcp:// ws://
获取token
DJI Pilot 2会本地存储访问的Token信息,开发者可以通过Webview JSBridge接口去读取DJI Pilot 2存储的Token信息,这样方便开发者进行校验Token是否过期。
接口为 window.djiBridge.apiGetToken()
注意:使用该接口之前,需要先加载“API模块”,加载api模块需要调用window.djiBridge.platformLoadComponent(String name, String param) 接口。
设置工作空间/平台信息
Webview在获取到上云模块推送过来的上线成功的信息之后,可以向后台请求需要往DJI Pilot 2中设置的平台和工作空间名称及描述,这三个字段内容由开发者自己根据实际业务需求进行定义。H5页面获取到平台名称、工作空间名称、工作空间描述之后,可以通过JSBridge接口往DJI Pilot 2设置这些信息,DJI Pilot 2则会把这工作空间名称和工作空间描述字段显示在DJI Pilot 2上云入口处,平台名称显示上webview顶部标签栏中。
涉及的API接口:
- 设置工作空间ID:window.djiBridge.platformSetWorkspaceId(String uuid) 【uuid: 工作空间的标识,该id必须为uuid格式】
- 设置平台信息:window.djiBridge.platformSetInformation(String platformName, String workspaceName, String desc)【platformName: 平台名称;workspaceName: DJI Pilot 2上云入口显示工作空间名称;desc: DJI Pilot 2上云入口显示工作空间描述】
展示效果:
直播功能
直播功能主要是把无人机相机负载和大疆机场的视频码流发给第三方云平台进行播放,用户可以方便的在远程web页面点击直播
支持的直播类型
● Agora声网● RTMP● RTSP● GB28181
直播流程
无人机飞行平台并不直接连接第三方云平台,中间是通过DJI Pilot 2或大疆机场进行转流转发,遥控器和机场与无人机之间的通信还是用DJI私有图传ocusync链路。第三方云平台需要预先部署MQTT网关以及流媒体服务器,DJI推流协议支持 Agora/RTMP/RTSP/GB28181 4种模式,其中MQTT网关主要用来做消息通信,配置信息设置和读取
交互时序图
加载直播模块
● pid:取值为设备的序列号(sn)。在设备上线时会携带设备的sn数据。pid代表设备的序列号,用于唯一标识设备
云平台发起点播
Pilot2端(遥控器端)发起直播
接口说明
加载直播模块
在使用直播功能之前,需要预先在webview中通过JSBridge加载DJI Pilot 2的直播模块,开发者可以考虑在上下线登录阶段直接添加加载直播模块的接口。
接口地址:window.djiBridge.platformLoadComponent(String name, String param)
platformLoadComponent接口参数说明:● name: 功能模块● param: 参数,为json字符
详细的功能模块有:● 设备上云模块● 直播模块● API模块● WS模块● 地图元素模块● 态势感知模块● 媒体模块● 航线模块
不同模块,param格式不同,以加载直播模块为例,platformLoadComponent 接口参数举例:
name:liveshare
param:{
videoPublishType: video-on-demand, //直播方式,服务器点播,手动点播,混合模式
statusCallback: js_callback, // 直播状态回调
}
获取无人机实时数据
设备通过MQTT协议实时向云平台上报“设备属性”信息
接口地址:thing/product/{device_sn}/osd
接口说明:设备端定频向云平台推送的设备属性,频率为0.5HZ,即2秒每次
设备属性:
......
longitude:当前位置经度
latitude:当前位置纬度
attitude_pitch:俯仰轴角度
attitude_roll:横滚轴角度
attitude_roll:横滚轴角度
......
注意:
- 经纬度为84坐标系
- height为椭球高度,椭球高度是某点到参考椭球体表面的垂直距离。这是一种理论上的高度测量,用于地理坐标系统和全球定位系统(GPS)。椭球高度主要用于地理数据的处理和分析,特别是在全球定位系统和地理信息系统(GIS)中,用于将位置数据与参考椭球体对齐。
获取日志
对于使用DJI Pilot 2过程中,难免会出现接口通信异常,功能失效不通等问题,需要拉取Pilot2 的log日志查看进行诊断。
获取日志的途径
- 日志导出,通过官方特定软件连接无人机和遥控器导出日志:
- 无人机日志:将飞机连接到 DJI Assistant2 调参软件,选择日志导出,导出对应架次日志文件,注意调参上标注的时间是飞行架次结束的时间。
- 遥控器日志:将遥控器连接到 DA2 调参软件,选择日志导出,导出对应架次日志文件,注意调参上标注的时间是飞行架次结束的时间
- 通过JSBridge获取日志,DJI Pilot 2提供了JSBridge接口给开发者进行log日志拉取,并通过webview上传到开发者自己的服务器进行分析。
日志解密
DJI Pilot 2的日志是加密的,所以需要开发者通过JSBridge接口提供日志加密的公钥信息,然后拉取到的日志也需要经过解密才能查看。DJI提供了解密日志的 JAR库,开发商运行脚本即可进行日志解密
解密方法:通过PlogDecoder.jar库,把拉取到的Log日志运行脚本进行解密。
解密命令
java -jar PlogDecoder.jar -key "Desktop/rsa_keys/pri.key" -log "/open_platform/log-2022-01-18.log".
//如果没有设置公钥,可以不用 -key 参数
引用
- 大疆开发者网站:https://developer.dji.com/cn/
- 上云API文档:https://developer.dji.com/doc/cloud-api-tutorial/cn/
- 技术支持论坛:https://sdk-forum.dji.net/hc/zh-cn
- JSBridge接口说明:https://developer.dji.com/doc/cloud-api-tutorial/cn/api-reference/pilot-to-cloud/jsbridge.html
- 源码解析:https://sdk-forum.dji.net/hc/zh-cn/articles/22307029557657-4-1-%E8%AE%BE%E5%A4%87%E4%B8%8A%E4%BA%91?auth_token=eyJhbGciOiJIUzI1NiJ9.eyJhY2NvdW50X2lkIjo5Nzg4MTcsInVzZXJfaWQiOjI5MzIwMjA2ODczNDk3LCJ0aWNrZXRfaWQiOjExNDUyNSwiY2hhbm5lbF9pZCI6NjMsInR5cGUiOiJTRUFSQ0giLCJleHAiOjE3MjYyMTUyMDV9.lTmrHQH2nYriDje4DmXZ1q8Li6zx2594RhsHNP5getI&source=search
- OSD数据处理链路剖析:https://sdk-forum.dji.net/hc/zh-cn/community/posts/36356840383897-OSD%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E9%93%BE%E8%B7%AF%E5%89%96%E6%9E%90
- 大疆无人机对接调研:https://sdk-forum.dji.net/hc/zh-cn/community/posts/36344051242393-%E5%A4%A7%E7%96%86%E6%97%A0%E4%BA%BA%E6%9C%BA%E5%AF%B9%E6%8E%A5%E8%B0%83%E7%A0%94