【问题标题】:BlueZ/Pybluez - Bluetooth LE scan while connected to peripheralBlueZ/Pybluez - 连接到外围设备时进行蓝牙 LE 扫描
【发布时间】:2015-06-08 20:55:33
【问题描述】:

小问题:是否可以扫描 LE 设备,同时定期连接到一些并读取特性 a) 通常 [协议是否允许] 和 b) 使用 BlueZ 堆栈?

长问题:我正在编写一个 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

【问题讨论】:

    标签: python bluetooth-lowenergy bluez


    【解决方案1】:

    我最近没查过,但我觉得 PyBluez 做不到 BLE。

    您在扫描时尝试连接的问题是某些硬件发生的已知问题。这是特定于某些硬件的问题。本质上,您需要停止扫描,建立 L2CAP/GATT 连接,然后重新开始扫描...或购买没有该问题的其他加密狗。

    我在 Python 中使用 BLE 所做的所有工作都是模仿 hcitoolgatttool 在 Python 中所做的。不幸的是,还没有(据我所知)支持 BLE 的库。这是一个可以帮助您入门的代码 sn-p:Finding Bluetooth low energy with python

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

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

    【讨论】:

    • 啊,所以蓝牙规范中没有任何内容阻止这种情况发生。您是否使用特定的加密狗取得了成功,或者我可以搜索此功能的名称吗?您使用哪个版本的 BlueZ,4.x 还是 5.x?此外,对于外围设备,我使用bluepy 发现服务和读取特征也取得了一些成功。
    • 好吧,标准中没有规定,所以这取决于硬件制造商。 Iogear GBU521 能够在建立连接时继续扫描。我从中国获得的廉价(很可能是假的)CSR 无法做到。您基本上只需要测试即可找出答案。如果您希望您的代码健壮,您可以在尝试连接时暂时关闭扫描,然后在建立连接后重新打开。
    • 很高兴知道;我也在使用来自中国的廉价 CSR。谢谢!
    • 抱歉,错过了您的一个问题...我正在使用 4.101 版本,因为我使用的是 3.4 内核并且无法轻松迁移到更新的内核。 Bluez 5.X 需要更新的内核,但我不记得截止点在哪里。