简短的问题:是否有可能在定期连接到某些设备并且读取特征a)时扫描LE设备[一般是协议是否允许]和b)使用BlueZ堆栈?
很长的问题:我正在编写一个Python脚本来扫描广告某个UUID的LE设备。如果找到一个,我们应该连接,读取特定的特征值(调用此ValueA
),然后断开连接。我们的想法是保持ValueA
存在的实时列表。我希望能够生成一个启动LE扫描的线程,并将广告事件收集到一个线程安全的容器中。发现新设备时,应触发处理程序以读取ValueA
。
我使用PyBluez和BluePy(连接外围设备)的努力失败了。当我使用终端命令(sudo hcitool lescan --duplicates
和sudo gatttool -I
后跟连接和读取命令)时,如果我在开始扫描后尝试连接(扫描中止),则这些命令会失败
我很困惑,因为我注意到如果我在开始LE扫描之前通过gatttool
连接到设备,我可以启动扫描并继续阅读ValueA
而不会影响扫描,但反之亦然。
任何见解或良好的BlueZ编程文档将不胜感激。在Ubuntu 14.10 Macbook Pro上使用BlueZ 4.1
答案 0 :(得分:3)
我最近没有检查过,但我不认为PyBluez可以做BLE。
在扫描时尝试连接的问题是某些硬件发生的已知问题。这是某些硬件特有的问题。基本上你需要停止扫描,建立你的L2CAP / GATT连接,然后重新开始扫描......或购买一个没有问题的不同的加密狗。
我在Python中用BLE完成的所有工作都是模仿Python中hcitool
和gatttool
的作用。这很不幸,但是还没有BLE(我知道的)那个BLE。这是一个可以帮助您入门的代码段:Finding Bluetooth low energy with python
或者,您可以使用它提供的DBUS界面与Bluez进行交互。不过,我被告知您无法与不属于蓝牙配置文件的属性进行互动。 (因此,您可以与使用心率配置文件的BLE设备进行交互,但不能从加速度计读取值)
编辑:似乎 现在是GATT的一个库:https://pypi.python.org/pypi/gattlib