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.

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

Part Number: LAUNCHXL-CC26X2R1
Other 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是不是要删去相关的语句?希望解答的细致一点

  • 您好,

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

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

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

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

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

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

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

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

  • 下面是我分析的从机发送数据的过程,首先是再一个周期事件当中,从机先读出char3的数据再将数据写入到具有notify属性的char4中



    接着从这个simpleprofile_setparameter这个函数中发现有一个判断,就是看notify有没有打开,我理解就是如果打开了就调用了simpleprofile_ReadAttrCB这个回调函数



    最后这个读回调的函数就是将数据传递到消息指针当中






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

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

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

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

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

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

     case GATT_CLIENT_CHAR_CFG_UUID:分支下的

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

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

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

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

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

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

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

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

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

x 出现错误。请重试或与管理员联系。