我们目前正在开发一个连接到BLE设备(由我们开发)的Linux(运行最新的Debian Jessie的RasPi)上的应用程序 . 这个工具已经从bluez(5.46)堆栈中的cherry-picking文件演变而来,并在顶部添加了一个应用程序层 . 除了连接速度非常慢之外,这一切都很有效 . 从我们工具的输出中,我了解到需要交换大量消息来传达GATT服务和特征,并且每个消息都需要一个连接时间间隔 . 由于它是低功率器件,我们希望连接间隔相对较高,因此需要高延迟 .
当连接Android BLE扫描仪时,我看到(在设备端)BLE扫描仪将连接间隔操作为较低值,获取所有请求的数据,然后将连接间隔设置回其原始值 . 请注意,顺便说一句,BLE扫描仪和我们的Bluez派生应用程序都没有考虑首选连接参数 .
现在我想让我们的应用程序执行相同的操作:将连接间隔设置为8ms,获取有关特性和服务的所有信息,并重新设置连接间隔 . 在Bluez堆栈中,我甚至在HCI层中找到了一个很好的函数:hci_le_conn_update .
但现在面临的挑战是:应用程序的其余部分是 Build 在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 回答
在官方dbus API中,没有方法可以更改连接参数 . (见https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/gatt-api.txt和https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt) . 因此,关键是从外围侧发送连接参数更新请求 . 您当然可以尝试发送原始的hci命令,但这有点"hacky"并且无法保证不会弄乱BlueZ守护程序 .
如果您想讨论BlueZ的功能,例如连接参数更新请求api,您应该在BlueZ邮件列表(http://www.bluez.org/contact/)而不是这里进行 .