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.

[参考译文] CC2340R5:开发 BLE 中央+外设模式所需的参考

Guru**** 1785650 points
Other Parts Discussed in Thread: CC2340R5, SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1418411/cc2340r5-required-reference-to-develope-ble-central-peripheral-mode

器件型号:CC2340R5
主题中讨论的其他器件: SysConfig

工具与软件:

专家们、您好!

我正在使用 DATA_STREAM 示例为 CC2340R5实现 BLE 中央+外设模式固件、并且需要根据在 BLE 模块的 GPIO 引脚读取的信号从中央模式切换到外设模式。  

切换到中央模式后、我需要通过识别 MAC 地址或 UUID 连接到外设。

请提供参考资料。

谢谢你。

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

    您好、Aman、

    感谢您的咨询。

    您能否确认 SDK 版本以及您是否使用 SysConfig 中的外设+中央设备配置?

    BR、

    David。

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

    感谢您的响应。

    SDK 版本为- simplelink_lowpower_f3_sdk_8_10_01_02、并使用 SysConfig。

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

    您好、Aman、

    您能否确认您是使用 SysConfig 中的外设+中央设备配置、还是以不同的方法配置这两个角色? 关于基于 MAC 地址或 UUID 的连接、我建议使用 Advertisement Report。 我认为本培训材料会有助于了解如何检索广播报告: 低功耗蓝牙扫描和广播(请参阅任务2:扫描任务2–打印扫描结果)。 请参见 pData_Evt_Adv Rpt_t 结构中包含的 Stk_Gap。 这两个线程提供了有关如何执行此操作的更多详细信息:

    1. 使用 MAC 地址: https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1278585/cc2340r5-central-to-peripheral-automatically-connect
    2. 使用 UUID: https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1417988/cc2340r5-is-there-a-way-to-get-the-primary-services-uuid-from-a-server-without-connecting-to-it

    希望它有所帮助。

    David。

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

    David、您好!

    感谢您的参与。

    我使用外设+中央模式。 我想根据 CC2340R5上的 DIO 输入切换角色、当 DIO 引脚为低电平时、蓝牙应处于外设模式;当 DIO 引脚变为低电平时、蓝牙应切换到中央模式并开始扫描附近的外设。

    当蓝牙处于外设模式时、我将通过 data_stream 示例创建应用。 当它将模式从外设切换到中央时、它将与 data_stream 服务 uuid 的外设连接。 现在、应稳定中央 UART 到外设 UART 的通信。  

    在中央位置、我如何将 来自 UART 的数据写入外设的 DATA_STREAM 特性中、以及如何将数据写入中央 UART、即来自外设的数据?

    请为我提供相关指导、说明我需要采用哪些参考和方法。

    谢谢你。

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

    您好、Aman、

    关于如何使用 BLE 执行 UART 的最后一个问题、我建议查看此处的示例: data_stream_uart_over_BLE (本示例以 data_stream 示例为基础演示基于 BLE 的 UART 示例。 该工程旨在允许轻松交换实际数据接收端和源端、以创建通用的简单流应用)、您还可以检查 中央设备的 basic_ble_GATT_CLIENT、但这里的示例基于 basic_ble 示例。

    关于在外设+中央设备之间交换、您是否计划同时具有两个角色:同一设备中的服务器和客户端、或者您是否只希望通过 GPIO 按钮启用/更改广播和扫描功能? 如果您可以再与我分享一些将会对您有所帮助的应用或用例、

    BR、

    David。

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

    大家好、我在我的应用程序中使用 data_stream。 现在我要将角色更改为 peripheral+central、然后在其中实现客户端功能。 以便可以根据 GPIO 输入将模式服务器更改为客户端、将客户端更改为服务器。  

    请帮我解决这个问题。  

    谢谢你。

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

    您好、Aman、

    我建议看看 peripheral+central 如何在一个多角色示例中共存。 您可以通过 SysConfig 启用此功能。

    我会向与的团队确认一个根据中断更改角色的示例、下面我来谈谈这个示例。

    BR、

    David。

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

    David、您好!

    我希望这封邮件能让您满意。 我目前正在 DATA_STREAM 项目内实施一个客户端应用、旨在设置与同一项目中的服务器设置类似的 UART-BLE 通信。

    我的目标是让中央设备将 UART 数据传输到 data_stream 的 dataOut 特征。 同时、我需要确保 datain 特征中的任何传入数据都会触发通知、以便允许中央设备将该数据写入 UART。 我已附上屏幕截图、以确认我当前的方法是否正确。

    您能否查看随附的屏幕截图并确认这是否是处理通信的正确方式? 此外、您能否提供任何参考或指导、说明如何使用 DATA_STREAM 项目以外设和中央角色配置的两个 CC2340R5器件之间实现无缝的点对点通信?

    最后、我在哪里以及如何注册通知和写入 DATA_STREAM 特性所需的回调方面需要一些帮助。

    感谢您的指导和支持。

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

    您好!  

    乍一看、只看一下您分享的内容、您似乎正朝着正确的方向前进。  

    如果您还不知道、可以考虑以下资源来帮助您实施解决方案:  

    https://github.com/TexasInstruments/ble_examples/tree/simplelink_low_power_f3_sdk-7.40.01/examples/rtos/LP_EM_CC2340R5/ble5stack/data_stream_UART_over_BLE - 展示如何将 data_stream 示例 与 UART 接口

    https://github.com/TexasInstruments/ble_examples/tree/simplelink_low_power_f3_sdk-7.40.01/examples/rtos/LP_EM_CC2340R5/ble5stack/basic_ble_GATT_client -展示 GATT 客户端的实现

    https://github.com/TexasInstruments/ble_examples/tree/simplelink_cc13xx_26xx_sdk-6.40/examples/rtos/LP_CC2651R3SIPA/ble5apps - 展示在不同芯片组上实施的 BLE 客户端和服务器上的 UART

    我希望这将有所帮助、

    此致、  

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

    各位专家、您好!

    我正在数据流项目中使用 CC2340R5实现服务器-客户端功能、该项目同时涉及外设角色和中心角色。

    作为中心设备、我成功连接到外设并获得了连接句柄。 现在、我需要发现服务器上可用的特定服务和特征句柄。

    我已经实施了用于服务发现的代码、并且正在接收服务发现事件。 但是、我很难检索正确的特征句柄、并且我不确定服务的开始和结束句柄是否正确、下面我添加了 UART 终端上打印的日志屏幕截图

    您能否提供有关如何正确检索服务和特征句柄的参考代码或指导? 我在此分享代码、对可能需要的改进或更改提出任何建议表示感谢。

    void discoverServices(void) {
        uint8_t serviceUuid[ATT_UUID_SIZE] = {TI_BASE_UUID_128(SIMPLESTREAMSERVER_SERV_UUID)};
        bStatus_t status;
        // Initiate service discovery
        vTaskDelay(pdMS_TO_TICKS(20));
        status = GATT_DiscPrimaryServiceByUUID(connHandle, serviceUuid, ATT_UUID_SIZE, BLEAppUtil_getSelfEntity());
        if (status != SUCCESS) {
            logError("Failed to initiate service discovery.");
        } else {
            UART2_write(uartHandle, "Service discovery initiated\n", strlen("Service discovery initiated\n"), NULL);
            vTaskDelay(pdMS_TO_TICKS(10));
        }
    
    
    }
    
    void discoverCharacteristics(void) {
        bStatus_t status;
        vTaskDelay(pdMS_TO_TICKS(20));
        status = GATT_DiscAllChars(connHandle, serviceStartHandle, serviceEndHandle, BLEAppUtil_getSelfEntity());
        if (status != SUCCESS) {
            logError("Failed to initiate characteristic discovery.");
        } else {
            UART2_write(uartHandle, "Characteristic discovery initiated\n", strlen("Characteristic discovery initiated\n"), NULL);
            vTaskDelay(pdMS_TO_TICKS(10));
        }
    }
    
    
    
    static void GATT_EventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData)
    {
      gattMsgEvent_t *gattMsg = ( gattMsgEvent_t * )pMsgData;
    
      char buffer[40]; // Adjust the size if needed
    
      switch ( gattMsg->method )
      {
       case ATT_FIND_BY_TYPE_VALUE_RSP:
          {
              if(gattMsg->msg.findByTypeValueRsp.numInfo > 0){
                  serviceStartHandle = ATT_ATTR_HANDLE(gattMsg->msg.findByTypeValueRsp.pHandlesInfo, 0);
                  serviceEndHandle = ATT_GRP_END_HANDLE(gattMsg->msg.findByTypeValueRsp.pHandlesInfo, 0);
                  if(serviceStartHandle != 0 && serviceEndHandle != 0){
                      snprintf(buffer, sizeof(buffer), "Start: 0x%x, End: 0x%x\n", serviceStartHandle, serviceEndHandle);
                      UART2_write(uartHandle, buffer, strlen(buffer), NULL);
                      vTaskDelay(pdMS_TO_TICKS(10));
                  }
              }
              else{
                  UART2_write(uartHandle, "No Service handle found\n", strlen("No handle found\\n"), NULL);
                  vTaskDelay(pdMS_TO_TICKS(20));
              }
          }
          discoverCharacteristics();
          break;
    
       case ATT_READ_BY_TYPE_RSP:
           if(gattMsg->msg.findInfoRsp.numInfo > 0)
               for (uint8_t i = 0; i < gattMsg->msg.readByTypeRsp.numPairs; i++)
               {
                   uint8_t *attrData = gattMsg->msg.readByTypeRsp.pDataList + (i * gattMsg->msg.readByTypeRsp.len);
                   uint16_t handle = BUILD_UINT16(attrData[0], attrData[1]);
                   uint16_t uuid = BUILD_UINT16(attrData[2], attrData[3]);
    
                   // Print the UUID and handle for each discovered characteristic
                   snprintf(buffer, sizeof(buffer), "UUID: 0x%x, Handle: 0x%x\n", uuid, handle);
                   UART2_write(uartHandle, buffer, strlen(buffer), NULL);
                   vTaskDelay(pdMS_TO_TICKS(10));
    
                   if (uuid == SIMPLESTREAMSERVER_DATAIN_UUID)
                   {
                       dataInCharHandle = handle;
                       UART2_write(uartHandle, "DataIn characteristic found\n", strlen("DataIn characteristic found\n"), NULL);
                       vTaskDelay(pdMS_TO_TICKS(10));
                   }
                   else if (uuid == SIMPLESTREAMSERVER_DATAOUT_UUID)
                   {
                       dataOutCharHandle = handle;
                       UART2_write(uartHandle, "DataOut characteristic found\n", strlen("DataOut characteristic found\n"), NULL);
                       vTaskDelay(pdMS_TO_TICKS(10));
                   }
               }
    
           else{
               UART2_write(uartHandle, "No Characteristics Handle Found\n", strlen("No Characteristics Handle Found\n"), NULL);
               vTaskDelay(pdMS_TO_TICKS(10));
           }
           break;
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aman、

    感谢您的咨询。 我恳请你就这个问题打开一条新的线程、以便我们能够正确地跟踪它、并使其他人也能从答案中受益。

    话虽如此、我建议在此期间查阅这份培训材料: https://dev.ti.com/tirex/explore/node?node=A__ATSMDAXx5vlu5FGTUknofQ__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST。请考虑它是为不同的器件系列开发的、但过程应该是类似的。 此外、此主题可以帮助您: https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1396486/cc2340r5-how-to-handle-blepending-0x16-return-code/5354215#5354215

    BR、

    David。