7帖/ 0新
最后一篇
songsayit
离线
最后一次露面:3年10个月前
加入:2016年5月31日13: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
离线
最后一次露面:5天14小时前
加入:2016年4月27日07:07
1.这个BAS_IDX_BATT_LVL_NTF

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

songsayit
离线
最后一次露面:3年10个月前
加入:2016年5月31日13: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.features [I] | = BASS_FLAG_NTF_CFG_BIT;
然后在电池定时轮询中,也是在bass_task.c的276行的bass_batt_level_upd_req_handler中,他会去 “检查是否启用通知”,代码如下:
//如果启用通知检查
如果((bass_env.features [param-> bas_instance] BASS_FLAG_NTF_CFG_BIT)
== BASS_FLAG_NTF_CFG_BIT)
{
通过关贸总协定//发送通知
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
离线
最后一次露面:5天14小时前
加入:2016年4月27日07:07
以lightblue为例,界面上有监听

以lightblue为例,界面上有听通知。来回点击,就可以看到配置了相应的通知使能的属性。我在函数gattc_write_cmd_ind_handler里面添加的打印如下
静态INT gattc_write_cmd_ind_handler(ke_msg_id_t常量MSGID,
结构gattc_write_cmd_ind常量* PARAM,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
.......
//只更新配置如果停止或通知值启用
如果((ntf_cfg == PRF_CLI_STOP_NTFIND)||(ntf_cfg == PRF_CLI_START_NTF))
{

arch_printf( “ntf_cfg就是0X%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年5月31日13:35
@Gongyu_Dialog,谢谢您。

@Gongyu_Dialog,谢谢您帮我。

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

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

Gongyu_Dialog
离线
最后一次露面:5天14小时前
加入:2016年4月27日07:07
但是用TI的TI Sensortag测试是不行的。

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

songsayit
离线
最后一次露面:3年10个月前
加入:2016年5月31日13:35
恩。我抓包看看。谢谢

恩。我抓包看看。谢谢