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接收数据试试