关于写Notify使能问题

你好. 我这边在看bass_task.c源码时, 发现他gattc_write_cmd_ind_handler函数里要去操作notify的东西. (BAS_IDX_BATT_LVL_NTF_CFG)
这个使能Notify是由手机端传来的, 但是 我这边测试时, 发现在上层已经使能Nofity的时候, 他不会回调gattc_write_cmd_ind_handler函数.
我一开始以为是GATTC_WRITE_CMD_IND这个命令的过, 我换成了其他的WRITE CMD 也是不行. 这个是怎么回事呢?
GATTC_WRITE_CMD 和 GATTC_WRITE_CMD_IND 有啥差别的呢?

另外, sdk好像也无法获取read 回调函数. 这个是因为sdk不支持read的吗?

  • 1.这个BAS_IDX_BATT_LVL_NTF_CFG是用于使能notify的配置属性。
    2.server端发送notify/indication的消息,通常调用的是函数prf_server_send_event
    3. GATTC_WRITE_CMD 和 GATTC_WRITE_CMD_IND 这两个的差别在于消息的方向不一样,前者是发往GAPC层;而后者是GAPC层收到远端来写属性的动作,发消息通知APP层去处理
    4.远端读属性的操作,直接在GAPC层就被处理了(相关的代码被封装,SDK里看不到),不会通知APP层。

  • 这个BAS_IDX_BATT_LVL_NTF_CFG是用于使能notify的配置属性 --- 我单独请教你这个吧.

    1. 在sdk5.0的文件bass_task.c的343行的gattc_write_cmd_ind_handler,
    从代码可以看出, 他必须要对BAS_IDX_BATT_LVL_NTF_CFG进行写, 才能使 bass_env.features[i] |= BASS_FLAG_NTF_CFG_BIT;
    然后在电池定时轮询中, 也是在bass_task.c的276行的bass_batt_level_upd_req_handler中, 他会去" Check if notifications are enabled" , 代码如下:
    // Check if notifications are enabled
    if((bass_env.features[param->bas_instance] & BASS_FLAG_NTF_CFG_BIT)
    == BASS_FLAG_NTF_CFG_BIT)
    {
    // Send notification through GATT
    prf_server_send_event((prf_env_struct *)&bass_env, false,
    bass_env.shdl[param->bas_instance] + BAS_IDX_BATT_LVL_VAL);
    }

    2. 所以他必须要收到 GATTC_WRITE_CMD_IND, 并且是对BAS_IDX_BATT_LVL_NTF_CFG的写.
    我就是在测试的时候, 发现他无法收到GATTC_WRITE_CMD_IND.
    测试方式是: 用TI Sensortag apk在android机上测试, 和用LightBlue app在苹果机上测试, 但是他都没有收到GATTC_WRITE_CMD_IND.

  • 以lightblue为例,界面上有Listen for notification。来回点击,就可以看到配置了相应Notification使能的属性。我在函数gattc_write_cmd_ind_handler里面添加的打印如下
    static int gattc_write_cmd_ind_handler(ke_msg_id_t const msgid,
    struct gattc_write_cmd_ind const *param,
    ke_task_id_t const dest_id,
    ke_task_id_t const src_id)
    {
    .......
    // Only update configuration if value for stop or notification enable
    if ((ntf_cfg == PRF_CLI_STOP_NTFIND) || (ntf_cfg == PRF_CLI_START_NTF))
    {

    arch_printf("ntf_cfg is 0x%x\n",ntf_cfg); //添加的打印
    // Set NTF Cfg value in the DB
    attmdb_att_set_value(bass_env.shdl[i] + BAS_IDX_BATT_LVL_NTF_CFG, sizeof(uint16_t),
    (uint8_t *)&ntf_cfg);
    ....

  • @Gongyu_Dialog, 谢谢您帮我.

    我这边原来是用breakpoints来测试, 发现不行. 然后我把arch_printf用uart来打印. 按照您的方式测试, 用lightblue测试是可以的. 但是用TI的TI Sensortag测试是不行的. 估计android 的ble这一块没有做全面吧.

    PS: 奇怪的是 arch_console只实现打印输出, 没有实现输入. 我还重新写了输入的函数.

  • 但是用TI的TI Sensortag测试是不行的. 估计android 的ble这一块没有做全面吧.
    //可以用sniffer工具看看有没有对相应的属性做操作