QBluetoothDeviceDiscoveryAgent Class

QBluetoothDeviceDiscoveryAgent 类可发现附近的蓝牙设备。更多

Header: #include <QBluetoothDeviceDiscoveryAgent>
qmake: QT += bluetooth
Inherits: QObject

公共类型

enum DiscoveryMethod { NoMethod, ClassicMethod, LowEnergyMethod }
flags DiscoveryMethods
enum Error { NoError, PoweredOffError, InputOutputError, InvalidBluetoothAdapterError, UnsupportedPlatformError, …, UnknownError }

公共函数

QBluetoothDeviceDiscoveryAgent(QObject *parent = nullptr)
QBluetoothDeviceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent = nullptr)
virtual ~QBluetoothDeviceDiscoveryAgent()
QList<QBluetoothDeviceInfo> discoveredDevices() const
QBluetoothDeviceDiscoveryAgent::Error error() const
QString errorString() const
bool isActive() const
int lowEnergyDiscoveryTimeout() const
void setLowEnergyDiscoveryTimeout(int timeout)

公共插槽

void start()
void start(QBluetoothDeviceDiscoveryAgent::DiscoveryMethods methods)
void stop()

信号

void canceled()
void deviceDiscovered(const QBluetoothDeviceInfo &info)
void deviceUpdated(const QBluetoothDeviceInfo &info, QBluetoothDeviceInfo::Fields updatedFields)
(since 6.2) void errorOccurred(QBluetoothDeviceDiscoveryAgent::Error error)
void finished()

静态公共成员

QBluetoothDeviceDiscoveryAgent::DiscoveryMethods supportedDiscoveryMethods()

详细说明

用于发现附近的蓝牙设备:

voidMyClass::startDeviceDiscovery() {// 创建一个发现代理并连接其信号   QBluetoothDeviceDiscoveryAgent*discoveryAgent = newQBluetoothDeviceDiscoveryAgent(this); connect(discoveryAgent,SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), this,SLOT(deviceDiscovered(QBluetoothDeviceInfo)));// 启动发现 discoveryAgent->start();//...}// 在本地槽中,读取找到的设备信息voidMyClass::deviceDiscovered(constQBluetoothDeviceInfo&device){
    qDebug() << "Found new device:" << device.name() << '(' << device.address().toString() << ')';
}

要异步检索结果,请连接deviceDiscovered() 信号。要获取所有已发现设备的列表,请在finished() 信号后调用discoveredDevices() 。

该类可用于发现经典和低能耗蓝牙设备。单个设备类型可通过QBluetoothDeviceInfo::coreConfigurations() 属性确定。在大多数情况下,discoveredDevices() 返回的列表包含两种类型的设备。但并非每个平台都能检测到这两种类型的设备。在有这种限制的平台上(例如 iOS 仅支持低能耗设备检测),检测过程将把搜索限制在支持的类型上。

注: 自 Android 6.0 起,检测设备的能力需要 ACCESS_COARSE_LOCATION。

注: Win32 后端目前不支持蓝牙 LE 设备在发现后公布的接收信号强度指示器(RSSI)、制造商特定数据或其他数据更新。

成员类型文档

enum QBluetoothDeviceDiscoveryAgent::DiscoveryMethod
flags QBluetoothDeviceDiscoveryAgent::DiscoveryMethods

该枚举描述了QBluetoothDeviceDiscoveryAgent 所使用的发现方法类型。

常量说明
QBluetoothDeviceDiscoveryAgent::NoMethod0x0无法发现。不支持任何可用方法。
QBluetoothDeviceDiscoveryAgent::ClassicMethod0x01发现过程搜索蓝牙经典(BaseRate)设备。
QBluetoothDeviceDiscoveryAgent::LowEnergyMethod0x02发现过程搜索蓝牙低功耗设备。

DiscoveryMethods 类型是QFlags<DiscoveryMethod> 的类型定义。它存储 DiscoveryMethod 值的 OR 组合。

另请参阅 supportedDiscoveryMethods().

enum QBluetoothDeviceDiscoveryAgent::Error

