7个职位/ 0个新职位
最后发表
songsayit
离线
最后看到:3年10个月前
加入:2016-05-31 35
关于写通知使能问题

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

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

设备:
Gongyu_Dialog
离线
最后看到:1周22小时前
加入:2016-04-27 07:07
1 .这个BAS_IDX_BATT_LVL_NTF

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

songsayit
离线
最后看到:3年10个月前
加入:2016-05-31 35
这个BAS_IDX_BATT_LVL_NTF

这个BAS_IDX_BATT_LVL_NTF_CFG是用于使能通知的配置属性——我单独请教你这个吧。

1.在sdk5.0的文件bass_task.c的343行的gattc_write_cmd_ind_handler,
从代码可以看的出,他必须要对BAS_IDX_BATT_LVL_NTF_CFG进行写,才能使bass_env。特性[我]| = BASS_FLAG_NTF_CFG_BIT;
然后在电池定时轮询中,也是在bass_task.c的276行的bass_batt_level_upd_req_handler中,他会去检查是否启用通知,代码如下:
//检查是否启用了通知
如果(bass_env。特性[param - > bas_instance] & BASS_FLAG_NTF_CFG_BIT)
= = BASS_FLAG_NTF_CFG_BIT)

//通过GATT发送通知
prf_server_send_event ((prf_env_struct *) &bass_env假,
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在安卓机上测试,和用LightBlue应用在苹果机上测试,但是他都没有收到GATTC_WRITE_CMD_IND。

Gongyu_Dialog
离线
最后看到:1周22小时前
加入:2016-04-27 07:07
以lightblue为例,界面上有监听

以lightblue为例,界面上有听通知。来回点击,就可以看到配置了相应通知使能的属性。我在函数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)

.......
//如果stop或notification的值为enable,则只更新配置
if ((ntsf_cfg == PRF_CLI_STOP_NTFIND) || (ntsf_cfg == PRF_CLI_START_NTF)) / / ntsf_cfg == PRF_CLI_START_NTF)

arch_printf(“ntf_cfg 0 x % \ n”,ntf_cfg);//添加的打印
//在DB中设置NTF Cfg值
attmdb_att_set_value (bass_env。shdl[i] + BAS_IDX_BATT_LVL_NTF_CFG, sizeof(uint16_t),
(uint8_t *) &ntf_cfg);
....

songsayit
离线
最后看到:3年10个月前
加入:2016-05-31 35
@Gongyu_Dialog,谢谢您。

@Gongyu_Dialog,谢谢您帮我。

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

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

Gongyu_Dialog
离线
最后看到:1周22小时前
加入:2016-04-27 07:07
但是用TI的TI Sensortag测试是不行的。

但是用TI的TI Sensortag测试是不行的。估计android的祝福这一块没有做全面吧。
/ /可以用嗅探工具看看有没有对相应的属性做操作

songsayit
离线
最后看到:3年10个月前
加入:2016-05-31 35
恩.我抓包看看.谢谢

恩.我抓包看看.谢谢