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.
我现在在主机工程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是不是要删去相关的语句?希望解答的细致一点
您好,
在正常的 BLE 连接中,当主机连接到从机时,通常会执行以下步骤:
1.主机向从机发出请求以读取或写入特定属性的值。
2.从机根据主机的请求做出回应。
3.如果启用了通知、指示,从机在其属性值发生变化时会主动发送通知、指示给主机。
您现在的情况可能就是由于从机的默认设置导致的,使其在连接建立后自动发送通知,而无需主机执行写操作。
如果我想是主机写入CCC的属性后才触发从机的notify,对例程simple_peripheral是不是要删去相关的语句?
在从机中添加适当的条件来实现这一点,例如在属性写入回调函数中检查 CCC 的值,根据需要启用通知。
下面是我分析的从机发送数据的过程,首先是再一个周期事件当中,从机先读出char3的数据再将数据写入到具有notify属性的char4中
接着从这个simpleprofile_setparameter这个函数中发现有一个判断,就是看notify有没有打开,我理解就是如果打开了就调用了simpleprofile_ReadAttrCB这个回调函数
最后这个读回调的函数就是将数据传递到消息指针当中
不知道我分析的有没有问题?
现在我应该具体怎么做,能从代码上给点知道吗,实在不行,你写一个处理的框架,我好参考一下,可以?
根据您的描述,您的分析基本正确的。
以下是一个简单的框架,演示了从机在周期事件中读取数据并发送通知的过程:
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); }
是在sysconfig中有配置还是在从机工程(simple_peripheral)的simple_gatt_profile.c中的属性表中?抱歉没找到CCC的默认属性值
我在上面的writeattrcb函数中看到有关于
case GATT_CLIENT_CHAR_CFG_UUID:分支下的
GATTServApp_ProcessCCCWriteReq 这个函数是不是处理主机对从机进行ccc写操作的请求,之后在下面的函数中判断ccc属性是不是修改了
现在给我的感觉就是这个GATTServeApp_ProcessCharCfg()的判断默认就是真,直接就是打开,按理说主机端没有进行CCC写操作时,这个判断应该是假,不会触发simpleProfile_ReadAttrCB这个函数