表示在蓝牙设备发现过程中发现的所有可能的错误条件。

常数说明
QBluetoothDeviceDiscoveryAgent::NoError0未发生错误。
QBluetoothDeviceDiscoveryAgent::PoweredOffError2蓝牙适配器电源已关闭,请在发现设备前打开电源。
QBluetoothDeviceDiscoveryAgent::InputOutputError1写入或读取设备导致错误。
QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError3传入的本地适配器地址与任何本地蓝牙设备的物理适配器地址不匹配。
QBluetoothDeviceDiscoveryAgent::UnsupportedPlatformError (since Qt 5.5)4设备发现在当前平台上无法实现或无法执行。该错误是在调用start() 时设置的。例如,5.0 以下的 iOS 版本完全不支持蓝牙设备搜索。
QBluetoothDeviceDiscoveryAgent::UnsupportedDiscoveryMethod (since Qt 5.8)5当前平台不支持所请求的一种发现方法。
QBluetoothDeviceDiscoveryAgent::LocationServiceTurnedOffError (since Qt 6.2)6定位服务已关闭。位置服务关闭时,无法使用蓝牙 API。
QBluetoothDeviceDiscoveryAgent::MissingPermissionsError (since Qt 6.4)7操作系统请求用户未授予的权限。
QBluetoothDeviceDiscoveryAgent::UnknownError100发生未知错误。

成员函数文档

[explicit] QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(QObject *parent = nullptr)

构建一个新的蓝牙设备发现代理,父代理parent

[explicit] QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent = nullptr)

使用parent 构建一个新的蓝牙设备发现代理。

它使用deviceAdapter 进行设备搜索。如果deviceAdapter 是默认构造,生成的 QBluetoothDeviceDiscoveryAgent 对象将使用本地默认蓝牙适配器。

如果指定的deviceAdapter 不是本地适配器,error() 将被设置为InvalidBluetoothAdapterError 。因此,建议在使用此构造函数后立即测试错误标志。

另请参阅 error() 。

[virtual noexcept] QBluetoothDeviceDiscoveryAgent::~QBluetoothDeviceDiscoveryAgent()

~QBluetoothDeviceDiscoveryAgent() 的销毁函数

[signal] void QBluetoothDeviceDiscoveryAgent::canceled()

当调用stop() 终止设备发现时,将发出该信号。

[signal] void QBluetoothDeviceDiscoveryAgent::deviceDiscovered(const QBluetoothDeviceInfo &info)

info 所描述的蓝牙设备被发现时,就会发出该信号。

一旦收集到最重要的设备信息,就会发出该信号。不过,只要finished() 信号尚未发出,即使是已经发现的设备,信息收集工作也会继续进行。信号强度信息(RSSI)和制造商数据更新尤其如此。如果用例需要持续更新制造商数据或 RSSI,建议在发现结束后通过discoveredDevices() 获取设备信息,或监听deviceUpdated() 信号。

如果lowEnergyDiscoveryTimeout() 大于 0,则只有当info 的至少一个属性发生变化时才会发出信号。这反映了当更精确的信息可用时接收更新的愿望。这种行为的例外情况是lowEnergyDiscoveryTimeout 设置为0 时。0 的超时表示希望监控低能耗设备随着时间的推移出现和消失的情况。在这种情况下,即使info 自上次发出信号以来没有发生变化,也会发出 deviceDiscovered() 信号。

另请参阅 QBluetoothDeviceInfo::rssi() 和lowEnergyDiscoveryTimeout()。

[signal] void QBluetoothDeviceDiscoveryAgent::deviceUpdated(const QBluetoothDeviceInfo &info, QBluetoothDeviceInfo::Fields updatedFields)

当代理收到info 所描述的蓝牙设备的附加信息时,就会发出该信号。updatedFields 标志说明哪些信息已更新。

在发现过程中,有些信息会动态变化,如signal strengthmanufacturerData 。此信号通知您,如果您的应用程序正在显示这些数据,则可以更新这些数据,而不必等到发现过程结束。

另请参阅 QBluetoothDeviceInfo::rssi() 和lowEnergyDiscoveryTimeout()。

