在基于Bluez的面向GATT的应用程序中更改连接间隔

时间:2017-08-17 14:16:22

标签: linux bluez gatt hci

我们目前正在开发一个连接到BLE设备(由我们开发)的Linux(运行最新的Debian Jessie的RasPi)上的应用程序。此工具已从bluez(5.46)堆栈中的cherry-picking文件演变而来,并在顶部添加了一个应用程序层。这一切都很好,除了连接速度非常慢。从我们工具的输出中,我了解到需要交换大量消息来传达GATT服务和特征,并且每个消息都需要一个连接时间间隔。由于它是一个低功耗器件,我们希望连接间隔相对较高,因此延迟很高。

当连接Android BLE扫描仪时,我看到(在设备端)BLE扫描仪将连接间隔操作为较低值,获取所有请求的数据,然后将连接间隔设置回其原始值。请注意,顺便说一句,BLE扫描仪和我们的Bluez派生应用程序都没有考虑首选连接参数。

现在我想让我们的应用程序执行相同的操作:将连接间隔设置为8ms,获取有关特征和服务的所有信息,并重新设置连接间隔。在Bluez堆栈中,我甚至在HCI层中找到了一个很好的函数:hci_le_conn_update。

但现在面临的挑战是:应用程序的其余部分是建立在GATT功能之上的,即使BLE规范定义了这两者之间的层次结构(中间有一些层),在代码中它们看起来完全相互独立。

hci_le_conn_update函数有两个特定于HCI的参数:'dd'(文件描述符到设备)和'handle'(一些标识连接的值)。 hcitool告诉我,当我创建连接时,第一个句柄是64,所以我尝试使用该值。对于'dd',我使用hci_dev_open来获取设备的文件描述符。这很有效。排序。

正如我之前所说,最小/最大值并未完全考虑在内。因此,当我将其设置为6/10时,我得到11,当我将其设置为6/50时,我得到60.这对我的品味来说有点太不确定了,我更喜欢直接改变连接间隔的函数给出一个大多数被忽略的范围。此外,我必须使用硬编码的魔法数字64给我一个不好的痒。我实际上可以控制嵌入式设备端的连接间隔,但我希望控制器位于客户端应用程序的一侧。

目标是更新基于Bluez-GATT的应用程序中的连接间隔。在一定限度内,我并不介意我如何到达那里。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在官方dbus API中,没有更改连接参数的方法。 (参见https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/gatt-api.txthttps://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt)。因此,关键是从外围侧发送连接参数更新请求。你当然可以尝试发送一个原始的hci命令,但这有点" hacky"并且无法保证不会弄乱BlueZ守护程序。

如果您想讨论BlueZ的功能,例如连接参数更新请求api,您应该在BlueZ邮件列表(http://www.bluez.org/contact/)上而不是在这里进行。