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.

[参考译文] CC2642R-Q1:示例修改蓝牙器件的名称

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1180508/cc2642r-q1-example-modify-the-name-of-a-bluetooth-device

器件型号:CC2642R-Q1
Thread 中讨论的其他器件:SysConfigCC1352R

我的目的是在器件运行期间更改器件名称。 调用接口 GGS_SetParameter 后、我可以看到应用端的器件名称没有改变、如下图所示。 问题是什么?

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

    您好!

    尝试关闭应用程序、然后关闭智能手机蓝牙。 然后重试。 您使用的是哪个 SDK 版本?

    -kel

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

    SDK_6_20_00_29

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

    我关闭了应用程序并重新启动了手机的蓝牙。 我读取的器件名称仍然是 BT618

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

    器件名称在 syscfg 中设置。 不确定是否可以在操作期间再次更改。 无论如何、请等待 TI 工程师回复。

    -kel

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

    您好、Linqian、

    正如 Kel 所指出的、器件名称是通过 SysConfig 设置的、因此我宁愿在此处更改名称。 但是、您共享的代码片段应该可以正常工作。 当手机扫描时、它将显示在广播/扫描响应有效载荷中设置的本地名称。 我能够使用 LightBlue 移动应用验证这一点。 连接到器件后、您将看到器件名称更新。

    也许您正在寻找的是更新广播或扫描响应有效载荷的方法。 这也可以在 SysConfig 的广播设备配置下完成。

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

    是的、可以在 SysConfig 中配置器件名称。 但是、我的要求是在器件运行期间更改器件名称、如我图片中的红色框所示。 方案是:通过 AT 命令更改设备名称、谢谢

    此外、如果应用侧显示的器件名称是本地名称、如果在程序运行期间随时更改本地名称、该怎么办?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="540944" URL"~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1180508/cc2642r-q1-example-modify-the-name-of-a-bluetooth-device/4446700 #4446700"]情形是:通过 AT 命令更改设备名称,谢谢[/quot]

    我知道、AT 命令是用于设置器件名称的外部命令。  

    如果我正确地记得 IOS Light Blue 应用程序显示的是设备名称。 在 NRF Connect 应用程序中是扫描响应。 可能是反向的。 两者都在初始化时设置 SimplePeripheral_Init()

    如果我要做您正在尝试的事情、请设置新的设备名称。 我会将新器件名称保存在 SNV 中。 然后重新启动设备。 然后 读取包含新器件名称的 SNV、并使用以下代码在初始化时进行设置

    GGS_SetParameter (GGS_DEVICE_NAME_ATT、GAP_DEVICE_NAME_LEN、NEWattDeviceName);

    但是、如果此代码无法正常工作、因为您已经对其进行了测试、这是一个问题

    -kel

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

    根据这种现象、只需更改 attDeviceName 就没有效果。 我应该将参数 advData1或 scanResData1的内容更改为有用吗? 如果是、我应该更改哪个 API

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

    您好!

    我正在使用 CC1352R Launchpad 和 SDKv6.20测试。

    使用 IOS LightBlue 应用更改器件名称可使用以下代码(在 SimplePeripheral_init()中调用)。

    GGS_SetParameter(GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, "Simple Device");

    使用 Android NRF Connect、您会看到下面的 scanResData1[]。 此代码可在 ti_ble_config.c 中找到、该代码由 syscfg 修改。

    uint8_t scanResData1[] =
    {
      0x12,
      GAP_ADTYPE_LOCAL_NAME_COMPLETE,
      'S',
      'i',
      'm',
      'p',
      'l',
      'e',
      ' ',
      'P',
      'e',
      'r',
      'i',
      'p',
      'h',
      'e',
      'r',
      'a',
      'l',
    
      0x02,
      GAP_ADTYPE_POWER_LEVEL,
      0,
    
      0x05,
      GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
      LO_UINT16(80),
      HI_UINT16(80),
      LO_UINT16(104),
      HI_UINT16(104),
    
    };

    使用下面的代码设置 scanResData1, 该代码在 SimplePeripheral_processGapMessage()中调用

    // Load scan response data for set #1 that is statically allocated by the app
            status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_SCAN_RSP,
                                         sizeof(scanResData1), scanResData1);

    因此、如果您使用的是 Android NRF Connect、则需要更改 scanResData1。

    但是、如果您有自定义应用程序、通常需要进行编程才能看到器件名称。

    -kel

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

    我认为您不理解我的意思。 我想要的是在初始化之后以及系统启动并运行后更新器件名称。 我尝试更改程序中的器件名称、但实际上它不起作用。 我不知道问题是什么。

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

    您好!

    此代码用于更改 scanResData[]。 因此、如果您使用的是 Android NRF Connect 应用程序、您应该能够看到更改。

    /*********************************************************************
     * @fn      SimplePeripheral_processGapMessage
     *
     * @brief   Process an incoming GAP event.
     *
     * @param   pMsg - message to process
     */
    static void SimplePeripheral_processGapMessage(gapEventHdr_t *pMsg)
    {
      uint8_t scanResData2[] =
      {
        0x11,
        GAP_ADTYPE_LOCAL_NAME_COMPLETE,
        'S',
        'i',
        'm',
        'p',
        'l',
        'e',
        ' ',
        'S',
        'p',
        'i',
        'd',
        'e',
        'r',
        'm',
        'a',
        'n',
    
        0x02,
        GAP_ADTYPE_POWER_LEVEL,
        0,
    
        0x05,
        GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
        LO_UINT16(80),
        HI_UINT16(80),
        LO_UINT16(104),
        HI_UINT16(104),
    
      };
      switch(pMsg->opcode)
      {
        case GAP_DEVICE_INIT_DONE_EVENT:
        {
          bStatus_t status = FAILURE;
    
          gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg;
    
          if(pPkt->hdr.status == SUCCESS)
          {
            // Store the system ID
            uint8_t systemId[DEVINFO_SYSTEM_ID_LEN];
    
            // use 6 bytes of device address for 8 bytes of system ID value
            systemId[0] = pPkt->devAddr[0];
            systemId[1] = pPkt->devAddr[1];
            systemId[2] = pPkt->devAddr[2];
    
            // set middle bytes to zero
            systemId[4] = 0x00;
            systemId[3] = 0x00;
    
            // shift three bytes up
            systemId[7] = pPkt->devAddr[5];
            systemId[6] = pPkt->devAddr[4];
            systemId[5] = pPkt->devAddr[3];
    
            // Set Device Info Service Parameter
            DevInfo_SetParameter(DEVINFO_SYSTEM_ID, DEVINFO_SYSTEM_ID_LEN, systemId);
    
            Display_printf(dispHandle, SP_ROW_STATUS_1, 0, "Initialized");
    
            BLE_LOG_INT_TIME(0, BLE_LOG_MODULE_APP, "APP : ---- got GAP_DEVICE_INIT_DONE_EVENT", 0);
            // Setup and start Advertising
            // For more information, see the GAP section in the User's Guide:
            // software-dl.ti.com/.../
    
            BLE_LOG_INT_INT(0, BLE_LOG_MODULE_APP, "APP : ---- call GapAdv_create set=%d,%d\n", 0, 0);
            // Create Advertisement set #1 and assign handle
            status = GapAdv_create(&SimplePeripheral_advCallback, &advParams1,
                                   &advHandleLegacy);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            // Load advertising data for set #1 that is statically allocated by the app
            status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_ADV,
                                         sizeof(advData1), advData1);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            // Load scan response data for set #1 that is statically allocated by the app
    #if 0
            status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_SCAN_RSP,
                                         sizeof(scanResData1), scanResData1);
    #endif
            status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_SCAN_RSP,
                                                 sizeof(scanResData2), scanResData2);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            // Set event mask for set #1
            status = GapAdv_setEventMask(advHandleLegacy,
                                         GAP_ADV_EVT_MASK_START_AFTER_ENABLE |
                                         GAP_ADV_EVT_MASK_END_AFTER_DISABLE |
                                         GAP_ADV_EVT_MASK_SET_TERMINATED);
    
            // Enable legacy advertising for set #1
            status = GapAdv_enable(advHandleLegacy, GAP_ADV_ENABLE_OPTIONS_USE_MAX , 0);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            BLE_LOG_INT_INT(0, BLE_LOG_MODULE_APP, "APP : ---- call GapAdv_create set=%d,%d\n", 1, 0);
            // Create Advertisement set #2 and assign handle
            status = GapAdv_create(&SimplePeripheral_advCallback, &advParams2,
                                   &advHandleLongRange);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            // Load advertising data for set #2 that is statically allocated by the app
            status = GapAdv_loadByHandle(advHandleLongRange, GAP_ADV_DATA_TYPE_ADV,
                                         sizeof(advData2), advData2);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            // Set event mask for set #2
            status = GapAdv_setEventMask(advHandleLongRange,
                                         GAP_ADV_EVT_MASK_START_AFTER_ENABLE |
                                         GAP_ADV_EVT_MASK_END_AFTER_DISABLE |
                                         GAP_ADV_EVT_MASK_SET_TERMINATED);
    
            BLE_LOG_INT_TIME(0, BLE_LOG_MODULE_APP, "APP : ---- GapAdv_enable", 0);
            // Enable long range advertising for set #2
            status = GapAdv_enable(advHandleLongRange, GAP_ADV_ENABLE_OPTIONS_USE_MAX , 0);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            // Display device address
            Display_printf(dispHandle, SP_ROW_IDA, 0, "%s Addr: %s",
                           (addrMode <= ADDRMODE_RANDOM) ? "Dev" : "ID",
                           Util_convertBdAddr2Str(pPkt->devAddr));
    
            if (addrMode > ADDRMODE_RANDOM)
            {
              SimplePeripheral_updateRPA();
    
              // Create one-shot clock for RPA check event.
              Util_constructClock(&clkRpaRead, SimplePeripheral_clockHandler,
                                  READ_RPA_PERIOD, 0, true,
                                  (UArg) &argRpaRead);
            }
            tbm_setItemStatus(&spMenuMain, SP_ITEM_AUTOCONNECT, TBM_ITEM_NONE);
          }
    
          break;
        }

     在 GAP_DEVICE_INIT_DONE_EVENT 之后的初始化期间调用此命令  

    status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_SCAN_RSP,
                                                 sizeof(scanResData2), scanResData2);

    在运行期间,通过调用 Event_POST()或 SimplePeripheral_enqueueMsg(),这可能会在事件中起作用。

    -kel

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

    是的、可以在事件 GAP_DEVICE_INIT_DONE_EVENT 中更改器件的名称、但我的意思是、如何在另一个任务中更改器件的名称、如我发布的任务、以及为什么不更改 GAP_DEVICE_INIT_DONE_EVENT 触发器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="540944" URL"~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1180508/cc2642r-q1-example-modify-the-name-of-a-bluetooth-device/4448245 #4448245"]为什么不使用 GAP_DEVICE_INIT_DONE_EVENT 触发器[/QUEST]

    它在初始化期间执行的操作。 我只知道初始化期间设置的器件名称和 scanResData[]。 因此、正如我先前所建议的、如果我要这样做、我会将新器件名称或 scanResData[]保存在 SNV 中。 在初始化期间重置器件并读取 SNV 的内容、并将其设置为新器件名称或 scanResData[]。

    您可以尝试的另一种方法是在事件中运行操作期间设置新设备名称或 scanResData[]。 该程序由事件驱动。 您需要了解这是如何工作的、并尝试相同的方法。 我不知道这种方法是否起作用。

    /*********************************************************************
     * @fn      SimplePeripheral_processAppMsg
     *
     * @brief   Process an incoming callback from a profile.
     *
     * @param   pMsg - message to process
     *
     * @return  None.
     */
    static void SimplePeripheral_processAppMsg(spEvt_t *pMsg)
    {
      bool dealloc = TRUE;
    
      if (pMsg->event <= APP_EVT_EVENT_MAX)
      {
        BLE_LOG_INT_STR(0, BLE_LOG_MODULE_APP, "APP : App msg status=%d, event=%s\n", 0, appEventStrings[pMsg->event]);
      }
      else
      {
        BLE_LOG_INT_INT(0, BLE_LOG_MODULE_APP, "APP : App msg status=%d, event=0x%x\n", 0, pMsg->event);
      }
    
      switch (pMsg->event)
      {
        case SP_CHAR_CHANGE_EVT:
          SimplePeripheral_processCharValueChangeEvt(*(uint8_t*)(pMsg->pData));
          break;
    
        case SP_KEY_CHANGE_EVT:
          SimplePeripheral_handleKeys(*(uint8_t*)(pMsg->pData));
          break;
    
        case SP_ADV_EVT:
          SimplePeripheral_processAdvEvent((spGapAdvEventData_t*)(pMsg->pData));
          break;
    
        case SP_PAIR_STATE_EVT:
          SimplePeripheral_processPairState((spPairStateData_t*)(pMsg->pData));
          break;
    
        case SP_PASSCODE_EVT:
          SimplePeripheral_processPasscode((spPasscodeData_t*)(pMsg->pData));
          break;
    
        case SP_PERIODIC_EVT:
          SimplePeripheral_performPeriodicTask();
          break;
    
        case SP_READ_RPA_EVT:
          SimplePeripheral_updateRPA();
          break;
    
        case SP_SEND_PARAM_UPDATE_EVT:
        {
          // Extract connection handle from data
          uint16_t connHandle = *(uint16_t *)(((spClockEventData_t *)pMsg->pData)->data);
    
          SimplePeripheral_processParamUpdate(connHandle);
    
          // This data is not dynamically allocated
          dealloc = FALSE;
          break;
        }
    
        case SP_CONN_EVT:
          SimplePeripheral_processConnEvt((Gap_ConnEventRpt_t *)(pMsg->pData));
          break;
    
        default:
          // Do nothing.
          break;
      }
    
      // Free message data if it exists and we are to dealloc
      if ((dealloc == TRUE) && (pMsg->pData != NULL))
      {
        ICall_free(pMsg->pData);
      }
    }

    -kel

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

    因此、您说更新设备名称等参数需要重启设备才能实现这一点吗? 更新广播间隔会怎么样? 是否还需要重新启动设备?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="540944" URL"~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1180508/cc2642r-q1-example-modify-the-name-of-a-bluetooth-device/4448253 #4448253)]更新广播间隔的内容是什么? [/报价]

    您无需重新启动设备。 您需要在修改广播间隔之前停止广播。 我以前做过这个。

    [引用 userid="540944" URL"~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1180508/cc2642r-q1-example-modify-the-name-of-a-bluetooth-device/4448253 #4448253"]您说更新设备名称等参数需要重新启动设备才能实现此目的?

    我没有这么做。 但我认为这会起作用。  

    -kel

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

    Lingqian、您好!

    有关在运行时更改广播间隔的更多详细信息、请参阅 Simplelink Academy:

    https://dev.ti.com/tirex/explore/content/simplelink_academy_cc13xx_cc26xxsdk_6_30_00_00/modules/ble5stack/ble_scan_adv_basic/ble_scan_adv_basic.html#advertising-task-3-ndash-change-advertising-interval-at-runtime

    此资源还包含有关如何更改广播数据的说明、例如器件名称:

    https://dev.ti.com/tirex/explore/content/simplelink_academy_cc13xx_cc26xxsdk_6_30_00_00/modules/ble5stack/ble_scan_adv_basic/ble_scan_adv_basic.html#advertising-task-2-ndash-change-the-advertisement-data

    此致、Werner