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.

[参考译文] CC2652R:从外设读取时间以更新中央设备

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1025080/cc2652r-reading-time-from-peripheral-to-update-central

器件型号:CC2652R

我正在尝试修改 simpleCentral 以记录一些广播、但我想更新中央设备上的"时间"。 我 的外设知道时间、因此我只想读取该服务的广播数据并更新中央。 我对这个工作流程有点困惑、因为我 无法访问 ATT_READ_RSP。

在广播报告中、我过滤我的广播地址到外设、然后:

status = GapInit_connect(pAdvRpt->addrType & MASK_ADDRTYPE_ID, pAdvRpt->addr, DEFAULT_INIT_PHY, 0);

然后 、在捕获 GAP_LINK_established 事件的位置:

attReadReq_t req;
req.handle = connList[connIndex].charHandle;
GATT_ReadCharValue(connHandle, &req, selfEntity);

最后,我将能够浏览   SimpleCentral_processGATTMsg ()中 ATT_READ_RSP 处的服务数据。 这是正确的操作顺序吗?  

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

    您好!

    我已要求工程师进行评论。

    同时、请确保指定您正在使用的 SDK 版本、并查看我们 的 SimpleLink Academy 实验。

    请多多包涵。

    此致、

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

    您好、Matt、

    您是否 在 Simple Link Academy 的广告和扫描部分查看过任务#2?

    https://dev.ti.com/tirex/explore/node?node=AKvX4BPHvI6W3ea9a0OTxA__pTTHBmu__LATEST

    我想这就是您要寻找的内容。

    最棒的

    不需要

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

    是的、我有、但这仍然不会为我提供特征内部的数据、仅提供特征数据(包括其 UUID)本身。 我有一个按该 UUID 筛选的服务、其中的单个特征包含数据=当前时间。

    我是否更正 了在 GAP_LINK_established 事件中需要 GATT_ReadCharValue()? 我的 connHandle 为0,我想知道 这是为什么在 SimpleCentral_processGATTMsg()中 pMsg->method =ATT_ERROR_RSP,因为它会变得很远。

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

    我在 SimpleCentral 中也没有此 GATT 读取选项、这可能会向我确切显示我所做的错误。 SDK 5.20.0.52。 函数 SimpleCentral_doGattRead()存在但看起来像一个继电器-它从未在 SimpleCentral 中调用?

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

    您好、Matt、

    在 SDK 5.20中、SimpleCentral.c 的第71行内容为:

    menu_item_action (scMenuPerConn、0、"GATT Read"、SimpleCentral_doGattRead)

    所以我相信它被调用了。

     基于 SimpleCentral_doGattRead()函数的描述,我认为它是您所需要的。 您必须将其命名为每一个  

    [引用 userid="457824" URL"~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1025080/cc2652r-reading-time-from-peripheral-to-update-central/3796103 #3796103"]我的 connHandle 为0,我想知道 这是为什么在 SimpleCentral_processGATTMsg()中 pMsg->method == ATT_ERROR_RSP,因为它会变得如此远。

    是否设置了断点? connHandle = 0这一事实向我表明您正在丢失连接。 如果设置了断点、则器件将无法满足周期性蓝牙连接间隔要求。

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

    我必须替换 SimpleCentral_processGATTDiscEvent()中的 SIMPLEPROFILE_SERV_ID 和 SIMPLEPROFILE_CHAR1_UUID。 我进入下面的代码块,在这里我假设我可以 SimpleCentral_doGattRead()? 我通过 ESLO_GATT_Read 执行该操作、但 GATT_ReadCharValue()的状态现在为 blePending (0x16)。

    } else if (discState == BLE_DISC_STATE_CHAR) {
    // Characteristic found, store handle
    if ((pMsg->method == ATT_READ_BY_TYPE_RSP)
    		&& (pMsg->msg.readByTypeRsp.numPairs > 0)) {
    	uint8_t connIndex = SimpleCentral_getConnIndex(scConnHandle);
    
    	// connIndex cannot be equal to or greater than MAX_NUM_BLE_CONNS
    	SIMPLECENTRAL_ASSERT(connIndex < MAX_NUM_BLE_CONNS);
    
    	// Store the handle of the simpleprofile characteristic 1 value
    	connList[connIndex].charHandle = BUILD_UINT16(
    			pMsg->msg.readByTypeRsp.pDataList[3],
    			pMsg->msg.readByTypeRsp.pDataList[4]);
    
    	// Matt
    	SimpleCentral_enqueueMsg(ESLO_GATT_READ, 0, NULL);
    //      Display_printf(dispHandle, SC_ROW_CUR_CONN, 0, "Simple Svc Found");
    }

    ^这在该块之后运行、该块应手动执行扫描、选择第一个连接、然后连接:

    if (SimpleCentral_findSvcUuid(TIME_SERVICE_UUID, pAdvRpt->pData,
    				pAdvRpt->dataLen)) {
    	SimpleCentral_addScanInfo(pAdvRpt->addr, pAdvRpt->addrType);
    	SimpleCentral_doSelectConn(0);
    	SimpleCentral_doConnect(0);
    }

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

    我开始工作了,我并不是很了解  SimpleCentral_processGATTDiscEvent()是一种渐进的状态机。 因此 、在服务发现后 、设置新状态 BLE_DISC_State_Read (而不是空闲状态)、以便不会遇到 blePending:

    // Discovery states
    enum {
    	BLE_DISC_STATE_IDLE,                // Idle
    	BLE_DISC_STATE_MTU,                 // Exchange ATT MTU size
    	BLE_DISC_STATE_SVC,                 // Service discovery
    	BLE_DISC_STATE_CHAR,                // Characteristic discovery
    	BLE_DISC_STATE_READ,                // Read GATT
    };

    在  GATT_ReadCharValue()之后将空闲状态移动到 BLE_DISC_State_Read 中:

    } else if (discState == BLE_DISC_STATE_CHAR) {
    	// Characteristic found, store handle
    	if ((pMsg->method == ATT_READ_BY_TYPE_RSP)
    			&& (pMsg->msg.readByTypeRsp.numPairs > 0)) {
    		uint8_t connIndex = SimpleCentral_getConnIndex(scConnHandle);
    
    		// connIndex cannot be equal to or greater than MAX_NUM_BLE_CONNS
    		SIMPLECENTRAL_ASSERT(connIndex < MAX_NUM_BLE_CONNS);
    
    		// Store the handle of the simpleprofile characteristic 1 value
    		connList[connIndex].charHandle = BUILD_UINT16(
    				pMsg->msg.readByTypeRsp.pDataList[3],
    				pMsg->msg.readByTypeRsp.pDataList[4]);
    //      Display_printf(dispHandle, SC_ROW_CUR_CONN, 0, "Simple Svc Found");
    	}
    	discState = BLE_DISC_STATE_READ;
    
    } else if (discState == BLE_DISC_STATE_READ) {
    	if ((pMsg->method == ATT_READ_BY_TYPE_RSP
    			&& pMsg->hdr.status == bleProcedureComplete)
    			|| (pMsg->method == ATT_ERROR_RSP)) {
    		// Matt
    		uint8_t connIndex = SimpleCentral_getConnIndex(scConnHandle);
    		attReadReq_t req;
    		req.handle = connList[connIndex].charHandle;
    		status = GATT_ReadCharValue(scConnHandle, &req, selfEntity);
    	}
    
    	discState = BLE_DISC_STATE_IDLE;
    }

    现在 ,在 SimpleCentral_processGATTMsg()中,ATT_READ_RSP 被捕获, pMsg->msg.readRsp.pValue 具有特征值。 您知道、simplpleCentral 对于第一个1%的开发来说是很棒的、但对于其余99%的开发来说是一个真正的难题。 如果具有 更简单 Display_printf 的 LightBlue 应用在删除所有这些菜单代码的情况下分散运行、我希望它只是一个副本。 TI 支持仍然是一流的、谢谢!