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



CC2640R2   IAR

请问通过GATT_Notification 发送数据,如果知道数据实际已经发送到主机端,以便下一次调用?

我这边有大量的数据需要发送,如果发送过快就会出现蓝牙重启的问题。如何实现这个功能呢?

  • 1. Notification发送到主机端是沒有ack的,不會知道数据实际是不是已经发送到主机端

    2. 蓝牙重启的问题,這個通常都是有memory leak

  • 你好,非常感谢你的答复。

    uint16_t Retstatus = SUCCESS;
    bStatus_t Sendstatus = SUCCESS;
    attHandleValueNoti_t Char2_Noti;

    if(INVALID_CONNHANDLE == connHandle)
    {
    return INVALIDPARAMETER;
    }
    if(SIMPLEPROFILE_CHAR2 == Param)
    {
    Retstatus = GATTServApp_ReadCharCfg(connHandle, simpleProfileChar2Config);
    if(Retstatus & GATT_CLIENT_CFG_NOTIFY)
    {
    Char2_Noti.pValue = GATT_bm_alloc(connHandle, ATT_HANDLE_VALUE_NOTI, len, NULL);
    if(Char2_Noti.pValue != NULL)
    {
    Char2_Noti.handle = simpleProfileAttrTbl[5].handle;
    Char2_Noti.len = len;
    memcpy(Char2_Noti.pValue, pValue, len);
    Sendstatus = GATT_Notification(connHandle, &Char2_Noti, FALSE);
    if(Sendstatus != SUCCESS)
    {
    GATT_bm_free((gattMsg_t *)&Char2_Noti, ATT_HANDLE_VALUE_NOTI);
    }
    }
    else
    {
    //GATT_bm_free((gattMsg_t *)&Char2_Noti, ATT_HANDLE_VALUE_NOTI);
    Sendstatus = FAILURE;
    }
    }
    }
    return Sendstatus;

    我还有几个问题请教:

    1.距离比较远的环境下    调用  GATT_Notification 时,有时候会返回0x16,这个返回值代表什么呢?

    2.这种情况下,我GATT_bm_alloc申请的缓冲区,是否需要我释放?

  • 1. 0x16 是blePending,代表notification送不出去

    2.用完的缓冲区都要释放

  • 你好,谢谢!
    我还有问题请教下,
    我们这测试时,在与苹果手机进行通信是,距离稍微远的条件下,
    发现这样的问题。
    1.蓝牙从机发送的数据,苹果手机接收会出现丢包现象,
    监控数据可以得到:蓝牙从机定时150ms发送的5帧数据,苹果手机接收的数据帧与帧的时间间隔有时候会达到1.5秒,甚至更长。
    2.如果第1次调用notification 发送数据,数据没有没有发送完成,又调用第2、第3次,会出现什么情况?
    3.如果多次调用notification发送数据,数据还没有实际发送成功,然后一直调用GATT_bm_alloc 会不会出现memory leak 导致的重启?
    因为我发现近距离下,不会出现重启,但是只要距离远(只要不通信,就不会断连),多次调用notification发送数据,就会出现断连甚至重启的现象。
  • 1. 試著降低connection interval

    2. 應該就是會出現blepending

    3. 一直调用GATT_bm_alloc 不free可能会導致memory 不足而重启

  • GATT_bm_alloc ();
    GATT_Notification(connHandle, &Char2_Noti, FALSE);
    GATT_bm_free();

    像这样,我申请缓冲区,调用GATT_Notification发送数据,然后马上释放(GATT_bm_free)
    我发现可以发送出去。

    1. GATT_Notification 函数中 是否也会申请缓存,存放数据。
    2. 是否有办法查看是否还有缓存可以申请,然后在去申请(以避免memory leak导致的重启)?