我需要在我的Linux设备上将Bluez 5.37的长(例如10Kb)通知发送到手机。
我的实施基于src/shared/gatt-server.c
。
我在Bluez找不到这样的例子。 src/shared/gatt-server.c
,bt_gatt_server_send_notification()
严格将数据包修改为MTU-1并丢弃其余数据包。我必须要有一个输出队列,就像在gatt-client.c
中一样。 bt_gatt_client_read_long_value()
看起来像我需要的一个例子,但是对于长期特征读取。
哪种方式更好?是否存在这三种方式中的任何一种的例子?
答案 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_data
和bt_gatt_server_destroy_func_t destroy
个参数,并将它们传递给bt_att_send()
。当bluez输出队列空闲时,这会将destroy
回调的下一次调用排入队列。bt_gatt_server_destroy_func_t
计算要从服务器的notification_buffer
和notification_position
字段发送的下一个块,使用bt_gatt_server_send_notification_with_callback()
发送,并将server
作为{ {1}}和user_data
回调本身。 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);