【问题标题】:How do I send a long notification with Bluez, example?例如,如何使用 Bluez 发送长通知?
【发布时间】:2016-05-14 01:00:00
【问题描述】:

我需要从我的 Linux 设备上的 Bluez 5.37 向手机发送一个长通知(比如说 10Kb)。

我的实现基于src/shared/gatt-server.c

我在 Bluez 中找不到这样的示例。 src/shared/gatt-server.cbt_gatt_server_send_notification() 严格将数据包修剪为 MTU-1 并丢弃其余部分。我必须为此需要一个输出队列,例如gatt-client.cbt_gatt_client_read_long_value() 看起来像是我需要的一个示例,但对于长特征读取。

  1. 有没有办法发送与大多数蓝牙 4.0 安卓手机兼容的长通知?它requires a bit of collaboration on the phone side - sending a ATT_READ_BLOB_REQUESTS,AFAIS。
  2. 或者是否有通用的打包库可以处理 20 字节大小的数据包?
  3. 我能想到的另一种方法是创建另一个特征,将通知消息用于短消息,呃,通知“嘿,有一条长消息,从该特征读取它”。

哪种方式更好?是否存在这三种方式中的任何一种的示例?

【问题讨论】:

    标签: bluetooth bluetooth-lowenergy bluez


    【解决方案1】:

    我无权披露代码,但这是我所做工作的基本想法。我使用tools/bgatt-server.c 作为外围设备的基础。

    发送长消息:

    • 将正在发送的notification_buffernotification_position 保存在server 的字段中;
    • gatt-server.c 中实现bt_gatt_server_send_notification_with_callback() 函数。它应该与bt_gatt_server_send_notification() 做同样的事情,但有额外的void *user_databt_gatt_server_destroy_func_t destroy 参数,并将它们传递给bt_att_send()。当 bluez 输出队列空闲时,这会将 destroy 回调的下一次调用排入队列。
    • 实现一个bt_gatt_server_destroy_func_t,它计算从服务器的notification_buffernotification_position字段发送的下一个块,用bt_gatt_server_send_notification_with_callback()发送它们,并将server作为user_data传递给destroy回调.

    在接收端重组消息:

    • 我使用自己的分包器/解包器拆分长消息。
    • 我使用了一个标头:1 个字节 - 数据包的 messageId 和 2 个字节的 packetId - 这样一来,消息的长度可以达到 17*65536 字节。此外,这为将来重新请求数据包以实现可靠交付提供了机会。

    【讨论】:

      【解决方案2】:

      我是为 Bluez 做的:

      PRLOG("Send Notify, %d bytes\n", send_len);
      do {
        if (RPService.valid) {
          send_res = bt_gatt_server_send_notification (pCharac->server->gatt, pCharac->handle,
                                                           pTx, mMIN(send_len, mBLE_TRANSFER_SIZE));
        } else {
          break;
        }
        if (send_res) {
          pTx += mBLE_TRANSFER_SIZE;
          send_len -= mBLE_TRANSFER_SIZE;
        } else {
          PRLOG("  Notify write failed...wait\n");
          usleep(mTX_WAIT);
        }
      } while (send_len > 0);
      

      【讨论】:

      • 谢谢!换句话说,您发送多个通知并且线程将被阻塞,对吗?您发送了多长时间的数据?您是否尝试在发送 10k 通知的同时接收消息?
      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 2020-11-27
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2016-12-20
      • 1970-01-01
      相关资源
      最近更新 更多