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:无按钮选项的中央模式 CC2340R5

Guru**** 2466550 points
Other Parts Discussed in Thread: CC2340R5, SYSCONFIG, CC1352R

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1548639/cc2340r5-central-mode-without-button-option-cc2340r5

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

工具/软件:

尊敬的专家:

我目前使用的是以下设置:

  • CCS 版本 :20.2.0

  • SDK 中找到 simplelink_lowpower_f3_sdk_9_11_00_18

  • 示例 basic_ble

我们使用的是 基于 CC2340R5 的仪器 广播 BLE 数据的符号。 目前、我们正在使用成功地在 Android 设备上接收其广告数据 NRF 连接 设置自动扭矩。

现在、我们正在计划 将 Android 设备替换为另一个 CC2340R5 板 接收数据的能力。

由于我不熟悉低功耗 BLE 器件、因此非常感谢您指导我朝着正确的方向前进。

要求:

  • 使用预定义值自动连接到基于 CC2340R5 的仪器 静态 ID 和 PASSKEY

  • 从仪器接收数据。

  • 通过 UART 打印接收到的数据

  • 仪器广播 每分钟一次 并保持在广播模式 20 秒 、因此扫描仪必须在此窗口中检测并连接。

需要澄清和指导:

请告知如何对示例工程进行以下更改:

  1. 禁用按钮基于输入的操作

    • 如何禁用按钮触发的行为?

    • 哪个源文件包含此实现?

  2. 启动时自动启动扫描

    • 如何在器件启动时自动启动 BLE 扫描?

    • 在代码中的哪里可以配置 UART 设置(不使用 SysConfig)?

    • 我想将发现的器件名称打印到 UART。 您能指导我在哪里修改文件app_central.c、如、app_connection.c等吗?

  3. 定义外设通行密钥

    • 在哪里可以定义用于连接外设(广播设备)的密钥?

  4. 使用通行密钥连接到已知设备

    • 哪个文件包含在找到已知设备时发送连接请求并提供密钥的逻辑?

  5. 读取/写入请求函数

    • 建立连接后、哪个(些)文件处理 GATT 读取和写入操作?

    • 如何从外设读取广播或特征数据?

不限 建议、代码示例或文档参考 非常感谢。

感谢您的时间和支持。

