我们目前正在linux上开发一个应用程序(a.o.raspi运行最新的debian jessie),它连接到一个ble设备(由我们开发)。这个工具是从bluez(5.46)堆栈中挑选文件并在上面添加应用程序层发展而来的。这一切都很好地工作,除了事实上,连接是令人难以置信的缓慢。从我们工具的输出中,我了解到需要交换一卡车消息来传达关贸总协定的服务和特性,而每一个都需要花费一个连接时间间隔。由于它是一个低功耗设备,我们希望连接间隔相对较高,因此延迟较高。
当连接到android ble scanner时,我看到(在设备端)ble scanner将连接间隔控制为一个较低的值,获取所有请求的数据,然后将连接间隔设置回其原始值。请注意,顺便说一下,无论是ble scanner还是我们的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的应用程序中更新连接间隔。在一定范围内,我不介意我怎么去那里。有什么建议吗?
最佳答案
在官方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命令,但这有点“老套”,无法保证不会弄乱bluez守护进程。
如果您想讨论bluez的特性,比如连接参数更新请求api,那么应该在bluez邮件列表(http://www.bluez.org/contact/)上而不是在这里进行讨论。
关于linux - 在基于Bluez的面向GATT的应用程序中更改连接间隔,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45737594/