大疆设备数据透传(Data Transparent Transmission)官方文档写的并不清晰,尤其是onboard到Android透传过程,并且不同Onboard SDK版本变化比较大,本文就自己软硬件环境记录开发过程。
一、软硬件环境:
Onboard 端:
无人机:大疆M100 ;开发板:Manifold ; Onboard SDK 版本:3.2
Mobile端:
Mobile SDK版本:4.4.1;Android Studio版本:3.0;Android 版本;5.0
二、Onboard部分:
Onboard部分参考大疆开发者社区一篇采集pm2.5数据的帖子 http://bbs.dji.com/thread-28914-1-1.html
文章给出了github工程,但是由于是15年的帖子,作者采用的Onboard SDK是比较旧的版本,跟3.2版相比其中的类和函数都有较大变化,我照葫芦画瓢写了一个3.2版本的。
onboard SDK-linux 3.2版本的djiosdk-linux-sample命令有3个选项 -interactive -mobile -programmatic,本文为其加一个 -trans选项,用来表示onboard到android的数据透传。
1、直接修改Onboard-SDK-3.2/sample/linux/Blocking文件夹下的main.cpp
1)在main.cpp中添加激活函数
ActivateData user_act_data;
void activation(CoreAPI* api)
{
char key_buf[65] = "app_key";
char app_bundle_id[32] = "1234567890"; //默认即可,不用修改
user_act_data.ID = app_id;
user_act_data.reserved = app_level; // 写1即可
user_act_data.version = 0x02030A00; //不用修改
user_act_data.encKey = key_buf;
strcpy((char*)user_act_data.iosID, app_bundle_id);
api->activate(&user_act_data,0,0);
}
2)添加数据透传函数
//transport send
void transparent_transission_send(CoreAPI* api,uint8_t* pbuf, uint16_t len)
{
api->send(0 , 0, SET_ACTIVATION, 0xFE, pbuf, len,0,0,1);
}
3)在主函数中添加数据透传选项 -trans
//!trans mode
if (argv[1] && !strcmp(argv[1],"-trans"))
{
std::cout << " transparent_transission begin:\n";
activation(api); //先激活
char buffer[16]="Hello Android"; //向Android Device传递"Hello Android"
while(1)
{
std::cout<<"tans:\n";
transparent_transission_send(api,(uint8_t*)buffer,16);
sleep(10);
}
}
此处为了验证功能,简单的循环发送"Hello Android",也可以从文本或终端等输入流读数据发送。
2、编译安装sdk
mkdir build
cd build
cmake ..
make djiosdk-core
sudo make install djiosdk-core
3,
将onboardsdk/onboardsdk/sample/Linux/Blocking文件夹下的UserConfig.txt复制到build/bin文件夹下,修改UserConfig.txt文件内容保存。
三、Android部分
在OnCreat()方法中添加以下代码,实现接收信息功能。
Aircraft mAircraft = (Aircraft)DJISDKManager.getInstance().getProduct();
FlightController mFlightController = mAircraft.getFlightController();
mFlightController.setOnboardSDKDeviceDataCallback(new FlightController.OnboardSDKDeviceDataCallback() {
@Override
public void onReceive(byte[] data) {
String text = new String(data);
showToast(text); //弹框中字符串
}
});
其中showToast()方法实现如下:
public void showToast(final String msg) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
手机连接上遥控器,在onboard端的build/bin文件夹下运行./djiosdk-linux-sample -tras,在Android端打开app,可以接收到"Hello Android"。