咨询关于GATT_Notification()的一点小问题
大家好,以下是我使用GATT_Notification的做法:
uint16 ConnHandle;
attHandleValueNoti_t Notify;
GAPRole_GetParameter( GAPROLE_CONNHANDLE, &ConnHandle );
Notify.handle = UartServiceAttTbl[2].handle;//特征值对应的handle
Notify.len = UartRxLen;//特征值的长度
osal_memcpy(Notify.value,UartRxData,UartRxLen);//特征值的数据
GATT_Notification(ConnHandle,&Notify,FALSE);
我使用Andriod上位机与Keyfob通信,每次都要上位机先使能Notification之后才会收到通知的数据。
但是当我使用USBDongle与Keyfob通信时,即使未使能Notification,也能监听到Keyfob发送通知数据。如下
[74] : <Rx> - 10:53:06.421
-Type : 0x04 (Event)
-EventCode : 0xFF (HCI_LE_ExtEvent)
-Data Length : 0x1B (27) bytes(s)
Event : 0x051B (ATT_HandleValueNotification)
Status : 0x00 (Success)
ConnHandle : 0x0000 (0)
PduLen : 0x15 (21)
Handle : 0x0025 (37)
Value : 01:02:04:00:00:00:00:00:00:00:00:00:00:00:00:00:
00:00:00
Dump(Rx):
04 FF 1B 1B 05 00 00 00 15 25 00 01 02 04 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00
问题1:从机使用GATT_Notification发送通知时,不论主机有没有使能Notification,从机都可以发送通知,对吗?
问题2:主机使能Notification只是决定对从机发送的通知要不要处理,对吗?
问题3:如果不是的话,要怎么理解呢?求解~~~
Thanks
看来这个帖子要沉了啊...0.0
为什么....
为什么..
shaokai,
1. 不对。 做的好的逻辑的话,主机没有使能你从机的notification,从机不应该发notification出去。这是蓝牙协议栈的规定。请你检查一下你的Android代码,肯定有地方设置了按键notification的使能。TI默认的keyfob代码是不能在主机没法使能之前发送按键请求的。
2. 不对。从机要听从主机的使能安排。主机要确定从机是否能发送notification.
3. 这是逻辑问题,涉及两边的通信握手协议,数据交互的流程,保证数据通信的过程正确,主机能收到想要的数据。
Yan:
不好意思,有点让你误解了:
1. 我说的Keyfob其实不是Keyfob的工程代码,而是Keyfob开发小板,真正使用的工程代码是我在simpleBLEPeripheral基础上进行修改过的——从机不管主机有没有使能Notification,都调用GATT_Notification();
2. 按您所提议的:从机要听从主机的使能安排(主机没有使能你从机的notification,从机不应该发notification出去),这一点以后我会注意。
3. 我很想知道:
在主机未使能从机Notification时,而从机发送Notification的情况下。
从理论上 链路层还是会发送信号的,对吗?只是这不符合双方的握手协议,也不应该这么做!
Thanks
shaokai,
关于3, 是的!
Thanks Yan
第一个问题 不对 没有通知功能的 不会发送的
第二个问题 使能通知 是为了接收特性值啊
那第三个也就解决了啊
请不要只光看1楼的问题,留意下后面的回答撒~
你好,请问一下你在android平台上与ble连接的吞吐量达到多少啊?我的好慢啊,利用android开放的api如何操作能达到最大传输速度?谢谢
Android与BLE传输的吞吐量没有具体是测过。这个主要取决于传输间隔,不过BLE本身不太适合做大数据的传输,尤其是要求传输速度快的。
Android上我也找不到能修改参数的API,貌似是底层决定的。
Hi,Yan
在使能Notification时,已经得到char4的句柄,该句柄+1得到CCC句柄,但是写入失败,对BLE还不是很熟
Shaokai,
请教:
我使用如下代码发送UUID4的通知给手机,我的手机端为什么总是收不到UUID4的NOTICE更新值(0或1)呢?
代码如下:
uint16 ConnHandle;
GAPRole_GetParameter( GAPROLE_CONNHANDLE, &ConnHandle );
attHandleValueNoti_t noti;
noti.handle = 0x2E; //特征值UUID4对应的handle0x2E, 试过地址0x2F, 0x30也不行的
noti.len = 1;
noti.value[0] = loginStatus; // 0 or 1
GATT_Notification( ConnHandle, ¬i, FALSE );
Hi tan,
我现在遇到了和你一样的问题,请问你解决了么?
Callon Huang,
问题搞定了,其实TI的例子里面有这个函数,如下:
”SimpleBLEPeripheral“ 项目下,
仔细看看文件"simpleBLEPeripher.c" 里面的函数
static void performPeriodicTask( void ) { },将读取到的UUID3的内容换成你自己定义的一个变量的值就可以了。
然后,Enable "performPeriodicTask()" in SBP_PERIODIC_EVT process for UUID4 notification(Dev_resp) sending(every 5s) ,
This function is very great to this project!!!!!
APP一定要勾选UUID4页面里面那个“NOTIFICATION”复选框 。
祝你好运!
我的QQ: 2330708905