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:如何启用或使用 GATT 服务更改功能

Guru**** 2538950 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1559193/cc2340r5-how-to-enable-or-use-gatt-service-changed-feature

器件型号:CC2340R5


工具/软件:

我们希望在建立连接后启用 GATT 服务 (OAD)。 目的是使用服务变更指示。 不同应用 CC2340 器件 (外设)作为 GATT 服务器、CC2745 器件(中央器件)作为 GATT 客户端。 我们需要服务器和客户端的支持、如果您能分享示例项目或用户说明、我们将不胜感激。

相似 外设 首先 通过引用 basic_ble_oad_dual_image 工程来在 basic_ble 工程中集成 OAD 服务。 工程构建时不会出现编译或链接器错误。 当  OAD_start App_StackInitDoneHandler 使用 NRF Connect 应用在中调用函数时、我可以看到 OAD 服务被发现。  但是、当OAD_start在接收到建立连接事件后从用户任务调用该函数时。 在 NRF Connect 应用程序中重新查找服务时、它无法显示。

下面是我为集成所遵循的步骤的摘要...

  1. 参考 链接和此链接以了解服务更改指示的使用。
  2. oad_profile向中添加了头文件和源文件 common/Profiles/oad
  3. oad_service向中添加了头文件和源文件 common/Services/oad
  4. 添加了以下包含目录
    1. ${COM_TI_SIMPLELINK_LOWPOWER_F3_SDK_INSTALL_DIR}/source/third_party/mcuboot/boot/bootutil/include
    2. ${COM_TI_SIMPLELINK_LOWPOWER_F3_SDK_INSTALL_DIR}/source/third_party/mcuboot/boot/ti/source/mcuboot_app
  5. 添加了以下 ARM 编译器和 ARM 链接器定义
    1. OAD_CFG
    2. APP_HDR_ADDR=0x6000
  6. 添加了以下编译后处理步骤
    1. ${CG_TOOL_ROOT}/bin/tiarmobjcopy ${BuildArtifactFileBaseName}.out --output-target binary ${BuildArtifactFileBaseName}_noheader.bin --remove-section=.ccfg
    2. ${COM_TI_SIMPLELINK_LOWPOWER_F3_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool sign --header-size 0x100 --align 4 --slot-size 0x3B000 --version 1.0.0 --pad-header --pad --key ${COM_TI_SIMPLELINK_LOWPOWER_F3_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem ${BuildArtifactFileBaseName}_noheader.bin ${BuildArtifactFileBaseName}_v1.bin
    3. ${COM_TI_SIMPLELINK_LOWPOWER_F3_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool sign --header-size 0x100 --align 4 --slot-size 0x3B000 --version 2.0.0 --pad-header --pad --key ${COM_TI_SIMPLELINK_LOWPOWER_F3_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem ${BuildArtifactFileBaseName}_noheader.bin ${BuildArtifactFileBaseName}_v2.bin

请查看以下详细信息:

  • SDK 版本: simplelink lowpower f3 SDK v7.40.00.64(我们很快就会转到最新的 SDK,但我觉得缺少一个步骤或者我做得不对)
  • MCU:CC2340R5RGE
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    供参考:OAD_START 将在一些 GATT 写入请求时调用、但对于原型设计、我只是在建立连接后尝试了。

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

    您好:

    感谢您发送编修。我们会重新检视您的建议。  

    我建议按照 SimpleLink Academy 中有关 如何将 BLE OAD 添加到基本示例的步骤进行操作。 我认为这将证明是一个非常有用的资源。

    我还强烈建议迁移到更新的 SDK。 您可以利用 用户指南中的迁移指南。

    我希望这对您有所帮助!

    此致、

    Tarek D

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

    感谢您的答复。 该指南确实有助于移植。

    但我们在这里遗漏了重要部分、即服务变更指示。 我需要帮助。

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

    您好、Ajmeri、

    如前面链接的 SimpleLink Academy 中所示、应在中调用 oad_start () 函数  App_StackInitDoneHandler(). If this is not causing any issues, I would recommend keeping the code as is.

    I would assume the reason it causes a crash when being called from the user task, is because some variables inside of the oad_start function are being reinitialized, which is causing the issue.

    Best Regards,

    Tarek D

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

    我们的要求是 在建立安全连接后、在 GATT 写入请求时启用 OAD 服务、从而将器件置于 OTA 更新状态。 请注意、该 GATT 写入请求基于事件(新固件可用性)、后者是用户通过中央设备 (CC2745) 执行的操作。

    为此、我想使用 GATT 服务更改通知指示来通知客户端 OAD 服务现在可用。  我们能否继续讨论 GATT 服务变更主题、重点介绍启用此主题的步骤或参考示例?

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

    您好、Ajmeri、

    不过、大家可以理解、前面链接的用户指南部分将讨论启用 GATT 服务更改。 您对此有具体问题吗?

    此致、

    Tarek D

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

    我在OAD_start App_StackInitDoneHandler 上面的问题中最初是从发出的。 我尝试在 GATT 写入SimpleGatt_changeCB 回调函数后调用、可以使用该函数。

    static void SimpleGatt_changeCB( uint8_t paramId )
    {
      uint8_t newValue = 0;
    
      switch( paramId )
      {
        /* other cases */
        
        case SIMPLEGATTPROFILE_CHAR3:
          {
            SimpleGattProfile_getParameter(SIMPLEGATTPROFILE_CHAR3, &newValue);
    
            if (newValue == 0x01)
            {
                OAD_start();
            }
    
            SimpleGatt_notifyChar4();
          }
          break;
          
        /* other cases */
              
        default:
          break;
      }
    }