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