2015-04-03 50 views
3

简短问题:是否可以扫描LE设备,同时定期连接某些设备并读取特性a)一般情况下[协议是否允许]和b)使用BlueZ叠加么?BlueZ/Pybluez - 连接到外围设备时进行蓝牙LE扫描

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

我的努力使用PyBluez和BluePy(连接到外设)失败。当我使用终端命令(sudo hcitool lescan --duplicatessudo gatttool -I其次是连接并读取命令),这些失败,如果我尝试后,我开始扫描连接(扫描中止)

我很困惑,因为我发现,如果我连接到设备通过gatttool开始LE扫描之前,我可以启动扫描并继续阅读ValueA而不影响扫描,但反之亦然。

任何见解或良好的BlueZ编程文档,将不胜感激。在Ubuntu 14.10上使用BlueZ 4.1 Macbook Pro

回答

3

我最近没有检查过,但我不认为PyBluez可以做BLE。

您在扫描时试图连接的问题是某些硬件发生的已知问题。这是特定于某些硬件的问题。基本上,您需要停止扫描,进行L2CAP/GATT连接,然后重新开始扫描......或者购买不存在该问题的其他加密狗。

我在Python中使用BLE所做的所有工作一直是模仿Python在Python中做什么hcitoolgatttool。这是不幸的,但是没有任何图书馆(我知道)能够执行BLE。这里有一个代码片段可以帮助你开始:Finding Bluetooth low energy with python

另外,你可以使用它提供的DBUS接口与Bluez进行交互。不过,我被告知,您不能与不属于蓝牙配置文件的属性进行交互。 (所以,你可以与使用心脏速率曲线一个BLE设备进行交互,而不是读取加速度计的值)

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

+0

啊,所以蓝牙规范中没有任何东西可以排除这种情况发生。你有没有成功使用特定的加密狗,或者是否有我可以搜索的此功能的名称?你使用的是什么版本的BlueZ,4.x或5.x?另外,对于外设,我已经使用[bluepy](https://github.com/IanHarvey/bluepy)来发现服务和读取特性。 – thegeebe 2015-04-08 18:44:06

+0

好吧,它没有在标准中规定,所以它取决于硬件制造商。 Iogear GBU521能够在连接时继续扫描。我从中国获得的廉价(很可能是假的)CSR没有能力。你基本上只需要测试一下就可以知道。如果您希望自己的代码稳定可靠,则可以在尝试连接时暂时关闭扫描,然后在建立连接后再打开它。 – 2015-04-08 18:50:12

+0

相关提示;我也在使用中国的廉价CSR。谢谢! – thegeebe 2015-04-08 18:57:18