前置说明
根据项目的需要情况,对PSDK的demo进行阅读。
系统版本:ubuntu20.04
gcc:9.3.0
cmake:3.16.3
Payload_SDK_V2.2.0-build.262
初步部署
该版本软件发生了较大的架构调整,因此有必要进行一些简单的梳理。与以往没有变化的是需要在appinfo中修改用户的配置信息,在串口中调整设备节点的名称与波特率。本次一个变化是网口的使用,也需要通过设置节点名称的方式进行访问,对于通过网络的传输也有了变化,不再是以UDP:PROT的形式发送,新的SDK提供了PsdkDataTransmission_SendDataStream()方法,这意味着已经设计好的架构需要重新调整。
另外,编译变得更为好用,在CMakeLists中通过uname -m命令确定系统的架构,从而选择编译器。在交叉编译的时候,我们需要调整这个位置的编译器设置。
关键方法的使用
在设计中,我们首当其冲的仍是数据传输的3个接口,这构建了基本的通信环节,向APP端发送数据提供了命令通道、高速数据通道2个方法;接受APP发送过来的数据提供了1个命令通道。
在app_info.h这个头文件中定义
#define PSDK_USING_DATA_TRANSMISSION
将数据传输模块编译进入程序中,该部分在main()的init中实现。其他的功能模块也通过这样的方式编译进程序当中。在相应的功能模块的socure文件中,定义了一个传输数据的task,以及2个接受数据的回调函数,以供实现相应的基本功能。数据源的更新频率为1s。
1、向APP端发送数据(命令通道)
在周期为1s的task中调用如下方法,其中data的类型为const uint8_t *data:
psdkStat = PsdkDataTransmission_SendDataToMobile(dataToBeSent, sizeof(dataToBeSent));
if (psdkStat != PSDK_RETURN_CODE_OK)
PsdkLogger_UserLogError("send data to mobile error.");
命令通道的带宽为4KB/S
2、接收APP端的数据(命令通道)
构造回调函数如下
static T_PsdkReturnCode ReceiveDataFromMobile(const uint8_t *data, uint16_t len)
{
static char printData[PSDK_DATA_TRANSMISSION_DATA_RECEIVE_FROM_MOBILE_MAX_LEN + 1];
USER_UTIL_UNUSED(len);
strncpy(printData, (const char *) data, len);
printData[len] = '\0';
PsdkLogger_UserLogDebug("receive data from mobile: %s.", printData);
return PSDK_RETURN_CODE_OK;
}
回调函数注册
psdkStat = PsdkDataTransmission_RegReceiveDataFromMobileCallback(ReceiveDataFromMobile);
if (psdkStat != PSDK_RETURN_CODE_OK) {
PsdkLogger_UserLogError("register receive data from mobile error.");
return PSDK_RETURN_CODE_ERR_UNKNOWN;
}
3向APP端发送数据(高速通道)
高速数据通道的带宽为4Mbps,底层逻辑为UDP,仍然为在周期为1的task中调用如下的方法
psdkStat = PsdkDataTransmission_SendDataStream(dataToBeSent, sizeof(dataToBeSent));
if (psdkStat != PSDK_RETURN_CODE_OK)
PsdkLogger_UserLogError("send data to data stream error.");
本文内容为整理思路所写,更为详细的细节可参考
https://developer.dji.com/cn/document/a822024a-3876-4fb7-9082-ec60465c4cc4