TI中文支持网
TI专业的中文技术问题搜集分享网站

LAUNCHXL-CC26X2R1: 主机工程不写CCC的属性值却收到从机的notify

Part Number:LAUNCHXL-CC26X2R1Other Parts Discussed in Thread:SYSCONFIG

我现在在主机工程simple_central.c的

static void SimpleCentral_processGATTMsg(gattMsgEvent_t *pMsg)这个函数中加入以下分支判断

else if (pMsg->method == ATT_HANDLE_VALUE_NOTI)
{

Display_printf(dispHandle, TBM_ROW_APP+11, 0, "notify: %s",
Util_convertBdAddr2Str(pMsg->msg.readRsp.pValue));

}

就是主机收到notify就打印出数据,现在我发现我只要和从机连上之后,我主机端没有对从机端进行CCC的属性值写操作,却能直接收到从机的notify数据。

从机工程就是使用的simple_peripheral,请问是什么原因,如果我想是主机写入CCC的属性后才触发从机的notify,对例程simple_peripheral是不是要删去相关的语句?希望解答的细致一点

Yolande Wang:

您好,

在正常的 BLE 连接中,当主机连接到从机时,通常会执行以下步骤:

1.主机向从机发出请求以读取或写入特定属性的值。

2.从机根据主机的请求做出回应。

3.如果启用了通知、指示,从机在其属性值发生变化时会主动发送通知、指示给主机。

您现在的情况可能就是由于从机的默认设置导致的,使其在连接建立后自动发送通知,而无需主机执行写操作。

Wei Pan 说:如果我想是主机写入CCC的属性后才触发从机的notify,对例程simple_peripheral是不是要删去相关的语句?

在从机中添加适当的条件来实现这一点,例如在属性写入回调函数中检查 CCC 的值,根据需要启用通知。

确保从机端的代码中,CCC 属性的默认值设置为禁止通知。
从机端,在属性写入回调函数中添加逻辑来检查主机是否写入了 CCC 属性,如果检测到主机写入了 CCC 属性,则在这时启用通知。

,

Wei Pan:

下面是我分析的从机发送数据的过程,首先是再一个周期事件当中,从机先读出char3的数据再将数据写入到具有notify属性的char4中 接着从这个simpleprofile_setparameter这个函数中发现有一个判断,就是看notify有没有打开,我理解就是如果打开了就调用了simpleprofile_ReadAttrCB这个回调函数 最后这个读回调的函数就是将数据传递到消息指针当中

 不知道我分析的有没有问题?

现在我应该具体怎么做,能从代码上给点知道吗,实在不行,你写一个处理的框架,我好参考一下,可以?

,

Yolande Wang:

根据您的描述,您的分析基本正确的。

以下是一个简单的框架,演示了从机在周期事件中读取数据并发送通知的过程:

void periodicEventHandler(void)
{// 从char3中读取数据uint8_t dataFromChar3 = readDataFromChar3();// 将数据写入到char4中writeDataToChar4(dataFromChar3);// 检查notify是否打开if (isNotifyEnabled()){// 调用回调函数,将数据传递到消息指针中simpleprofile_ReadAttrCB();}
}void simpleprofile_ReadAttrCB(void)
{// 读取char4中的数据uint8_t dataFromChar4 = readDataFromChar4();// 将数据传递到消息队列中sendNotification(dataFromChar4);
}

,

Wei Pan:

Yolande Wang 说:确保从机端的代码中,CCC 属性的默认值设置为禁止通知

感谢你之前的回答,还有这个CCC默认属性值我在那里能够看到

,

Yolande Wang:

在从机设备的固件代码中,重点看下属性配置部分。

,

Wei Pan:

是在sysconfig中有配置还是在从机工程(simple_peripheral)的simple_gatt_profile.c中的属性表中?抱歉没找到CCC的默认属性值

,

Wei Pan:

我在上面的writeattrcb函数中看到有关于

 case GATT_CLIENT_CHAR_CFG_UUID:分支下的

GATTServApp_ProcessCCCWriteReq       这个函数是不是处理主机对从机进行ccc写操作的请求,之后在下面的函数中判断ccc属性是不是修改了

现在给我的感觉就是这个GATTServeApp_ProcessCharCfg()的判断默认就是真,直接就是打开,按理说主机端没有进行CCC写操作时,这个判断应该是假,不会触发simpleProfile_ReadAttrCB这个函数

,

Wei Pan:

或者说示例工程就是周期性发数据,主机其实是使用的监听功能

,

Yolande Wang:

有关更多详细信息,您可以参阅以下内容::https://dev.ti.com/tirex/content/simplelink_cc2640r2_sdk_5_30_00_03/docs/blestack/ble_user_guide/html/ble-stack-3.x/gatt.html

SimpleLink Academy Training: https://dev.ti.com/tirex/explore/node?node=A__AGoGmWjxwKBGDmIc87YAAw__com.ti.SIMPLELINK_ACADEMY_CC2640R2SDK__7unKOT8__LATEST

,

Wei Pan:

关于上述的问题,我始终不知道问什么,主从机的代码我都查过,没发现在哪写了CHAR4的CCC属性值,你们能再提供一些帮助吗

,

Yolande Wang:

上面回复的链接您仔细看过了吗?

,

Wei Pan:

已经浏览过,主要介绍如何添加一个新的char的步骤,并没有发现可以解决我的疑惑的内容

,

Yolande Wang:

您可能需要重新梳理一下逻辑。

Wei Pan 说:主机端没有对从机端进行CCC的属性值写操作,却能直接收到从机的notify数据。

直接使用例程simple_central接收数据试试

赞(0)
未经允许不得转载:TI中文支持网 » LAUNCHXL-CC26X2R1: 主机工程不写CCC的属性值却收到从机的notify
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1