BlueZ/Pybluez - 连接外设时进行蓝牙LE扫描

5

简短问题:在一般情况下[协议是否允许]和使用BlueZ堆栈的情况下,是否可以定期连接到某些LE设备并读取特征?

长问题:我正在编写一个Python脚本来扫描广告某个UUID的LE设备。如果找到一个,我们应该连接,读取特定的特征值(称之为ValueA),然后断开连接。想法是维护实时列表中存在哪些ValueA。我希望能够生成一个线程,开始LE扫描并将广告事件收集到线程安全容器中。当发现新设备时,应该触发处理程序以读取ValueA

我使用PyBluez和BluePy(连接到外设)的努力失败了。当我使用终端命令(sudo hcitool lescan --duplicatessudo gatttool -I,然后连接和读取命令)时,如果我尝试在开始扫描后连接,则会失败(扫描中止)

我感到困惑,因为我注意到如果我在开始LE扫描之前通过gatttool连接到设备,我可以启动扫描并继续读取ValueA而不影响扫描,但反之则不行。
如有任何见解或良好的BlueZ编程文档,将不胜感激。在Ubuntu 14.10 Macbook Pro上使用BlueZ 4.1。
1个回答

5

我最近没有检查过,但我认为PyBluez不能进行BLE。

您在尝试连接时扫描的问题是某些硬件出现的已知问题。这是特定于某些硬件的问题。基本上,您需要停止扫描,建立L2CAP / GATT连接,然后重新开始扫描...或购买一个没有该问题的不同的dongle。

我在Python中所做的所有与BLE相关的工作都是模仿hcitoolgatttool在Python中的操作。不幸的是,还没有(我知道的)可以进行BLE的库。这里有一段代码片段,可能会帮助您入门:使用python找到蓝牙低能耗设备

或者,您可以使用Bluez提供的DBUS接口与其交互。不过,我被告知您无法与不属于蓝牙配置文件的属性进行交互。 (因此,您可以与使用心率配置文件的BLE设备交互,但无法从加速度计读取值)

编辑:似乎现在有一个GATT库:https://pypi.python.org/pypi/gattlib


啊,那么蓝牙规范中没有任何限制阻止这种情况发生。您是否成功使用了某个特定的转接器?或者有没有这个功能的名称我可以搜索?您使用的是 BlueZ 的哪个版本,4.x 还是 5.x?此外,对于外设,我使用 bluepy 工具来发现服务并读取特征值,效果还不错。 - thegeebe
好的,标准中没有具体规定,因此取决于硬件制造商。Iogear GBU521能够在建立连接时继续扫描。我从中国买的廉价(很可能是假的)CSR就不能这样做。基本上你只需要测试一下就可以了。如果你想让你的代码更加健壮,你可以在尝试连接时暂时关闭扫描,然后在建立连接后再开启它。 - Tim Tisdall
很好知道,我也在使用来自中国的廉价CSR。谢谢! - thegeebe
抱歉,我错过了你的一个问题...我正在使用4.101版本,因为我正在使用3.4内核,无法轻松地转移到更新的内核。Bluez 5.X需要更新的内核,但我记不清截止时间在哪里了。 - Tim Tisdall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接