This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2652R:使用基于 simple_peripheral 的 RTLS API 构建具有 Connection CTE 的项目

Guru**** 2589280 points
Other Parts Discussed in Thread: LAUNCHXL-CC26X2R1

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1373619/cc2652r-build-a-project-with-connection-cte-using-the-rtls-api-based-on-simple_peripheral

器件型号:CC2652R
主题中讨论的其他器件:LAUNCHXL-CC26X2R1

工具与软件:

您好!

我将基于 simple_peripheral add  connection-AOA 构建我自己的项目。   起初我使用了 HCI 接口、但它不起作用、 现在我打算使用 RTLSSRV API、因为我看到有人成功地实现了类似的功能。

例如:  

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1064708/cc2642r-iq-report-event-stops-after-a-certain-amount-of-packets/3947711?tisearch=e2e-sitesearch&keymatch=RTLSSRV_ERROR_EVT#3947711 

和 https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1064166/cc2642r-building-a-custom-rtls-coordinator

我的版本如下:

SW: simplelink_cc13xx_cc26xx_sdk_5_40_00_40

硬件: LAUNCHXL-CC26X2R1 + BOOSTXL-AOA

以下是我的更改:

1.添加 RTLSSrv 初始化函数

  
  void RTLSCoordinator_rtlsSrvlMsgCb(rtlsSrv_evt_t *pRtlsSrvEvt)
{
  // Enqueue the message to switch context
    BT_PRINT(("RTLS EVENT TYPE is %02x \r\n" ,pRtlsSrvEvt->evtType));

    BT_DUMP_HEX(pRtlsSrvEvt->evtData,pRtlsSrvEvt->evtSize);

    BT_PRINT(("\r\n"));

}
  
  static void SimplePeripheral_taskFxn(UArg a0, UArg a1)
  {
  ...
  RTLSSrv_init(2);
  RTLSSrv_register(RTLSCoordinator_rtlsSrvlMsgCb);
  ...
  }

2.在.syscfg 中添加 BLE AOA 配置

3.连接至目标时、请使用 cmdCTERxCommand 和 cmdCTEEnableedCommand 函数。

static cmd_ack_t cmdCTERxCommand(uint8_t *s, uint16_t len, uint16_t id)
{

    BT_PRINT(("cte ENABLE ! \r\n"));

    conn_ctx_t *p_conn_ctx = mible_linkdb_get_info_by_conn_index(0);
        if(p_conn_ctx == NULL)
            return cmd_ack_invalid_param;
    BT_DUMP_HEX(p_conn_ctx->connect.peer_addr,6);
    uint8_t ant_pattern[] = {0,1,2};

#if(USE_RTLS_API)
    uint8_t ret;
    PIN_Handle status;

    status = RTLSSrv_initAntArray(ant_pattern[0]);

    if(status == NULL)
    {
         BT_PRINT(("set ant array error !"));
    }

    ret = RTLSSrv_setConnCteReceiveParams(p_conn_ctx->conn_handle,1,2,sizeof(ant_pattern),ant_pattern);
    if(ret!= 0)
    {
         BT_PRINT(("set cte parms error !"));
    }

    ret = RTLSSrv_setCteSampleAccuracy(p_conn_ctx->conn_handle,1,1,1,1,0x11);

     if(ret!= 0)
     {
          BT_PRINT(("set sample accuracy error !"));
     }
#else
 uint8_t ret = HCI_LE_SetConnectionCteReceiveParamsCmd(p_conn_ctx->conn_handle,1,2,sizeof(ant_pattern),ant_pattern);
    /*Configure AoA receiver parameters */

   if(ret!= 0)
   {
        BT_PRINT(("cte config error !"));
   }
   else
    {
        BT_PRINT(("cte config ok ! \r\n"));
    }
#endif
    BT_PRINT(("end,ok,return !"));
    return cmd_ack_ok;
}

