SDK 互联互通
概述
“基于 PSDK 开发的负载(负载设备)”、“基于 PSDK 开发的负载(机载应用)”、“基于 MSDK 开发的移动端 App” 彼此可以相互通信。譬如,用户从移动端 App 向飞行器发送控制指令,控制负载设备执行指定的任务。机载应用控制负载设备执行所需的动作,向移动端 App 发送状态信息。负载设备向移动端 App 和机载应用发送视频码流或文件等类型的数据。

图. SDK 互联互通
客户端与服务端
- 客户端:根据指定的通道 ID,发起通道连接的一端。
- 服务端:根据用户的实际需求,创建通道并指定通道类型 ID 的一端。
MSDK 与 PSDK 负载设备通信时,MSDK 仅能作为客户端,PSDK 负载设备则作为服务端。PSDK 负载设备间通信时,PSDK 负载(负载设备)与 PSDK 负载(机载应用)均可作为客户端。
在 M300 RTK/M350 RTK 上使用 SDK 互联互通功能
- 使用对象:3 个云台口(PSDK)、1 个 E-Port 口(PSDK)、遥控器 App(MSDK)
- 使用范围:任意口的 PSDK 与 MSDK 可以建立通讯,任意云台口的 PSDK 与 E-Port 口的 PSDK 可以建立通讯
- 使用约束:暂不支持双控的场景。暂时不支持 PSDK 云台口设备两两通讯。暂时不支持多个云台口的 PSDK 同时与 MSDK 或者 E-Port 口的 PSDK 建立通讯。
在 Matrice 30/30T、Mavic 3 行业系列飞行器上使用 SDK 互联互通功能
- 使用对象:1 个 E-Port 口(PSDK)、遥控器 App(MSDK)
- 使用范围:E-Port 口的 PSDK 与 MSDK 可以建立通讯
- 使用约束:暂不支持双控的场景
使用 SDK 互联互通功能,开发者能够:
- 按需动态创建所需使用的传输通道
- 根据业务需求,创建通道传输指定业务的数据
- 全双工通信,数据收发同步
传输方式
- 可靠传输
为确保基于不同 SDK 开发的机载应用和设备间能够实现可靠传输,DJI SDK 为开发者提供可靠传输的传输方式,在该方式下,DJI SDK 内部采用了丢包重传、超时重发及错误检验等机制,确保不同 SDK 间收发的数据准确可靠。- 数据可靠:以可靠传输的方式传输数据的双方,在发送和接收数据时需使用校验函数检验传输数据的正确性,同时 DJI SDK 使用加密算法加密所传输的数据,确保传输数据的安全性。
- 传输可靠:使用 DJI SDK 的数据传输功能拥有计时器和 ACK 机制,能够在数据传输超时后将重发该数据,确保对端能够正常接收所发送的数据,防止数据意外丢失。此外,以可靠传输的方式传输数据时,发送端将为所发送的数据编号,接收端依靠数据编号能够重排接收到的乱序数据,确保数据传输的可靠性。
- 不可靠传输
以不可靠的传输方式传输数据时,使用不同 SDK 所开发的机载应用和设备间能够以更快的速度传输数据,但无法保证可靠地传输数据。
对象指定
DJI SDK 的互联互通功能,通过设备类型和设备槽位能够准确指定飞行器上所需通信的设备或模块。
设备类型:为方便开发者识别对端的身份和类型,更好地区分数据传输的对象,数据传输功能根据 DJI SDK 提供了 MSDK、PSDK(机载应用) 和 PSDK(负载设备)。
设备槽位:DJI 的飞行器具有强大的扩展能力,开发者能够以多种拓展方式接入三台负载设备、机载应用等,因此可使用不同的槽位区分移动端 App、负载设备和机载应用当前所处的位置。
通道 ID:为方便开发者选择和使用通信通道,区分同一个设备上的不同通道,DJI SDK 为互联互通功能提供了设置通道 ID 的功能,开发者创建通道时可为创建的通道指定 ID。
说明
- 仅基于 PSDK 开发的负载设备和机载应用在使用数据传输功能时,需要为创建的通道指定通道 ID。
- 开发者可以根据实际的使用需求,在创建通道时,为所创建的通道指定通道 ID,最大支持设置 65535 个通道。
通道管理
为方便开发者快速开发出功能强大且可靠的机载应用和设备,无需关注 SDK 互联互通功能底层的工作逻辑,DJI SDK 为互联互通功能赋予了强大的通信管理能力:
- 链路管理:管理链路的接入、关闭、销毁、重连及拥塞管理等
- 数据管理:数据转发、数据读写、流量控制、数据校验、乱序重排及丢包重传等
说明: 为方便开发者使用 SDK 互联互通功能,与现有的接口区分,DJI MSDK 使用 “Pipeline” 表示通道管理功能。
通道带宽
- MSDK 上行(向服务器端发送数据)可靠/非可靠传输最大速率一般为 24-48 Kbps,带宽上限取决于实际的无线链路情况。
- MSDK 下行(从服务器端接收数据)可靠传输最大速率为 16Mbps, 非可靠传输最大速率为 20Mbps。
注意: MSDK 与服务器端(PSDK)的通道带宽受限于无线链路,在远距离情况下,带宽上限会随信号下降而降低,建议以实际测试为准。
- 对于 PSDK 机载应用与 PSDK 负载设备之间的数据传输,可靠传输最大速率为 24Mbps,非可靠传输最大速率为 30Mbps。
MSDK 端功能介绍
使用 MSDK 开发的移动端 App 使用 SDK 互联互通功能时,能够根据用户的使用需求,与指定的通道建立连接,实现数据的接收和发送。无需使用 SDK 互联互通功能时,可以断开已连接的通道。基于 MSDK 开发的移动端 App 仅能作为客户端,通过通道 ID 与指定的通道建立连接。
1. 通道连接
通道连接时,请使用如下接口指定通道传输方式和所需连接的通道 ID 与指定的通道建立连接,并以阻塞回调的方式接收传输的数据。
- iOS
- (void)connect:(uint16_t)Id pipelineType:(DJITransmissionControlType)transferType withCompletion:(void (^_Nullable)(DJIPipeline *_Nullable pipeline, NSError *_Nullable error))completion;
- Java
void connect(int id, @NonNull TransmissionControlType transmissionType, @Nullable CommonCallbacks.CompletionCallback<PipelineError> callback);
2. 数据接收
通道建立连接后,基于 MSDK 开发的移动端 App 使用如下接口接收对端发送数据。
- iOS
- (NSData *)readData:(uint32_t)readLength error:(NSError **)error;
- Java
int readData(byte[] buff, int length);
3. 数据发送
通道建立连接后,基于 MSDK 开发的移动端 App 使用如下接口向对端发送数据。
说明: 为实现良好的数据传输效果,建议每次传输的数据不超过 1KB。
- iOS
- (int32_t)writeData:(NSData *)data error:(NSError **)error;
- Java
int writeData(byte[] data);
4. 关闭通道
通信结束后,请使用如下接口断开已连接的通道。
说明
- 执行通道关闭的操作后,基于 MSDK 开发的移动端 App 将清除本地的缓存信息。
- 通道关闭后,DJI SDK 将自动销毁已创建的通道,释放通道所占用的系统资源。
- iOS
- (void)disconnect:(uint16_t)Id withCompletion:(DJICompletionBlock)completion;
- Java
void disconnect(int id, @Nullable CommonCallbacks.CompletionCallback<PipelineError> callback);
PSDK 端功能介绍
仅使用 Linux 平台开发的负载设备支持开发者基于 PSDK 开发互联互通功能。基于 PSDK 开发的机载应用只可作为服务器端,可根据用户的使用需求创建通道并指定通道 ID,仅当与客户端创建连接后,方可读写数据。
1. SDK 互联互通功能初始化
基于 PSDK 开发的负载设备如需使用 SDK 互联互通功能,需要先初始化 SDK 互联互通模块。
T_DjiReturnCode DjiMopChannel_Init(void);
2. 创建通道
基于 PSDK 开发的负载设备根据用户指定的需求,创建相应的通道类型:可靠传输和不可靠传输。
T_DjiReturnCode DjiMopChannel_Create(T_DjiMopChannelHandle *channelHandle, E_DjiMopChannelTransType transType);
3. 通道连接
基于 PSDK 开发的负载设备作为服务器端,在与对端建立连接时,需指定通道的 ID,供客户端绑定。为方便同时与多个客户端建立连接,PSDK 提供了 outChannelHandle 句柄。
- 通道绑定
基于 PSDK 开发的负载设备通过指定的 ID 与客户端通信。
T_DjiReturnCode DjiMopChannel_Bind(T_DjiMopChannelHandle channelHandle,
uint16_t channelId);
- 接受连接
基于 PSDK 开发的负载设备通过如下接口,接受对端发送的连接请求。
T_DjiReturnCode DjiMopChannel_Accept(T_DjiMopChannelHandle channelHandle,
T_DjiMopChannelHandle *outChannelHandle);
说明: 该接口为阻塞式的接口,当基于 PSDK 的负载设备作为服务器端时,为能够同时与多个客户端建立连接,请在单独的线程中调用该接口。
4. 数据接收
创建通道后,开发者可在该通道上接收对端传输的数据。
T_DjiReturnCode DjiMopChannel_RecvData(T_DjiMopChannelHandle channelHandle,
uint8_t *data,
uint32_t len,
uint32_t *realLen);
5. 数据发送
创建通道后,开发者可在该通道上向对端发送数据。
T_DjiReturnCode DjiMopChannel_SendData(T_DjiMopChannelHandle channelHandle,
uint8_t *data,
uint32_t len,
uint32_t *realLen);
6. 关闭通道
通信结束后,请使用如下接口断开与指定通道的连接,释放通道占用的系统资源。
- 关闭通道
调用如下接口关闭已创建的通道,关闭后,该通道将无法收发数据,但可使与其他通道重新建立连接。
T_DjiReturnCode DjiMopChannel_Close(T_DjiMopChannelHandle channelHandle);
- 销毁通道
调用如下接口销毁指定的通道。
T_DjiReturnCode DjiMopChannel_Destroy(T_DjiMopChannelHandle channelHandle);
MSDK 与 PSDK 互联互通
MSDK 与 PSDK 之间的互联互通应用,MSDK 仅可作为客户端,PSDK 云台口/PSDK E-Port 口作为服务端。两端可根据用户的使用需求对齐自定义通讯的通道 ID 和数据协议,创建通道并指定通道 ID。
PSDK 端(服务端)
1. SDK 互联互通功能初始化
基于 PSDK 开发的负载设备如需使用 SDK 互联互通功能,需要先初始化 SDK 互联互通模块。
T_DjiReturnCode DjiMopChannel_Init(void);
2. 创建通道
基于 PSDK 开发的负载设备根据用户指定的需求,创建相应的通道类型:可靠传输和不可靠传输。
T_DjiReturnCode DjiMopChannel_Create(T_DjiMopChannelHandle *channelHandle, E_DjiMopChannelTransType transType);
3. 通道连接
基于 PSDK 开发的负载设备作为服务器端,在与对端建立连接时,需指定通道的 ID,供客户端绑定。为方便同时与多个客户端建立连接,PSDK 提供了 outChannelHandle 句柄。
- 通道绑定
基于 PSDK 开发的负载设备通过指定的 ID 与客户端通信。
T_DjiReturnCode DjiMopChannel_Bind(T_DjiMopChannelHandle channelHandle,
uint16_t channelId);
- 接受连接
基于 PSDK 开发的负载设备通过如下接口,接受对端发送的连接请求。
T_DjiReturnCode DjiMopChannel_Accept(T_DjiMopChannelHandle channelHandle,
T_DjiMopChannelHandle *outChannelHandle);
说明: 该接口为阻塞式的接口,当基于 PSDK 的负载设备作为服务器端时,为能够同时与多个客户端建立连接,请在单独的线程中调用该接口。
4. 数据接收
创建通道后,开发者可在该通道上接收对端传输的数据。
T_DjiReturnCode DjiMopChannel_RecvData(T_DjiMopChannelHandle channelHandle,
uint8_t *data,
uint32_t len,
uint32_t *realLen);
5. 数据发送
创建通道后,开发者可在该通道上向对端发送数据。
T_DjiReturnCode DjiMopChannel_SendData(T_DjiMopChannelHandle channelHandle,
uint8_t *data,
uint32_t len,
uint32_t *realLen);
MSDK 端(客户端)
参考上述 MSDK 的接口,当 PSDK 调用DjiMopChannel_Accept
接口成功后,MSDK 可以使用connect
接口选择指定的通道 ID 和通道类型进行连接,当连接成功后,可以通过writeData
和readData
传输数据到 PSDK 端或者接受从 PSDK 发送过来的数据。
PSDK 云台口与 PSDK E-Port 口互联互通
基于此场景的 SDK 互联互通应用,PSDK(E-Port 口)与PSDK(云台口)均可作为客户端。两端可根据用户的使用需求对齐自定义通讯的通道 ID 和数据协议,创建通道并指定通道 ID。接下来以 PSDK 云台口作为服务端,PSDK E-Port 口作为客户端来介绍 SDK 互联互通。
PSDK 云台口(服务端)
1. SDK 互联互通功能初始化
基于 PSDK 开发的负载设备如需使用 SDK 互联互通功能,需要先初始化 SDK 互联互通模块。
T_DjiReturnCode DjiMopChannel_Init(void);
2. 创建通道
基于 PSDK 开发的负载设备根据用户指定的需求,创建相应的通道类型:可靠传输和不可靠传输。
T_DjiReturnCode DjiMopChannel_Create(T_DjiMopChannelHandle *channelHandle, E_DjiMopChannelTransType transType);
3. 通道连接
基于 PSDK 开发的负载设备作为服务器端,在与对端建立连接时,需指定通道的 ID,供客户端绑定。为方便同时与多个客户端建立连接,PSDK 提供了 outChannelHandle 句柄。
- 通道绑定
基于 PSDK 开发的负载设备通过指定的 ID 与客户端通信。
T_DjiReturnCode DjiMopChannel_Bind(T_DjiMopChannelHandle channelHandle,
uint16_t channelId);
- 接受连接
基于 PSDK 开发的负载设备通过如下接口,接受对端发送的连接请求。
T_DjiReturnCode DjiMopChannel_Accept(T_DjiMopChannelHandle channelHandle,
T_DjiMopChannelHandle *outChannelHandle);
说明: 该接口为阻塞式的接口,当基于 PSDK 的负载设备作为服务器端时,为能够同时与多个客户端建立连接,请在单独的线程中调用该接口。
4. 数据接收
创建通道后,开发者可在该通道上接收对端传输的数据。
T_DjiReturnCode DjiMopChannel_RecvData(T_DjiMopChannelHandle channelHandle,
uint8_t *data,
uint32_t len,
uint32_t *realLen);
5. 数据发送
创建通道后,开发者可在该通道上向对端发送数据。
T_DjiReturnCode DjiMopChannel_SendData(T_DjiMopChannelHandle channelHandle,
uint8_t *data,
uint32_t len,
uint32_t *realLen);
PSDK E-Port 口(客户端)
1. SDK 互联互通功能初始化
基于 PSDK 开发的负载设备如需使用 SDK 互联互通功能,需要先初始化 SDK 互联互通模块。
T_DjiReturnCode DjiMopChannel_Init(void);
2. 创建通道
基于 PSDK 开发的负载设备根据用户指定的需求,创建相应的通道类型:可靠传输和不可靠传输。
T_DjiReturnCode DjiMopChannel_Create(T_DjiMopChannelHandle *channelHandle, E_DjiMopChannelTransType transType);
3. 通道连接
当 PSDK 作为客户端时,可以通过DjiMopChannel_Connect
接口,指定对应的通道地址和通道 ID 进行连接。
T_DjiReturnCode DjiMopChannel_Connect(T_DjiMopChannelHandle channelHandle, E_DjiChannelAddress channelAddress,
uint16_t channelId);
说明: 该接口为阻塞式的接口,当基于 PSDK 的负载设备作为服务器端时,为能够同时与多个客户端建立连接,请在单独的线程中调用该接口。
4. 数据接收
创建通道后,开发者可在该通道上接收对端传输的数据。
T_DjiReturnCode DjiMopChannel_RecvData(T_DjiMopChannelHandle channelHandle,
uint8_t *data,
uint32_t len,
uint32_t *realLen);
5. 数据发送
创建通道后,开发者可在该通道上向对端发送数据。
T_DjiReturnCode DjiMopChannel_SendData(T_DjiMopChannelHandle channelHandle,
uint8_t *data,
uint32_t len,
uint32_t *realLen);