Macos 使用PyQt5.QtBluetooth扫描蓝牙设备

Macos 使用PyQt5.QtBluetooth扫描蓝牙设备,macos,bluetooth,qt5,pyqt5,Macos,Bluetooth,Qt5,Pyqt5,我正在尝试使用PyQt5(5.11.3)来使用QtBluetooth API扫描蓝牙设备 设备发现API被列为我的平台(macOS 10.14.2)支持的API,我可以做其他与蓝牙相关的事情,例如获取主机控制器的地址和已连接设备的列表地址 这里有一个尝试,每当检测到新设备、发生错误或扫描完成时,都会设置回调(Qt术语中的插槽?)。此外,计时器还打印出扫描当前是否处于活动状态,以及迄今为止发现的任何设备的列表 虽然我的错误回调从未被触发,计时器总是打印出扫描处于活动状态,并且我的系统日志显示蓝牙控

我正在尝试使用PyQt5(5.11.3)来使用QtBluetooth API扫描蓝牙设备

设备发现API被列为我的平台(macOS 10.14.2)支持的API,我可以做其他与蓝牙相关的事情,例如获取主机控制器的地址和已连接设备的列表地址

这里有一个尝试,每当检测到新设备、发生错误或扫描完成时,都会设置回调(Qt术语中的插槽?)。此外,计时器还打印出扫描当前是否处于活动状态,以及迄今为止发现的任何设备的列表

虽然我的错误回调从未被触发,计时器总是打印出扫描处于活动状态,并且我的系统日志显示蓝牙控制器处于扫描模式,但我没有看到任何设备。我知道我至少应该看到一些

#!/usr/bin/env python
import signal
import sys

from PyQt5 import QtBluetooth as QtBt
from PyQt5 import QtCore


class Application(QtCore.QCoreApplication):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.scan_for_devices()
    self.exec()

  def display_status(self):
    print(self.agent.isActive(), self.agent.discoveredDevices())

  def foo(self, *args, **kwargs):
    print('foo', args, kwargs)

  def scan_for_devices(self):
    self.agent = QtBt.QBluetoothDeviceDiscoveryAgent(self)
    self.agent.deviceDiscovered.connect(self.foo)
    self.agent.finished.connect(self.foo)
    self.agent.error.connect(self.foo)
    self.agent.setLowEnergyDiscoveryTimeout(1000)

    timer = QtCore.QTimer(self.agent)
    timer.start(500)
    timer.timeout.connect(self.display_status)

    self.agent.start()


if __name__ == '__main__':
  import sys
  app = Application(sys.argv)


C++示例对我的系统起作用,尽管:

它是一个已知的但似乎(似乎是)未被证明的问题,MQOS上的QT。背景是。通常,macOS上的

QtCoreApplication
使用Qt自己的事件循环。但是macOS上的蓝牙框架需要CoreFoundation事件循环,在创建
QtCoreApplication
实例之前,可以像这样激活该循环:

if sys.platform == 'darwin':
    os.environ['QT_EVENT_DISPATCHER_CORE_FOUNDATION'] = '1'
或者,您可以改为子类
QtWidget.QApplication


不幸的是,这会导致Python进程出现停靠图标。我还没有找到隐藏它的方法。

在运行代码时,我得到了很多设备。似乎对我有用…@Isma你能告诉我你在哪个平台上运行它吗?