static cmd_ack_t cmdCTEEnabledCommand(uint8_t *s, uint16_t len, uint16_t id)
{
    conn_ctx_t *p_conn_ctx = mible_linkdb_get_info_by_conn_index(0);
    if(p_conn_ctx == NULL)
        return cmd_ack_invalid_param;
    BT_DUMP_HEX(p_conn_ctx->connect.peer_addr,6);

#if(USE_RTLS_API)

    uint8_t ret = RTLSSrv_setConnCteRequestEnableCmd(p_conn_ctx->conn_handle,
                                       1,
                                       2,
                                       10,
                                       0);
    if(ret!= 0)
    {
         BT_PRINT(("set cte enable error !"));
    }
#else
    uint8_t ret = HCI_LE_SetConnectionCteRequestEnableCmd(p_conn_ctx->conn_handle,1,2,10,0);

   if(ret!= 0)
   {
        BT_PRINT(("cte request error !"));
   }
   else
   {
        BT_PRINT(("cte request enabled !"));
   }

#endif
    return cmd_ack_ok;
}

以下是它工作时的一些日志:

[13:41:58.029]发→◇AT+CTE_RX
□
[13:41:58.032]收←◆cte ENABLE ! 
EB F2 E3 92 C6 84 end,ok,return !
OK
 MSG Event type is 91 !!!!  
 hci message is FF

[13:42:02.980]发→◇AT+CTE_ENABLE
□
[13:42:02.983]收←◆EB F2 E3 92 C6 84 RTLS EVENT TYPE is 04 
00 00 56 20 1A 00 

OK

当 cmdCTEEnableedCommand 工作时、 RTLSCoordinator_rtlssSrvlMsgCb 将 抛出   