Surya

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

    你好、Surya、

    我建议查看以下中央示例: https://github.com/TexasInstruments-Sandbox/ble_examples/tree/simplelink_low_power_f3_sdk-7.40.03/examples/rtos/LP_EM_CC2340R5/ble5stack/basic_ble_GATT_client

    1. 菜单/按钮交互在 app_menu.c 中定义 如果您不想使用显示、可以在 SysConfig 中的 BLE ->高级设置->禁用显示模块下将其禁用。
    2. 如果要在加电时开始扫描,则 必须执行 Central _ start () 函数(在 app_central.c 中查看)内执行的所有函数。
    3. 请查看: https://software-dl.ti.com/simplelink/esd/simplelink_lowpower_f3_sdk/9.11.00.18/exports/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/gapbondmngr-cc23xx.html?highlight=passkey#passcode-entry
    4. 广播数据和特征数据在过程的不同时刻(高级和连接)读取。 第一个是从高级报告读取、第二个依赖于服务器的 GATT 表和执行到相应句柄的 GATT 操作。 请查看以下两个培训材料:
      1. 高级报告: https://dev.ti.com/tirex/explore/content/simplelink_academy_for_cc23xx_8_40_01_00/_build_simplelink_academy_for_cc23xx_8_40_01_00/source/ble/cc2340rx_02_ble_scan_adv_basic.html
      2. GATT: https://dev.ti.com/tirex/explore/content/simplelink_academy_for_cc23xx_8_40_01_00/_build_simplelink_academy_for_cc23xx_8_40_01_00/source/ble/cc2340rx_01_basic_examples_advanced.html

    BR、

    David。

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

     亲爱的大卫 
    感谢您的建议、现在我已将器件 cc2340 更改为 cc1352

    • Code Composer Studio :20.2.0

    • SDK 中找到 :simplelink_cc13xx_cc26xx_sdk_8_30_01_01

    • 示例工程 simple_central_CC1352R1_LAUNCHXL_tirtos7_ticlang

    要求

    • 自动连接到 基于 CC2340R5 的仪器 使用预定义的静态地址和密钥。

    • 从仪器接收数据。

    • 通过 UART 打印接收到的数据。

    • 仪器每分钟广播一次、并在广播模式下保持 20 秒。 扫描仪必须在此窗口中检测并连接。

    取得进展

    我已将基于 CC1352R 的器件配置为无需按钮输入即可进行扫描。 扫描时、UART 打印设备名称。 如果检测到已知 BLE 地址、扫描停止并启动自动连接。

    UART 输出示例(在 Hercules 中捕获,修改后)Display_printf

    正在连接到 FM_ADDR...
    连接到 0x40791213A330
    数字连接数:1.
    *简单中心
    <下一项
    +设置扫描 PHY >
    发现设备
    +使用
    +设置自动连接
    加密成功

    当前路障

    此时、器件连接成功、加密完成。 现在、我需要:

    • 向连接的仪器读取数据或向其写入数据。

    • 可能访问或解释广播数据(如果连接后可用)。

    公钥

    您能否指导我如何继续:

    1. 将数据写入连接的 BLE 设备。

    2. 接收数据通知或指示。

    3. 处理连接后的 GATT 读取/写入操作。

    4. (可选)如果可能、在建立连接后访问任何剩余的广播数据。

    非常感谢任何代码引用、TI 示例或 API 函数的指针。

    此致
    Surya。

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

    你好、 Surya、

    我认为最好的例子是我分享的一个: https://github.com/TexasInstruments-Sandbox/ble_examples/tree/simplelink_cc13x2_26x2_sdk-5.10/examples/rtos/CC26X2R1_LAUNCHXL/ble5apps/simple_serial_socket_client。 这里有通知和写入命令。

    请将其用作参考、如果您在此过程中有问题、请告知我。

    此致、

    David。

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

    您好 David、 

    感谢您的参考链接。 但是、您分享的 SDK 示例非常旧、仍然依赖于基于按钮的操作。 正如我之前提到的、我专门试图消除按钮交互的需求。 我希望整个过程(包括扫描,连接,写入和读取)完全自动。

    到目前为止、我已经成功实现了自动扫描、可以使用其静态地址找到已知器件。 设备连接成功、过程到达 “加密成功“ 但随后会卡住。

    我正在寻求您的建议、说明接下来应该调用哪个 API、或者我需要采取哪些步骤来继续写入和读取连接的设备。 您能指导我如何使用当前的 SDK 实现这一点吗?

    如果需要、我很乐意分享我的完整代码以供您进行审核。

    此致
    Surya

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

     亲爱的 大卫 ,
    当前执行以下函数的代码卡在其中  

    else if (state == GAPBOND_PAIRING_STATE_COMMERIRED)
     {
      IF(STATUS ==成功)
      {
       Display_printf (dispHandle、0、0、“Encryption Success\r\n“)
       // SimpleCentral_AutoConnect (); //新行
      }
      暴露
      {
       Display_printf(dispHandle、0、0、“加密失败:%d\r\n“,状态)
      }

      GAPBond Mgr_Get 参数 (GAPBOND_PAIRING_MODE、&pairMode);

      IF ((AutoConnect)&&(pairMode == GAPBOND_PAIRING_MODE_Initiate))
      {
       SimpleCentral_AutoConnect ();
      }
     }

    请让我知道我需要做什么...

    此致
    Surya




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

    你好、 Surya、

    我假设您收到的  Encryption Success 打印消息正确无误? 运行  SimpleCentral_AutoConnect ();时是否卡住?  我将参考 simple_central 示例以了解自动连接功能的配置。  方波时钟 SimpleCentral_AutoConnect () SimpleCentral_doAutoConnect () 在 simple_central.c 中 请注意、在成功扫描并找到所有定义的组成员之前、中心不会开始自动连接到所选组。 组成员的数量由定义MAX_NUM_BLE_CONNS。 因此、用户必须预定义想要连接的成员数量。

    BR、

    David。

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

    您好、David   

    请查看以下日志、让我知道接下来需要采取哪些步骤:

    *简单中心
    <下一项
    +设置扫描 PHY >
    发现设备
    +设置自动连接

    *简单中心
    停止查找>

    正在发现...

    default_discovered:0x40791213A330:0x40791213A330

    FM 已识别

    default_discovered:0x40791213A330:0x40791213A330

    FM 已识别

    正在连接到 FM_ADDR...
    连接到 0x40791213A330
    数字连接数:1.

    *简单中心
    <下一项
    +设置扫描 PHY >
    发现设备
    +使用
    +设置自动连接

    加密成功

    注意:

    1. 自动扫描 — 已完成

      SimpleCentral_init使用以下功能自动开始和完成扫描:

      GapScan_enable(0, 0, 0)
    2. 设备查找 — 已完成

      已知设备是使用以下逻辑(未定义时)发现的DEFAULT_DEV_DISC_BY_SVC_UUID

      char bdAddrStr[18]; // 17 characters + null terminator
      snprintf(bdAddrStr, sizeof(bdAddrStr), "%s", Util_convertBdAddr2Str(pAdvRpt->addr));
      Display_printf(dispHandle, 0, 0, "DEFAULT_Discovered: %s:%s\r\n", Util_convertBdAddr2Str(pAdvRpt->addr), bdAddrStr);

      if (strcmp(bdAddrStr, FM_ADDR) == 0)
      {
      GapScan_disable(0);
      FM_FOUND = TRUE;
      Display_printf(dispHandle, 0, 0, "\r\nFM_IDENTIFIED\r\n"); // Store for later connection
      memcpy(knownPeerAddr, pAdvRpt->addr, B_ADDR_LEN);
      knownPeerAddrType = pAdvRpt->addrType; knownPeerFound = true;
      }



    3. 已发送连接请求

      禁用扫描(如果是)后SC_EVT_SCAN_DISABLED、将执行以下逻辑:

      if (knownPeerFound) { knownPeerFound = false; // Force pairing and bonding mode
      uint8_t pairMode = GAPBOND_PAIRING_MODE_INITIATE;
      GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);
      uint8_t bondingEnabled = TRUE;
      GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bondingEnabled);
      status_t status = GapInit_connect( knownPeerAddrType & MASK_ADDRTYPE_ID, knownPeerAddr, DEFAULT_INIT_PHY, CONNECTION_TIMEOUT );
      if (status == SUCCESS)
      {
      Display_printf(dispHandle, 0, 0, "Connecting to FM_ADDR...");
      }
      else
      {
      Display_printf(dispHandle, 0, 0, "Connect failed");
      }
      return; // Skip the rest of SC_EVT_SCAN_DISABLED
      }
    4. 链路已建立

      连接后(在中)GAP_LINK_ESTABLISHED_EVENT、将记录以下信息:

      pStrAddr = (uint8_t*) Util_convertBdAddr2Str(connList[connIndex].addr);
      Display_printf(dispHandle, 0, 0, "Connected to %s\r\n", pStrAddr);
      Display_printf(dispHandle, 0, 0, "Num Conns: %d\r\n", numConn);

    5. 配对状态处理

      在该SimpleCentral_processPairState函数中、加密成功时会执行以下操作:

      else if (state == GAPBOND_PAIRING_STATE_ENCRYPTED)
      {
      if (status == SUCCESS)
      {
      Display_printf(dispHandle, 0, 0, "Encryption success\r\n");
      //SimpleCentral_autoConnect(); // Optional
      }
      else
      {
      Display_printf(dispHandle, 0, 0, "Encryption failed: %d\r\n", status);
      }
      GAPBondMgr_GetParameter(GAPBOND_PAIRING_MODE, &pairMode);
      if ((autoConnect) && (pairMode == GAPBOND_PAIRING_MODE_INITIATE))
      {
      SimpleCentral_autoConnect();
      }
      }

      6. Question: What do I need to do next?
    此致
    Surya
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、David  
    我对下面一行进行了注释、然后得到了以下日志

    ///fqqqqqqq.com ();

    已初始化
    87[10R[1;1HNum Conns:0
    87[10R[1;1HID 地址:0xFCA89BECB290
    87[10R[1;1HRP 地址:0x60335EB8598C
    87[10R[1;1HDiscovering...
    87[10R[1;1HDEFAULT_DISCOVERED:0x420915A04C58:0x420915A04C58
    87[10R[1;1HDEFAULT_DISCOVERED:0x727D9F13F3E6:0x727D9F13F3E6
    87[10R[1;1HDEFAULT_DISCOVERED:0x73B750D511B4:0x73B750D511B4
    87[10R[1;1HDEFAULT_DISCOVERED:0x40791213A330:0x40791213A330
    87[10R[1;1H
    FM 已识别
    87[10R[1];1HAutoConnect:未找到所有成员、仅找到 0 个成员

    此致
    Surya