主题中讨论的其他器件: SysConfig
工具与软件:
专家们、您好!
我正在使用 DATA_STREAM 示例为 CC2340R5实现 BLE 中央+外设模式固件、并且需要根据在 BLE 模块的 GPIO 引脚读取的信号从中央模式切换到外设模式。
切换到中央模式后、我需要通过识别 MAC 地址或 UUID 连接到外设。
请提供参考资料。
谢谢你。
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.
工具与软件:
专家们、您好!
我正在使用 DATA_STREAM 示例为 CC2340R5实现 BLE 中央+外设模式固件、并且需要根据在 BLE 模块的 GPIO 引脚读取的信号从中央模式切换到外设模式。
切换到中央模式后、我需要通过识别 MAC 地址或 UUID 连接到外设。
请提供参考资料。
谢谢你。
您好、Aman、
您能否确认您是使用 SysConfig 中的外设+中央设备配置、还是以不同的方法配置这两个角色? 关于基于 MAC 地址或 UUID 的连接、我建议使用 Advertisement Report。 我认为本培训材料会有助于了解如何检索广播报告: 低功耗蓝牙扫描和广播(请参阅任务2:扫描任务2–打印扫描结果)。 请参见 pData_Evt_Adv Rpt_t 结构中包含的 Stk_Gap。 这两个线程提供了有关如何执行此操作的更多详细信息:
希望它有所帮助。
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。
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。