RTLSSRV_ERROR_EVT (0x04)事件、错误原因为  RTLSSRV_REMOTE_FEATURE_NOT_SUPPORTED  (0x1A)、我不知道产生此错误的具体原因以及如何解决它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您联系我们。

    自您所使用的 SDK 发布以来、已修复了几个问题。 请考虑 从今天开始迁移到最新的可用 SDK - 7.41.00.17。  

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您的意思是旧 SDK 版本导致的问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您的意思是旧版 SDK 造成的问题吗?

    我说这不应该排除、应该检查是否健全。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您是否发现使用上述所有 RTLSSrv 函数有任何异常情况?  如果没问题、我将尝试更新到新的 SDK、然后重试

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您的代码乍一看似乎没问题。

    您可能缺少一种确保远程设备支持 AoA Tx 的方法-这可以解释出现的错误。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    我使用两个远程器件。  其中之一是 TI 的器件、并下载了 RTLS_RESPONSE 固 件、下载 RTLS_Coordinator 固件并使用 RTLS_CONNECTED 脚本正常运行。 另一种是 Nordic 的设备,并 下载了  Direction_finding_peripheral 固件, 可与测向中心设备配合使用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如您所知、我不确定在 SDK 5.40上 RTLS_Coordinator 可以作为 CTE 发送器使用-现在这个功能在 SDK 7.40中就可以实现了。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我已将 SDK 更改为7.4.0。  根据 simple_central 演示、可以在修改后连接指定的外设、并且可以启用 CTE。事件01是从 RTLSCoordinator_rtlsSrvlMsgCb 生成的。  这似乎已经起作用了。 但是、当我查看数据内容时、它看起来与 rtlsSrv_connectionIQReport_t 不匹配 我不知道该怎么说

    下面是我的  RTLSCoordinator_rtlsSrvlMsgCb 和日志:

    void RTLSCoordinator_rtlsSrvlMsgCb(rtlsSrv_evt_t *pRtlsSrvEvt)
    {
    // Enqueue the message to switch context
        static bool flag = true;
    
        if(flag)
        {
            flag = false;
    
      Display_printf(dispHandle, 1, 0, "RTLS EVENT TYPE is %02x, size is %d" ,pRtlsSrvEvt->evtType,pRtlsSrvEvt->evtSize);
    
      for(int i=0;i<pRtlsSrvEvt->evtSize;i++)
      {
          Display_printf(dispHandle, i+2, 0, "row_data[%d] is %02x " ,i,pRtlsSrvEvt->evtData[i]);
      }
    }
    
    }

    *Simple Central
    RTLS EVENT TYPE is 01, size is 24
    row_data[0] is 00
    row_data[1] is 00
    row_data[2] is 01
    row_data[3] is 1b
    row_data[4] is cc
    row_data[5] is ff
    row_data[6] is 00
    row_data[7] is 00
    row_data[8] is 01
    row_data[9] is 00
    row_data[10] is 3b
    row_data[11] is 00
    row_data[12] is 70
    row_data[13] is 02
    row_data[14] is 04
    row_data[15] is 02
    row_data[16] is 01
    row_data[17] is 04
    row_data[18] is b0
    row_data[19] is b3
    row_data[20] is 38
    row_data[23] is 20
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了更正前面的语句、数据符合 rtlsSrv_connectionIQReport_t 结构、但某些参数不符合预期。like  

    RTLSSrv_setCteSampleAccuracy(p_conn_ctx->conn_handle,1,1,1,1,0x11);

    我已将 sampleSize 和 sampleRate 设置为1、即1M 和8位。  但实际上从 pRtlsSrvEvt->evtData 我读取 sampleRate:4、sampleSize:2

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ethan:

    看起来你们已经取得了相当大的进展。 干得不错。

    为了简化调试、我建议将数据转换为 rtlsSrv_connectionIQReport_t 结构、并确保显示在回调之外完成(否则可能会对计时产生一些副作用)。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    我已经提到了 RTLS_Coordinator 例程、他把数据放入 XX_processAppMsg 中、并将其转换为 rtlsSrv_connectionIQReport_t 来解析。 经过多次测试调整、异常参数配置的问题已经得到解决。 权变措施是调整 sampleCtrl 以使用默认过滤模式。 最好提前对该参数的配置进行更多说明或发现问题、因为对于不熟悉 TI 的开发人员来说、这些问题可能非常耗时

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ethan:

    不错的地方 感谢您分享您的解决方案。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Cl é ment:

    当我正在测试 Connection CTE 时、RTLSCoordinator_rtlsSrvlMsgCb 将在报告大约430个 RTLSSRV_CONNECTION_CTE_IQ_REPORT_EVT 事件后停止或导致器件重新启动。  你知道为什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ethan:

    这种软件在发生固定次数的事件后崩溃的问题让我想到了内存泄漏问题。 您可以使用运行时对象查看器(ROV)(请参阅 debuginng guide https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_40_00_77/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/debugging-index.html#ti-rtos-object-viewer) 来查看堆使用情况。

    在这里、我的直觉是、在 rtlsSrv_connectionIQReport_t 结构中传递的数据缓冲区未正确释放、从而导致这种内存泄漏。 如 rlts_Coordinator 示例中所示、确保有效负载得到适当释放。

    static void RTLSCoordinator_processRtlsSrvMsg(rtlsSrv_evt_t *pEvt)
    {
    
      //...
      
      switch (pEvt->evtType)
      {
        //...
    
        case RTLSSRV_CONNECTION_CTE_IQ_REPORT_EVT:
    
        //...
    
      }
    
      // Free the payload
      if (pEvt->evtData)
      {
        ICall_free(pEvt->evtData);
      }
    }

    我希望这将有所帮助、

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hi Cl é ment、è ve

    我已经解决了这个问题。 你是对的。 这是内存泄漏。 但不仅在 RTLSCoordinator_processRtlsSrvMsg 结束时、还会在 RTLSSRV_CONNECTION_CTE_IQ_REPORT_EVT 版本 pReport->iqSamples 中进行。  与本主题类似:e2e.ti.com/.../3947711

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    做得好、感谢您告诉我们!