QList<QBluetoothDeviceInfo> QBluetoothDeviceDiscoveryAgent::discoveredDevices() const

返回所有已发现蓝牙设备的列表。

QBluetoothDeviceDiscoveryAgent::Error QBluetoothDeviceDiscoveryAgent::error() const

返回最后一个错误。

之前可能出现的错误会在重新启动发现时清除。

[signal, since 6.2] void QBluetoothDeviceDiscoveryAgent::errorOccurred(QBluetoothDeviceDiscoveryAgent::Error error)

当蓝牙设备发现过程中出现error 时,就会发出该信号。error 参数描述了发生的错误。

此函数在 Qt 6.2 中引入。

另请参阅 error() 和errorString()。

QString QBluetoothDeviceDiscoveryAgent::errorString() const

返回最后一个错误的可读描述。

另请参阅 error() 和errorOccurred()。

[signal] void QBluetoothDeviceDiscoveryAgent::finished()

蓝牙设备发现完成时会发出该信号。如果设备发现结束时出现错误,则不会发出该信号。

bool QBluetoothDeviceDiscoveryAgent::isActive() const

如果代理当前正在发现蓝牙设备,则返回 true,否则返回 false。

int QBluetoothDeviceDiscoveryAgent::lowEnergyDiscoveryTimeout() const

返回应用于蓝牙低功耗设备搜索的超时(毫秒)。返回值为-1 意味着平台不支持该属性,设备搜索的超时时间无法调整。返回值为0 意味着搜索永无止境,必须通过stop() 手动停止搜索。

另请参阅 setLowEnergyDiscoveryTimeout()。

void QBluetoothDeviceDiscoveryAgent::setLowEnergyDiscoveryTimeout(int timeout)

设置蓝牙低功耗设备搜索到timeout 的最长搜索时间(毫秒)。如果timeout0 ,则搜索会一直运行到stop() 被调用为止。

这反映了蓝牙低功耗设备的发现过程大多是开放式的。平台会继续寻找更多设备,直到手动停止搜索。超时确保搜索在timeout 毫秒后中止。当然,也可以通过调用stop() 手动终止搜索。

在重新启动设备搜索之前,新的超时值不会生效。此外,超时不会影响传统蓝牙设备搜索。根据平台的不同,传统搜索可能会增加整个搜索过程的时间,超过timeout

要实现可靠的蓝牙低功耗搜索,至少需要 40000 毫秒。

另请参阅 lowEnergyDiscoveryTimeout() 。

[slot] void QBluetoothDeviceDiscoveryAgent::start()

启动蓝牙设备发现(如果尚未启动)。

发现每个设备时,都会发出deviceDiscovered() 信号。设备发现完成后,将发出finished() 信号。发现过程中会使用平台支持的最大发现方法集。

另请参阅 supportedDiscoveryMethods()。

[slot] void QBluetoothDeviceDiscoveryAgent::start(QBluetoothDeviceDiscoveryAgent::DiscoveryMethods methods)

如果蓝牙设备发现尚未启动,且所提供的methods 受支持,则启动蓝牙设备发现。methods 限制设备搜索范围。例如,如果目标服务或设备是蓝牙低功耗设备,则可使用此功能将搜索范围限制在蓝牙低功耗设备上,从而大大缩短搜索时间。

注意: methods 只确定发现类型,并不意味着对结果进行过滤。例如,尽管methods 仅设置为LowEnergyMethod ,搜索结果仍可能包含传统蓝牙设备。出现这种情况的原因可能是以前缓存的搜索结果被纳入了搜索结果。

[slot] void QBluetoothDeviceDiscoveryAgent::stop()

停止蓝牙设备发现。一旦取消设备发现,就会发出 cancel() 信号。start()可能会在收到取消信号之前被调用。一旦start() 被调用,之前发现的取消信号将被丢弃。

[static] QBluetoothDeviceDiscoveryAgent::DiscoveryMethods QBluetoothDeviceDiscoveryAgent::supportedDiscoveryMethods()

此函数返回当前平台支持的发现方法。它可用于限制设备发现的范围。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.