用管道束(Pipeline)实现负载与MSDK的通讯的问题
已完成版本:MSDK V4我用管道束进行与负载的通讯,下面是涉及到的代码:
payloadpipeline=payload.getPipelines();
if (payloadpipeline!=null){
payloadpipeline.connect(12, TransmissionControlType.STABLE, new CommonCallbacks.CompletionCallback<PipelineError>() {
@Override
public void onResult(PipelineError pipelineError) {
ToastUtils.setResultToToast(pipelineError == null ? "Send data successfully" : pipelineError.getDescription());
}
});
}
payloadpipeline=payload.getPipelines();
if (payloadpipeline!=null){
payloadpipeline.connect(12, TransmissionControlType.STABLE, new CommonCallbacks.CompletionCallback<PipelineError>() {
@Override
public void onResult(PipelineError pipelineError) {
ToastUtils.setResultToToast(pipelineError == null ? "Send data successfully" : pipelineError.getDescription());
}
});
}
经过测试之后,可以接收到指令。
但是我现在需要实现的功能是时时检测管道里面是否有信息,有的话我就立刻读取。
我看了官方的APP,有那个状态实时检测的,这个是写在哪里?我把管道的实时读取和这个无人机状态的实时检测写在一起
这样实现的功能就是不再需要我认为的点击某个按钮它才会去管道读数据,而是有时间就立刻读出来。
-
你用得是什么版本的MSDK?如果是MSDK v4的话看下这个Demo。 Link:https://github.com/DJI-Mobile-SDK-Tutorials/Android-MOPDemo -
管道束有时间超时的问题吗?我每次一获取管道束,它告诉我获取管道束成功,然后APP就卡死了。
提示消息分别是“获取管道束成功” 然后就会冒出来一个“Execution of this process has timed out”
然后APP就无响应了。
下面是代码:
payload=DJISampleApplication.getAircraftInstance().getPayload();
if(payload!=null){
ToastUtils.showToast("payload!=null");
payloadpipeline = payload.getPipelines();
if (payloadpipeline!=null){
payloadpipeline.connect(12, TransmissionControlType.STABLE, new CommonCallbacks.CompletionCallback<PipelineError>() {
@Override
public void onResult(PipelineError pipelineError) {
ToastUtils.setResultToToast(pipelineError == null ? "已经获取到管道束" : pipelineError.getDescription());
}
});
Pipeline p=payloadpipeline.getPipelines().get(12);
if(p!=null){
ToastUtils.showToast("p!=null");
byte[] buff=new byte[2048];
if(p.readData(buff,0,1024)>0){
ToastUtils.showToast("receiving data size:" + buff.length);
String str = ViewHelper.getString(buff);
receiveSizeTotal = buff.length + receiveSizeTotal;
receiveTotal.setText(String.valueOf(receiveSizeTotal));
receivedDataView.setText(str);
receivedDataView.invalidate();
}
else{
ToastUtils.showToast("未读到信息");
}
}
}
}这是哪个环节出错了吗?
-
我试过了,写在子线程,整个APP都变得巨卡,就是轮询的,代码如下:
private Handler mHandler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {但是如果写在
runOnUiThread(new Runnable() {
@Override
public void run() {这种子线程就好一点。但是第二种是没有轮询的。
这个难道就没有阻塞触发机制的吗?那如果抛弃这种方式,我看了官方里面有
payload.setCommandDataCallback(new Payload.CommandDataCallback() {
这种接口的,这种应该允许触发式的吧。那psdk那边是要用哪个AP来发消息?
请先登录再写评论。
评论
20 条评论