如何向Bluez发送长通知,例如?

时间:2016-02-04 12:07:46

标签: bluetooth bluetooth-lowenergy bluez

我需要在我的Linux设备上将Bluez 5.37的长(例如10Kb)通知发送到手机。

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

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

  1. 有没有办法发送与大多数蓝牙4.0 Android手机兼容的长通知?它是requires a bit of collaboration on the phone side - sending a ATT_READ_BLOB_REQUESTS,AFAIS。
  2. 或者是否有一个通用的打包库,可以处理20字节大小的数据包?
  3. 我能想到的另一种方法是创建另一个特征,使用短消息的通知消息,呃,通知“嘿,有一条很长的消息,从那个特征中读取它”。
  4. 哪种方式更好?是否存在这三种方式中的任何一种的例子?

2 个答案:

答案 0 :(得分:2)

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

发送长信息:

  • 保存正在发送的notification_buffer,将notification_position保存在server的字段中;
  • bt_gatt_server_send_notification_with_callback()中实施gatt-server.c功能。它应该与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作为{ {1}}和user_data回调本身。

要在接收端重新组合消息:

  • 我用自己的打包器/拆包器拆分了长消息。
  • 我使用标头:1个字节 - 数据包的destroy和2个字节的packetId - 这样,一个可以有长达17 * 65536字节的消息。此外,这使我们有机会在将来重新请求数据包以便可靠交付。

答案 1 :(得分:1)

我是为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);