用管道束(Pipeline)实现负载与MSDK的通讯的问题

Completed

Comments

20 comments

  • DJI Developer Support
    你用得是什么版本的MSDK?如果是MSDK v4的话看下这个Demo。 Link:https://github.com/DJI-Mobile-SDK-Tutorials/Android-MOPDemo
    0
    Comment actions Permalink
  • Boerma

    mop好像没有消息触发这种机制,我理解他就是一个传输通道,有没有消息需要自行判断,我是写了一个轮询,隔一段时间去读数据,有就有没有就没有。

    0
    Comment actions Permalink
  • Caiyixun

    对,就是没有信息触发机制,目前我想到的办法就是看能不能弄一个线程去轮询。但是我想到了好像无人机的面板信息是一直在获取的,所以就过来论坛这边问了,看看在哪里,我把轮询和它写一起。

    0
    Comment actions Permalink
  • Caiyixun

    好的,我去看看这个demo。

    0
    Comment actions Permalink
  • Caiyixun

    demo是不是太旧了?导入就一堆报错的。

    0
    Comment actions Permalink
  • DJI Developer Support
    是有点旧,如果你IDE很新的话可能有环境问题。
    0
    Comment actions Permalink
  • Caiyixun

    我就是想问一下,就是如果把实现那样的效果,要写在哪个线程里面,我看你们无人机状态的获取,肯定是轮询啊,不然怎么时时刻刻知道无人机是否断开连接,我就想把这个读管道的代码写一块,每次拿无人机状态的时候,我就跟着检查一下管道里面是否有信息未读取。主要是想实现这个,如果没有的话,我就自己弄一个子线程去轮询了

     

    0
    Comment actions Permalink
  • Boerma

    你最好是自己写轮询,无人机参数那些大部分都是有变化才回调,以这个为触发机制,怕后面不好控制。

    0
    Comment actions Permalink
  • Caiyixun

    管道束有时间超时的问题吗?我每次一获取管道束,它告诉我获取管道束成功,然后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("未读到信息");
    }
    }
    }
    }

    这是哪个环节出错了吗?

    0
    Comment actions Permalink
  • Boerma

    你是在主线程操作吗?切换到子线程试试。

    0
    Comment actions Permalink
  • Caiyixun

    这个要子线程操作吗?

    0
    Comment actions Permalink
  • Caiyixun

    上次获取好像没有这个问题,只不过我代码没有保存好,丢了

    0
    Comment actions Permalink
  • Caiyixun

    解决了,确实得在子线程里面,是因为延迟吗?

    0
    Comment actions Permalink
  • Boerma

    readData这个动作比较耗时

    0
    Comment actions Permalink
  • Caiyixun

    我试过了,写在子线程,整个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来发消息?

    0
    Comment actions Permalink
  • Boerma

    1、你两种方式都不是开启子线程的建议查看一下java如何开启子线程或者Android 如何开启子线程。

    2、至于后面这个通讯方式并不是mop,你可以查看psdk文档。

    0
    Comment actions Permalink
  • Caiyixun

    MOP好像并没有提供阻塞触发机制的,都是主动去读数据的。而

    payload.setCommandDataCallback(new Payload.CommandDataCallback()

    应该是触发机制的吧?轮询可能会很占用资源,在有其他方案的基础上,还是尽量不使用轮询的。

    0
    Comment actions Permalink
  • Boerma

    这个是触发机制的,至于psdk调哪个接口发送,需要查看psdk文档

    0
    Comment actions Permalink
  • Caiyixun

    感谢,这个很关键。

    0
    Comment actions Permalink

Please sign in to leave a comment.