2017-08-17 73 views
1

我们目前正在研究连接到BLE设备(由我们开发)的Linux上的应用程序(运行最新的Debian Jessie的a.o. RasPi)。该工具已经从bluez(5.46)堆栈的樱桃采摘文件发展而来,并在顶部添加了一个应用程序层。除非连接速度非常慢,否则这一切都可以很好地工作。从我们的工具的输出中,我了解到需要交换大量消息来沟通GATT服务和特征,并且每个消息都需要一个连接时间间隔。由于它是低功耗设备,我们希望连接间隔相对较高,因此延迟时间较长。在基于Bluez的GATT导向应用程序中更改连接间隔

当与Android BLE扫描器连接,我看到(在设备侧),该扫描仪BLE操纵连接的时间间隔为一个低的值,得到所有的请求的数据,然后设置连接间隔返回到其原始值。请注意,顺便提一下,BLE扫描仪和我们的Bluez衍生应用程序都不会考虑优先连接参数。

现在我想让我们的应用程序执行相同的操作:将连接间隔设置为8ms,获取有关特征和服务的所有信息,并设置连接间隔。在Bluez堆栈中,我甚至在HCI层找到了一个很好的函数:hci_le_conn_update。但现在面临的挑战是:应用程序的其余部分建立在GATT功能的基础之上,即使BLE规范定义了这两者之间的层次结构(其间有一些层次),但在代码中它们似乎完全独立于每个其他。

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

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

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

+0

它已经有一段时间了,事实证明我们完全错误地接近了这一点。我们现在指定连接间隔时间在8-500毫秒之间,让客户弄清楚。我们担心这会非常低效,因为我们认为MCU必须每个连接间隔至少唤醒一次。事实证明这是不正确的(BLE堆栈在我们可以进入睡眠状态时提供用于发信号的回调),并且如果客户端决定连接间隔例如49,那么我们仍然很好(足够)。 –

回答

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命令,但这有点“黑客”,并且没有保证不会弄乱BlueZ守护进程。

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

相关问题