Thread 中讨论的其他器件:SysConfig、 CC1352R
我的目的是在器件运行期间更改器件名称。 调用接口 GGS_SetParameter 后、我可以看到应用端的器件名称没有改变、如下图所示。 问题是什么?
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.
我的目的是在器件运行期间更改器件名称。 调用接口 GGS_SetParameter 后、我可以看到应用端的器件名称没有改变、如下图所示。 问题是什么?
您好、Linqian、
正如 Kel 所指出的、器件名称是通过 SysConfig 设置的、因此我宁愿在此处更改名称。 但是、您共享的代码片段应该可以正常工作。 当手机扫描时、它将显示在广播/扫描响应有效载荷中设置的本地名称。 我能够使用 LightBlue 移动应用验证这一点。 连接到器件后、您将看到器件名称更新。
也许您正在寻找的是更新广播或扫描响应有效载荷的方法。 这也可以在 SysConfig 的广播设备配置下完成。
我知道、AT 命令是用于设置器件名称的外部命令。
如果我正确地记得 IOS Light Blue 应用程序显示的是设备名称。 在 NRF Connect 应用程序中是扫描响应。 可能是反向的。 两者都在初始化时设置 SimplePeripheral_Init()
如果我要做您正在尝试的事情、请设置新的设备名称。 我会将新器件名称保存在 SNV 中。 然后重新启动设备。 然后 读取包含新器件名称的 SNV、并使用以下代码在初始化时进行设置
GGS_SetParameter (GGS_DEVICE_NAME_ATT、GAP_DEVICE_NAME_LEN、NEWattDeviceName);
但是、如果此代码无法正常工作、因为您已经对其进行了测试、这是一个问题
-kel
您好!
我正在使用 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
它在初始化期间执行的操作。 我只知道初始化期间设置的器件名称和 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"]您说更新设备名称等参数需要重新启动设备才能实现此目的?我没有这么做。 但我认为这会起作用。
-kel
Lingqian、您好!
有关在运行时更改广播间隔的更多详细信息、请参阅 Simplelink Academy:
此资源还包含有关如何更改广播数据的说明、例如器件名称:
此致、Werner