This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

咨询关于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, 是的!

  • 第一个问题 不对  没有通知功能的 不会发送的

    第二个问题  使能通知 是为了接收特性值啊

    那第三个也就解决了啊

  • 请不要只光看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, &noti, 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