使用mop方式实现osdk和msdk的通信,在osdk侧,用MopPipeline的recvData接收msdk侧发...

已完成

评论

7 条评论

  • DJI Developer Support
    请问OSDK端直接使用MOP sample是否可以复现到这个问题呢?可以提供一下完整的终端log,以便查看确认。
    0
    评论操作 固定链接
  • Tdmhunter

    未接收到任何数据之前,程序表现正常:未收到数据之前blocking,达到一个较长的timeout时间后,返回timeout。接收过一次数据之后,recvData开始按照1800ms左右的间隔返回timeOut
    [2867554.480]STATUS/1 @ accept, L94: /*! 4.Accept finished */
    [2867554.480]STATUS/1 @ accept, L96: MOP channel [49150] accepted success
    [2867554.480]STATUS/1 @ normalAccept, L93: accept successfully
    [2867554.480]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867563.887]STATUS/1 @ normalServerReceiver, L167: [Normal-Service] recv data from cilent, len:1
    [2867563.887]STATUS/1 @ normalServerReceiver, L181: [Normal-Service] msg is fan info, fan_id:246
    [2867563.887]STATUS/1 @ normalServerReceiver, L182: [Normal-Service] msg is fan info, fan_id:40
    [2867563.887]STATUS/1 @ normalServerReceiver, L183: [Normal-Service] msg is fan info, fan_id:92
    [2867563.887]STATUS/1 @ normalServerReceiver, L184: [Normal-Service] msg is fan info, fan_id:143
    [2867563.928]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867565.729]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867565.729]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867567.530]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867567.530]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867569.331]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867569.331]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867571.131]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867571.131]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867572.932]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867572.932]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867574.733]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867574.733]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867576.534]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867576.534]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867578.334]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867578.334]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867580.135]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867580.135]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service
    [2867581.936]STATUS/1 @ normalServerReceiver, L149: [Normal-Service] receive timeout
    [2867581.936]STATUS/1 @ normalServerReceiver, L139: [normal-service] running normal service

    0
    评论操作 固定链接
  • Tdmhunter
    void
    MopManager::normalAccept()
    {
      PipelineType type = RELIABLE;
      PipelineID   id   = OM_NORMAL_RELIABLE_PIPELINE_ID;

      /*! create mop server */
      normalServer = new MopServer();

      /*! connect pipeline */
      normalPipeline = NULL;

      normalReceiverRunning = false;
      MopErrCode acceptRet  = MOP_PASSED;
      if (((acceptRet = normalServer->accept(id, type, normalPipeline)) != MOP_PASSED) ||
          (normalPipeline == NULL))
      {
        DERROR("MOP server accept failed, ret : %d", acceptRet);
        delete normalServer;
        normalServer = NULL;
        return;
      }
      else
      {
        DSTATUS("accept successfully");
      }
      normalReceiverRunning = true;
      normalReceiveThread   = new thread(&MopManager::normalServerReceiver, this);
      normalReceiveThread->join();
      delete normalReceiveThread;

      /*! Disconnect pipeline */
      if (normalServer->close(OM_NORMAL_RELIABLE_PIPELINE_ID) != MOP_PASSED) {
        DERROR("MOP Pipeline disconnect pipeline(%d) failed", OM_NORMAL_RELIABLE_PIPELINE_ID);
      } else {
        DSTATUS("Disconnect mop pipeline id(%d) successfully", OM_NORMAL_RELIABLE_PIPELINE_ID);
      }
      delete normalServer;
      normalServer = NULL;
      normalReceiveThread = NULL;
    }

    void
    MopManager::normalServerReceiver()
    {
      //接收缓存区
      uint8_t* recvBuf = (uint8_t*)OsdkOsal_Malloc(RELIABLE_RECV_ONCE_BUFFER_SIZE);
      MopErrCode mopRet;
      if (recvBuf == NULL)
      {
        DERROR("[File-Service]  OsdkOsal_Malloc recv buffer error");
        return;
      }
      //发送缓存区
      uint8_t* sendBuf = (uint8_t *)OsdkOsal_Malloc(RELIABLE_SEND_ONCE_BUFFER_SIZE);
      if (sendBuf == NULL)
      {
        DERROR("[File-Service]  OsdkOsal_Malloc send buffer error");
        return;
      }

      //接收类型
      MopPipeline::DataPackType readPack = { (uint8_t*)recvBuf,
                                             RELIABLE_RECV_ONCE_BUFFER_SIZE };
      //发送类型
      MopPipeline::DataPackType writePack = {(uint8_t*)sendBuf,
                                             RELIABLE_SEND_ONCE_BUFFER_SIZE };    

      while (normalReceiverRunning)
      {
        DSTATUS("[normal-service]  running normal service");
        memset(recvBuf, 0, RELIABLE_RECV_ONCE_BUFFER_SIZE);
        memset(sendBuf, 0, RELIABLE_SEND_ONCE_BUFFER_SIZE);
        readPack.length = RELIABLE_RECV_ONCE_BUFFER_SIZE;
        writePack.length = RELIABLE_SEND_ONCE_BUFFER_SIZE;
        mopRet          = normalPipeline->recvData(readPack, &readPack.length);
        if (mopRet != MOP_PASSED)
        {
          if (mopRet == MOP_TIMEOUT)
          {
            DSTATUS("[Normal-Service] receive timeout");
          }
          else if (mopRet == MOP_CONNECTIONCLOSE)
          {
            DSTATUS("[Normal-Service]  connection of pipeline [%d] closed",
                    normalPipeline->getId());
            DSTATUS("[Normal-Service]  disconnect from cilent now stop task");
            break;
          }
          else
          {
            DERROR("[Normal-Service]  recv data from cilent error,stat:%lld",
                   mopRet);
          }
          //OsdkOsal_TaskSleepMs(1000);
        }
        else
        {
          DSTATUS("[Normal-Service]  recv data from cilent, len:%d",
                  readPack.length);
          if (readPack.length > 0)
          {
            NormalMessage *msg = (NormalMessage *) recvBuf;
            switch(msg->cmd) {
              case NORMAL_CMD_FAN_CENTER:
                //todo: 替换成实际获取经纬度的方法
                Location location;
                location.fan_center[0] = 3.12;
                location.fan_center[1] = 131.63;
                location.fan_center[2] = 135.72;
                sendBuf[0] = NORMAL_CMD_FAN_CENTER;
                memcpy(sendBuf + 1, &location, sizeof(Location));
                DSTATUS("[Normal-Service] msg is fan info, fan_id:%d", (int)sendBuf[1]);
                DSTATUS("[Normal-Service] msg is fan info, fan_id:%d", (int)sendBuf[2]);
                DSTATUS("[Normal-Service] msg is fan info, fan_id:%d", (int)sendBuf[3]);
                DSTATUS("[Normal-Service] msg is fan info, fan_id:%d", (int)sendBuf[4]);
                mopRet = normalPipeline->sendData(writePack, &writePack.length);
                if (mopRet != MOP_PASSED)
                {
                  DSTATUS("[Normal-Service] send data fail:%d", mopRet);
                }
                break;
              case NORMAL_CMD_FLIGHT_INFO:
                InfoMsg infoMsg;
                memcpy(&infoMsg, msg->data, sizeof(InfoMsg));
                DSTATUS("[Normal-Service] msg is fan info, fan_id:%s", infoMsg.fan_id);
                break;
              case NORMAL_CMD_INSPECT_STATE:
                break;
              case NORMAL_CMD_TEST:
                break;
              case NORMAL_CMD_OTHER_INFO:
                break;
              default:
                break;
            }
          }
        }
      }
      OsdkOsal_Free(recvBuf);
      OsdkOsal_Free(sendBuf);
    }
    0
    评论操作 固定链接
  • Tdmhunter

    程序片段如上,Mop Sample没有测试

    0
    评论操作 固定链接
  • DJI Developer Support
    1、Timeout通常是没有收到数据,报timeout时,MSDK是已经停止发送数据了吗?是否后续MSDK发送的数据均无法接收到了? 2、建议先使用MSDK sample与OSDK程序对调,或者使用OSDK sample与MSDK端程序打通数据传输。也可以方便确认是MSDK端还是OSDK端出现异常。
    0
    评论操作 固定链接
  • Tdmhunter

    timeout这个机制我理解,我不确定的是在没有数据传输时recv端如此频繁地返回timeout是否正常,刚测试用MOP sample也是相同的问题(在msdp端upload文件,upload成功后,osdk端频繁返回timeout)。

    0
    评论操作 固定链接
  • DJI Developer Support
    这个接口没有办法修改超时时间,如果是已经停止发送数据,可以考虑发送端将通道关闭,如果不发送数据了还需维护通道,继续接收数据即可。不需要做log的情况下,可以将此打印关闭。前提是要确保再次发送数据通道正常。
    0
    评论操作 固定链接

请先登录再写评论。