cc2541 协议栈1.4.1,主机端接收不了通知问题
hi:各位大侠,Ti工程师们
最近遇到一个主机端接收不到从机的通知问题,从机是使用的1.4.0协议,每800ms从特征值4发送16个字节的通知(从机端应该没有问题)
主机端我用1.4.0协议栈里面的center工程是可以收到的,具体做法:在发现到服务的回调函数中,定时1s后开任务打开通知的开关。打开通知开关的具体方法:是向句柄为0x2f 中写0x0001,具体代码如下:
//开启notify的CCC
attWriteReq_t req;
req.handle = 0x2f;
//req.handle = GUA_CHAR4_CCC_Hdl; //char4的CCC的特征值句柄,这里写死0x2F,可通过btool获取到
req.len = 2;
req.pValue[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY); //0x0001为开notify
req.pValue[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);
req.sig = 0;
req.cmd = 0;
GATT_WriteCharValue( 0, &req, simpleBLESwitch_TaskID );
OLED_ShowString(0,6,"open-noti");
以上的在 1.4.0里的center工程中是可以实现的,主机端可以接受到通知,sniffer 抓包结果是这样的:
但是在1.4.1的center工程中,同样的代码,却接收不到通知,抓包的结果是:上图中标蓝箭头的那条写请求没有,
是我没有写成功吗?
GATT_WriteCharValue( 0, &req, simpleBLESwitch_TaskID );是这个方法没有写成功吗?但是我查过返回值是 = success 的
另外要向 句柄为0x2f 这个开关里面写值 有什么前提吗?
我在sniff看到的 F4特征值的句柄确实是 0x2e,查资料上也是说CCC开关 的句柄只要+1就可以了,
哪里出错了,求教大侠?
另外我从机用的是128bit 的uuid,这个会有影响吗?
这个图是1.4.1接不到通知的抓包
请问您在1.4.0上也是用的128bit的UUID吗?
如果是自己修改UUID为128bit,也要修改读写操作的回调函数这样才可以正确执行读写操作哦
你是说主机中,读写的回调函数吗?
目前我在从机端 自己打开了 通知属性的开关,主机端是可以接收数据了
是peripheral这端的service里面的
simpleProfile_ReadAttrCB
simpleProfile_WriteAttrCB
这两个要根据128bit做更改
从机中,读写的回调函数都已经做了128bit的更改,而且从机与lightblue 的读、写、通知都很正常
那就是因为API的更改,所以需要根据porting guide来修改原来的代码,以下是guide请参考
http://processors.wiki.ti.com/index.php/LPRF_BLE_Porting_Projects
嗯,谢谢,我研究下,
另外,你有1.4.0协议栈主从切换的demo工程吗?我就是想做一个主从切换的功能,没有找到1.4.0协议栈的demo,用1.4.1的才出现这么多问题
这个没有的,而且推荐在最新的1.4.1的版本上来做。
嗯,现在是在1.4.1上改的,
又遇到一个问题,我是在从机端自己打开的通知开关,主机端连接后是可以接受到数据了,但是只能前30多秒钟有(从机是连接上后 每800ms 发送一个通知),30多秒后,主机端事件处理函数都触发不了了,连接也没断开。抓包来看,确实有通知数据从 从机发出来
这个函数没触发,
抓包却有通知数据,这是什么情况?
您好
建议您先根据porting guide将代码更新一下后再看
嗯,好的,谢谢!
刚刚那个主机端30s后接不到消息,找到原因了,是因为指针没有释放,在消息处理函数的最后面没有加
GATT_bm_free( &pMsg->msg, pMsg->method );
加上就好了